He says he hand-coded a neural net to answer questions about the tree. The relevant paper, which is one of the seminal early works on back propagation, is at http://www.cs.toronto.edu/~hinton/absps/naturebp.pdf
It seems that the network doesn't accept natural-language input. The questions have to be submitted in the form of input vectors containing numbers. So names are encoded in a vector, and relationships such as "has-aunt", "has-father", etc. are encoded in another vector; these two vectors are presented as the inputs to the neural network. The output is a vector representation of a name or names that satisfies the relationship.
In my view, there is heavy preprocessing required to turn a simple question such as "Who are Colin's aunts?" into a form the network can accept. I would rather simply ask the program:
---
> who are Colin's aunts?
jennifer and margaret.
> who are Charlotte's grandmothers?
penelope and christine
> Who is Arthur's sister?
victoria
> Are Victoria and Arthur siblings?
Yes, Victoria and Arthur are siblings.
> Who is James's father?
andrew
> Who married Andrew?
Andrew married christine.
---
(See http://subbot.org/logicagent/dialogs/familytree5.txt ; http://subbot.org/logicagent/dialogs/familytree.yaml ; http://subbot.org/logicagent )
I have encoded several of Hinton's example 12 relationships in symbolic rules (expressed in Ruby): http://subbot.org/logicagent/dialogs/familytreerules.txt
I think I can get to the relationships not yet encoded in rules, from the existing rules. For example, I haven't (yet) included a rule that encodes the "has-son" relationship. But I can answer questions about the "has-son" relationship by asking a series of other questions:
---
sh-3.2# ruby logicbot.rb
Hello
I have loaded /Users/bob/logicagent/logicagent-api.yaml.
> logicbot: load rules from familytreerules.txt
Okay, familytreerules.txt read; 20 rules.
> logicbot: load graph from familytree.yaml
familytree.yaml loaded.
> Who is James's son?
I don't know who James's son is.
> Who did James marry?
victoria married James.
> Who did Victoria and James have?
James had colin, charlotte and charlotte.
> is Colin male?
Yes, Colin is male.
> Colin is James's son.
Okay, Colin is James's son.
> Who is James's son?
James's son is colin
>
---
To answer "who is James's son", the program needs to ask itself, "who did James marry", then "who did those two people have", then which of those children are male. (Note: the program doesn't understand "those two people" yet; I have an idea how to do that type of anaphora and hope to test it soon...)
The logicagent program in its current state has some bugs; for example, it repeats Charlotte's name.
It is tedious to encode the series of questions outlined above into a rule that will find someone's sons. The problems come in error-checking and in dealing with the different format of responses. For example one answer might be "colin and charlotte" while another way of answering the same question might list the names with commas separating them: "colin, charlotte". Making a rule that deals with these different possibilities is tiresome and time-consuming. (There is also the problem of iterating through responses, generalizing it to cases where there are more than two children...)
However, Hinton too says that he had to hand-code his network. And he trained it with 1500 passes of 100 out of 104 possible triples. I would like to see those triples, and the training times. How long did it take to code the network?
I would like to get a working copy of Hinton's network, and test it against mine. I would like to include his program as an agent in my multi-agent system. My theory is that logicagent may handle certain inputs better, and other agents such as a neural network might handle other inputs better. The user can use feedback to teach the system to select the best agent response for different questions.