Saturday, May 10, 2008

Intermission

Part 5 of the Pinocchio Function: The Amazing Technicolor Dreamcode is in the process of being authored, but it's taking a little longer than expected, and I thought I would share with you the reason for that, and just give a little update on my adventures.

I recently changed positions and became a key executive officer for a new company targeting females in games: GirlGamer.com

The people I'm working with have become my fast best friends, and the mix of interpersonal relationship building combined with the dizzyingly fast pace of the work that needs to be accomplished has found me de-prioritizing almost all of my prior commitments with the two notable exceptions of my success coaching, and my work in evolutionary computational domains. We're rapidly nearing a point where we will have a lot more to talk about, which is terribly exciting, as well as being an absolute schedule hog, but I'm not adverse to giving up a few months worth of weekends in order to make something real come about.

I also recently found myself in Washington DC for a week with a team of what I can only describe as domain experts and highly qualified specialists establishing longer term prospects (maybe even years away) that are both extremely promising, and of a sensitive nature, so details I will not reveal here. Sufficient to say I am deliriously happy about my career opportunities, but it has required me to do some serious scrambling to make it all work, and I'm finally finding myself with some minutes which are not otherwise occupied by initiatives which I have carefully staggered to minimize the time to realization... and I'm using it to blog about it all before it becomes old news.

Watching Saving Private Ryan again, just on a whim because it was on, reminded me of the intensity of my own situation and how often the skills that I learned largely while gaming play an intricate role in my life as I manage short term strategies and leverage resources, micro and macro, to produce foundations which give rise to larger structures and bring the long term plan closer to fruition.

It also reminded me that I need to play video games and de-stress more, because I miss it. So right now rather than finish Part 5, I'm going to go rock my face off with Rock Band on my 360. ~\o I'm a creep! I'm a wierd-o. What the hell am I doing here? I don't belong here... o/~ Radiohead has nothing on me baby!

Saturday, April 12, 2008

The Pinocchio Function, Part 4: Two Steps Forward, Two Parts Chaos

The story I'm telling here is true. The dates are approximate and the events are summarized, but I'm not making this shit up. This is part four of the recap of the story so far. You can find part 1 here, part 2 here, and part 3 here.

The path before me was clear. I needed to restep down this lonely path of code and reshape my vision to conform to their reality if I was ever going to get their reality to conform to my vision.

So I did. I spent several late nights coding an evolutionary computational engine, which the specific details of the architecture will not be disclosed here for numerous reasons. Sufficient to say that the first night I got it going and solving problems was nothing short of elating, despite the fact that the problems it was solving were trivial. It really didn't matter: I had succeeded in harnessing nature's wisdom of tapping evolution as a process by which order comes out of chaos, and I'd done it by standing on the shoulders of giants who came before me.

And like the aforementioned giants must have at some point, I ran into glass ceilings; a point after which you can see there's further onward to go, but cannot escape your present confines to advance. For me these ceilings presented themselves in what can basically be described as a lack of biodiversity, because even as my understanding and the resulting complexity of the code base grew, I kept running into the same problem: The code would evolve to the point it's fitness function agreed it should evolve to, and then stop. This is analogous to a goldfish growing to the size of it's bowl, and what I realized was that I needed to stop treating the thing like a goldfish.

If life really were to evolve from with a digital landscape, it would be the resulting emergent behavior that happens when you have lots and lots of biodiversity co-evolving on a shared landscape, not one goldfish growing to the size of it's bowl. In fact the landscape would need to support an ever increasing amounts of biodiversity AND increasing population sizes.

The other thing that I realized is that intelligence and life itself provides it's own fitness function, because that which is more capable of applying intelligence to it's existence is by definition better at surviving, and that this is especially true when we're talking about organisms co-evolving on a competitive landscape. This is a gross oversimplification of the real process, but the underlying logic is sound in that emergent behaviors provide their own set of challenges to be overcome by individuals in a population. What this means is that simply by subjecting an evolving process to evolutionary competition with another evolving process you end up with co-evolving processes which should impose new evolutionary challenges as a result of being in competition with each other.

