Well, here are my notes from the several days on AI:
If there's one topic I keep being drawn back into, it's AI. I may
leave it for a bit, but it continues to intrigue me. I think I should
just stick with it.
My biggest problem is that I want to work with all subfields of AI. I
need to narrow it down, especially now that I'm thinking of getting a
PhD. I need to do some research, and then write a paper or three. I
should also start a blog on my subfield. Maybe even a tutorial for
the more practical portions. A write paper? I need to show that I
can write the dissertation and do research.
What I want to do the most with AI is to create a digital personal
assistant. Unfortunately, this is very close to a true AI. It also
touches upon nearly all of the most difficult AI problems. This could
very well be a lifetime's work in a world of constantly changing
Do I want to spend the rest of my lifetime on this? I think so, but
I've been shying away from it in the past. Maybe it's time. I'll
have to cut back dramatially on the gaming, though I think that the
recent theft was enough for that.
This is going to be a LOT of work. Granted, that's kind of assumed
when I said it would take a lifetime. I think the most difficult part
will be deciding where to start. I need to work on my understanding
of the problem as well as my programming skills. I'm still thinking
C#, just to have all of those libraries.
It's really going to come down to the architecture I create, though.
And that will be based on some of the philosophical choices I make.
Looks like I need to read up on the practical philosophical concepts
that will affect me, software architecture, AI architecture, and basic
What is my end goal? As of right now, I want software that can
converse intelligently through a multitude of interfaces, shows a
distinct personality that develops from its interaction with the world
and user, and learn over time.
Right now, I'm thinking of a server/client architecture, having the
program's knowledge base on a server, so it can continuously be
updated. All data learned about the user would remain on the client,
and would intentionally difficult to get from the server. The
program's personality would also be on the client, but would
occasional send the data back for R&D.
There would be an issue with quality of knowledge. There would have
to be assurances that all knowledge in the knowledge base would be
fact, not opinion. All entries would be verified by Quality Control
personnel, a random person chosen for each entry. This nearly
eliminates potential collaboration to insert biases.
Upgrading clients would be fairly easy. Personalities and local data
could be backed up locally before an upgrade.
We would need servers to hold the distributed knowledge base. And we
would need entry points in order to insert, verify, modify, and remove
knowledge. And we would have to monitor the consequences of adding
contradictory knowledge. OpenCyc might give us more information on
how to handle that.
Josh raises a good point. How do we represent the knowledge? There
are various methods, but each has a weak spot, usually a type of
knowledge that cannot be represented. One idea that I sent back to
Josh is that we allow the program to create its own encoding. We can
check it by asking for it back, as well as combined data. Knowledge
of all kinds can be represented by a natural language, but that's very
difficult to process. Also, visual and audio input would be a
different format. Very different formats.
What are the requirements for a versitile knowledge representation
encoding, of which natural language is one?
We should probably start with low level and work our way up. Where do
we get knowledge from? This is something I tend to disagree with
Descartes about. He said we cannot trust our senses. I say that we
have no knowledge without our senses. Everything we know can
originally be traced back to one or more sense. Or, rather, percept.
I do agree that much of our basic processing in genetically
programmed, likely through the overall structure of our brains.
So make processing innate, or built into the system. Unfortunately,
we won't know how to process knowledge until we know its structure.
The brain works because the structure evolved to what it is today,
handling very simplistic behaviors long before getting to us.
Would using Lojban help? It's a regular, formal language. Can we
easily translate between Lojban and English? What about a subset of
English that is regular? Do we use the non-regular portions often?
Where am I going with this? Do I want to follow symbolism for
representation? I will be if I use some mathematical or linguistic
Interesting. What about levels of abstraction for representation?
This would fit in with an agent architecture. Communicate within the
system with streams of thought, streams of representation. This fits
in with my flow version of computation. Would need a 'language' of
thought for it. Can I mix this with neural networks? How well would
it work with different inputs? Audio, visual, text, imagination?
Different parts of the brain would handle different bits of
processing. Could simply use distributed computing as well. The
platform listed in Links could be VERY useful here. I can use
different languages for different processing, and let them communicate
with thought streams.
There could be a focus mechanism that allows a primary thought stream
to have the attention. This would allow other streams to persis in
the 'unconscious'. The system would also have to have the ability to
expand it's abstraction system through 'learning'. But how do we
encode the thought streams? And thoughts in memory? Thought should
have the ability to affect how thoughts are affected, as a feedback
loop, meant to improve the system over time.
What can I use from real time system? There's a bit of a time code
involved, tell it what is out of date (and might be dropped) and what
needs to happen now (priority). Can add urgency to priority code (for
humans, a tiger leaping at you is more urgent that reading a book). A
priority code for each thought stream? Constant thought streams for
each sense, or better yet, for each portion of the senses (two ears,
two eyes, etc.).
Each output would have a stream, like nerve pathways to the muscles.
Low level. Would make a much more dynamic avatar. Would we then need
to teach it to talk, move? Maybe a base setup?
As of right now, my system is a distributed, flow-based system. It's
almost like a neural network with feedback loops. This is very
important, as traditional neural nets don't deal with feedback, just
back propagation. This has its uses, but is limited to only setting
weights, not changing flow or the operation of a neuron.
If I have a flow-based system, how will it be structured? I need to
go back to my old flow notes.
Ok, I can't find my old flow notes, yet. I need to figure out where I
recorded them. I think some might be on a Moleskine. I need to
For now, I see individual components within a thought stream
framework. I still need to know how to structure the flow (Lojban
streams??) and how to have components interact with it.
For instance, a vision system would handle the input and some of its
own processing, but then pass the information back via one or more
thought streams. There would be thought streams back to control
attention toward specific objects (for more detailed processing) and
for moving the camera (like moving the eyes).
What about Lojban for flow structure? This would be useful for speech
input and output. It could then learn other languages the way it
learns anything else. But does Lojban lend itself to streams of
thought? I need to find out more.
Maybe not. While it's a logical, formal language, it would still be
difficult to process. Can we use a combination of a logical language,
symbolic representation, and mathematics to create a brain?
It's sounding more and more that LISP will be useful for a lot of
this. At least for the general purpose learning algorithms. Other
stuff will be more specialized, such as the vision system. For LISP,
a thought stream would be lists... Sort of. Can LISP use streaming?
Maybe use a wrapper to pull out what is needed for the LISP code.
Right now, I have a vision system where I want to use OpenCV. I have
the thought streaming where I'll use C#. I have the processing system
where I'm thinking LISP. I need a speech system. If I use Lojban,
then I'll need a simple parser. And a TTS and STT translator.
Storage? This is a bit more difficult. I don't even know how I'll
handle the thoughts within a stream, let alone how to distill them
into something persistent.
That's what I've been thinking about lately. I'll think about posting future notes here as well.