In other words if you create a landscape which is increasingly expansive and find a way to populate it with organisms which are capable of evolution and put them in competition with each other for survival, evolution will do it's task of enforcing that only changes which are beneficial to survival continue.

The idea actually came to me when watching videos of other evolutionary computational engines running with the fitness function removed. These runs would often display the most extraordinary examples of what can only be described as evolutionary epochs as these little programs first discovered ways to dominate the landscape and then began competing with each other, each successive generation displaying increasingly aggressive behavior as swarms of similarly colonies of code swept across the landscape, in turn displaying increasingly complex behavior to enhance it's survival prospects.

It would start simply, with just whatever was fastest at propagating, and soon one variation of code would dominate the landscape. But eventually something that didn't replicate over code that was like itself mutated into existence, and this proved to be better because it was able to replicate with greater consistency than it's inferior parents and it would soon dominate. And then something which attacked code which checked it's neighbor took over because once again it was better at survival. And this process kept repeating and repeating until a few very virulent strains were all that survived, forever locked in this war of constantly overwriting each other as fast as their virtual CPU's would allow them.

But from looking at the resulting code when I did this on my own, I didn't get this right away. Because each simulation consists of a very large number of CPU's executing in parallel all networked together it was the interaction between them that gave rise to what was most interesting. I kept on looking at things from the perspective of what a CPU is doing, and what code it was executing, like we do now with computers. But what I realized was that this was not really a useful way to envision what was happening at all, and instead I needed to follow the code as it replicated from CPU to CPU.

And this turned out to be an interesting problem indeed! Little did I know the life and death of a piece of evolving code would hold the key to my understanding of the Pinocchio Function.

Coming up in part 5: Amazing Technicolor Dreamcode

Labels: , , , , , , , ,

Tuesday, April 08, 2008

The Pinocchio Function, Part 3: Standing On The Shoulders Of Giants

The story I'm telling here is true. The dates are approximate and the events are summarized, but I'm not making this shit up. This is part three of the recap of the story so far. You can find part 1 here, and part 2 here.

Tom Barbalet of Biota.org once said in a podcast, "The Artificial Life industry doesn't exactly have founding fathers so much as dead beat dads.", mostly due I think out of his frustration with getting the early pioneers of the industry on his podcast.

But that isn't to say they didn't leave a legacy.

The first in a long series of breakthroughs came for me when I met an evolutionary biologist who was also a computer hacker. Adam is a genius of a rare sort, both incredibly insightful and well versed, while also possessing a genuine passion and ability to make rubber meet road and write code. He spent one night, hoarse and unable to speak from a very bad cold, literally whispering passionately in my living room until the wee hours of night about how biology worked like a possessed Mozart composing his dying symphony, and I dutifully made down notes in my head about the scientific processes of evolution, and their applications with genomes and ribosomes and chromosomes and how nature basically accomplished it's miracle.

You see he knew what he was doing: He was Prometheus stealing the secrets of life from mother nature and giving them to the masses in a form they could understand. That knowledge genie had been out of the bottle for a long time... I just never properly understood how it really worked.

Adam sure did though. He had made his own version of some earlier work that was explicitly headed down that path by trying to find emergent properties in evolutionary systems in things he called a "Nanopond", similar to "Avida" or "Tierra".

I studied the code for these a bit, and often found them to be again full of assumptions, and brittleness in the design which made them very hard to change. But when I ran them, something was very obvious: These guys had figured out how to make code behave more like life. Of course just undergoing evolutionary processes towards a static fitness goal still isn't going to produce something that springs forth and declared "I'm REAL!" of it's own violation, because eventually you reach the "best" solution for that fitness function. What I was really impressed with was the way these programs brought a very specific order from a stream of chaos in what clearly was a very novel and effective way.

These programs were designed to solve problems by evolving solutions for them. All you had to do what define for it what it was supposed to accomplish, and it will use an evolutionary process to arrive at the solution.

Someone had beat me to the punch on the Program Understanding Program, and I have to say I was never more excited about an idea for code than when I learned someone else had figured out what had eluded me for so long. Finally my idea could actually get legs and move forward!

And move forward it did. I took my new found knowledge, and I set about applying it to my own passion.

I studied Tierra and found that while there were things that I really liked about it like the evolvable instruction set, it really had a more singular focus of trying to find one specific solution, or one set of code that would always solve the given problem.

I studied Avida-ED but saw that it was just a beginning at what I had envisioned, and really wasn't meant to support more emergent behavior than what could live beyond a simple "petri dish" model.

So I started hacking away in C++, like all those before me had, chasing that elusive idea of creating a living organism by supplying the Pinocchio Function to something so complex that it actually could produce an emergent behavior as complex as life itself.

Coming up in part 4: Two Steps Forward, Two Parts Chaos

Labels: , , , , , , ,

Tuesday, April 01, 2008

Cyberpunks go Rampaging

Sindome, a cyberpunk roleplaying game (http://www.sindome.org) has turned into a Zombie game for April Fools. Citizens of the city are battling hoards of their own dead bodies with katanas, mini guns, grenades and even severed limbs! Log on and get your Zombie killing in before its over!

read more | digg story

Wednesday, March 26, 2008

The Pinocchio Function, Part 2: The Program Understanding Program

The story I'm telling here is true. The dates are approximate and the events are summarized, but I'm not making this shit up. This is part two of the recap of the story so far. You can find part 1 here.

I was, at the time, a fledgling programmer: full of vim and vigor, and capable of producing ten times the code that I produce now-a-days. I worked everywhere they would pay me, and did a lot of teaching myself on the job. In fact my first programming position I knew zero about the language I was hired to write in, but that's a different story for another blog post.

It was more or less at the height of the dot-com bubble that I overheard a friend of a friend talking about their idea at a wedding reception in Los Vegas (Jim and Michael M, if you read this I mean you) for a "Program Understanding Program", or more to the point a program that could fix bugs in other programs. He even had a model for it all worked out, which revolved around a programmer defining a fitness function for when the code was working vs. when it was broken ( a unit test ). Thus the role of the programmer changed from defining the path to take to get to the end result by supplying the code to do so, to the role of defining the expected end result and allowing the computer to find the path there.

On the surface, this seemed quite intuitive. We are often in the habit of moving from a concept to a design to a finalized product, all he was doing was shortcutting the design process and going directly from defining the concept to the finalized product and letting the computer figure out the design.

Of course the devil lies in the details, because a Photoshop mockup of a web page just isn't sufficient to properly express all the complex behavior that actually has to go into the end result. However when you applied this at a more modular level, like individual pieces of functionality, the prospects looked rather good.

And so I set about understanding how I would go about building such a thing, with the idea in mind that if I was able to crack this nut, that might in turn lead to a more complex understanding of how life might be born within a pure digital context. And the more I thought about it, the more I came to understand the nature of such a complex thing, and why it would be rather tricky to make work, and in fact I really didn't see the entire path there yet. So this left me with a challenge, one I felt I could overcome by becoming a better computer scientist. I admitted to myself that this was in fact a long term project, and placed it firmly on the top of my list of thing to do before I die, realizing that it would be much later in my life before I was able to even write the first lines of code, and I set about learning the things that I would need to learn.

I studied programming methodologies like object oriented programming and aspect oriented programming. I learned as many programming languages as I could and even invented a few of my own that are still in active production today. I became an expert in telecommunication networks, the most recent of which is the internet. I ate up papers about multi-tape Turing machines and nondeterministic finite state machines with a passion. I joined the security exploit community and became a professional white-hat hacker and amateur theoretical mathematician. I put my self to sleep each night with books and websites on electronics, physics, math theory, computing theory, game theory, set theory, behavioral theory, and linguistic theory. I made games and later even wrote game engines. I stole my father's tools from his toolkit and taught myself how to wire circuits together from the examples given in those 124-in-1 kid's electronic kits. I learned how to program micro controllers from a friend and build entirely custom devices (yet another story for another day). I dove head first into the state of the art in artificial intelligence and neural networks, cellular automata and the game of life, fuzzy logic, machine learning and classifier systems, genetic algorithm optimizations and genetic programming, white boxes, gray codes and black ICE. In short, I embraced my geekiness.

What I found was a lot of science and very little dreams. Neural networks worked great as a classifier system, but nobody figured out how to make them work even nearly as well as a simple animal's brain, let alone approach the complexity of a human. OpenCyc had figured out how to make machines deduce AND infer information, but only when supplied with a highly specific form of context, often anthropomorphic and ultimately utilitarian in nature. They couldn't actually "think" for themselves, or apply the deduced/infered information to any application other than the one of extrapolating more information. And while this is a critical process that we as humans replicate with ease, it doesn't actually supply the computer with that all important Pinocchio Function which makes it go from static machine to evolutionary system.

Somewhere in there I got married and had a kid too, and this overshadowed my early ambitions of creating groundbreaking technology and solving the programmers of the world's problems as the need to devote more time and energy to my family was of much greater importance to me. This of course required doing things like taking well paying jobs writing mundane code, but the idea never left me. I would still think about it often in passing, and remember spending a few nights really thinking about how I would ever get to write what by now had become a pet project for me, my version of the Program Understanding Program, or just PUP.

I sat on the idea, but I never let it go. It was always that thing that I would do later when I understood more. And then I stopped programming for a while and focused on running my own business instead. The dream seemed further away, but still I never gave up on the idea.

At some point I must have realized that it had become -the- beacon for my inspiration. Every time I wrote a piece of code, there was a small part of me that was doing it because I was just practicing my skills for when I could really do what I wanted to do, which sure wasn't this code monkey bullcrap the spiky haired boss was asking me to write when I knew full well that code wasn't going anywhere. Every time I explored another faucet of computer science there was always that glimmer of hope that if I just put another piece of the puzzle together, I would figure it out and be able to unlock the boundless potential that I had glimpsed at as a young adult. Every day where I worked at a job and money wasn't enough to get me through the day and I missed my family, I would console myself by stealing away to read an article on the latest breakthrough in mathmatics, and lose myself in formulas that I only now begin to catch a glimpse of the meaning, and even that is primitive. Every job itself was another vehicle for me to continue my quest.

Was I ambitious? I'd like to think so.

Was I a dreamer? Yeah. No doubt.

Was I fooling myself in thinking that such a quest could ever be embarked upon? Was this just supreme arrogance on my part to think that I, a self taught hacker, could unlock the secrets to such concepts when the people who clearly were much better and brighter than I had stumbled and failed?

I often times found myself questioning that very thing. Pragmatism is such a necessary evil when you have a life worth keeping up that dreams become things that must be maintained if they are to not fall into disuse. Dreams came and went, often dashed by realities too harsh to recall frequently, but this one persisted.

It persisted for 9 years, as I grew the mental model and learned all I could about it. It would show up on occasion in failed code experiments that got lost through the annuls of time and bit-decay. It would get talked about any time someone showed interest in such fields. It would puzzle me constantly in idle moments when I was seeking a mental challenge, and my understanding of what I was after was constantly growing, constantly evolving in my mind as I came to understand more and more about everything I could find that I deemed applicable. But alas, always something was missing, something just beyond my grasp yet tantalizingly present on the horizon.

The piece that was missing was that Pinocchio Function. I could write code, and develop complex systems with my eyes closed. But a system that could write itself, and develop an even more complex system than itself... I just couldn't see the path there.

Not yet.

Coming up in Part 3: Standing On The Shoulders of Giants

The Pinocchio Function, Part 1: Puppetery for Deities

Finally I've engaged with someone who has thought enough about the subject of ethics of creating artificial lifeforms to address my concerns regarding the nature of my research to allow me to continue. Finally I am satisfied that what I am doing isn't reckless and irresponsible, but actually exciting and cutting edge. And so the story can finally be told.

The story I'm about to tell you over the next few blog posts is true. The dates are approximate and the events are summarized, but I'm not making this shit up.

About 9 years ago I read a book for the first time called, "Ender's Game" about a boy who played games, and the blurred line between fiction and reality that existed for him. The story was compelling if purely science-fiction, and the impact of the surprise ending stayed with me long after I had finished reading it. It is of course this book after which I named my blog.

But this isn't the story of me reading that book, rather it's the story of me reading it's less beloved sequel, "Xenocide", or rather it's the story of the impact that book had on me.

You see it's not a particularly good book (the first one was much better) but I read them all quite facinated with some of the concepts.

In Xenocide the human race has colonized much of the universe, a feat made possible by relativistic travel, and a Faster Than Light communication network who's lag was not proportionate to distance: Electronic communication was truly instant. The proposed technology behind these modes of travel and this communication network were great fodder for my overactive imagination and my future career goals (time traveler comes to mind), but what REALLY fascinated me was what happened with this communications network.

As a result of the highly complex and lag-free nature of this network, somehow an emergent behavior arose. This emergent behavior was honed over time by the forces of evolution and natural selection until at one point after millions of years of operation this emergent behavior developed self-motivation, intelligence, and eventually self-awareness: The network became alive. Now the way this was presented in the book it was an undeniable conclusion, but it got me to thinking about why it wouldn't work in the real world. And in fact I was able to come up with a lot of good reasons why it wouldn't, namely that machines and networks don't naturally exhibit processes of natural selection and evolution, and someone would have to go really out of their way to make them do so.

In fact the very way we architect our machines and networks is completely antithetic to the very processes that would need to occur for such conditions to come about; the moment our machines and networks fail to perform in exactly the way we have specified, we declare them broken and tend to do things like shut them down. The entire process of engineering basically precludes the unknown and unspecified from creeping into the design, or at least all the engineers I know would tend to agree. This leaves no room for experimentation and trial an error, let alone an evolutionary process.

The major exception is of course evolutionary computation engines and fuzzy machine learning systems like neural networks. But even these appear to have limited utility as they are ostensibly and irrevocably tied to their fitness functions, and therefore only as complex as their engineered design. I suppose you could in theory apply a genetic optimization algorithm to the configuration of a neural network interspersed with training to arrive at the optimal configuration for a given fitness function, but you haven't fundamentally broken away from that fitness function.

And so the problem becomes one of defining the ultimate fitness function... The Pinocchio Function: That which would evolve in complexity as the system evolved, thus eventually leading to it becoming a real evolving life form, indistinguishable from any other like it except in chemistry and biology. Such an system has a lot of very attractive properties, the least of which is the eventuality that something intelligent and self-aware should at least in theory eventually emerge from it if left to run long enough.

Thus my journey down the path to creating Artificial Life began, over 9 years ago.

...

Coming in part 2: The Program Understanding Program.

Labels: , , , , , ,

Monday, March 24, 2008

Community::Next HERE I COME!!!

Almost as quickly as it began it's ended. An old friend who I've not spoken with enough recently has pledged an enormous amount of the remainder, and secured his vicarious presence at the event. I've done recommendations of his work before, and will be sure to pimp his extraordinary service the entire time I'm there.

A HUGE thank you to the enormous outpouring of support from my friends. I can't believe how many people crawled out of the woodwork to help me out.

Really looking forward to seeing everyone at Community::Next! And if you can make it to Mindshare this Thursday, that would be fantastic, since I'll be speaking there as well.

Sunday, March 23, 2008

Community::Next or Bust!

Community::Next is happening in my backyard, and about 60 of my industry friends are going. I REALLY want to go, but am having trouble coming up with the admission fee, so I've set up a Fundable page to take pledges in exchange for some marketing. If your far away and not able to make it, this would be a cheap way to get your brand talked about at the event by a super networker!

So be a pal and chip in, and if you do let me know what brand you want pimped, or even better send me some promotional material to hand out.

Thanks a ton!!! I love you guys...

Labels: ,