Future Work
I. Known Bugs
- When a "test set" is loaded through the "Load Test Set" menu option in
TNVisWindow, Borland pops up an "Exp Overflow" error window.
Judging by the fitness scores reported through the "Eval" menu option,
however, the test sets appear to be loading correctly.
- When running the 16-bit version of the program, invoking the
backpropagation on a sufficiently large network causes Windows 95 to
hang. The reason seems to be that too much time is being spent in an
event handler. There is no thread capability in 16-bit mode, so the
only solution would seem to be to break the backprop algorithm into
a state machine, each state of which is called from an event handler.
II. Known Limitations
- The "Custom . . ." option on the "Zoom" menu for both
TGenerationWindow and TFamilyTreeWindow currently doesn't do
anything.
- None of the editable text fields are "validated". If user input
does not parse, it will be ignored, but no indication of this is given
to the user.
- The format of training set files (.ts) is not very robust. Blank lines
within the file will cause parse errors. The same is true for network
files (.net).
- The visualization in TNVisWindow does not scale well for large
networks, though this is more a limitation of the user interface design
than of the program.
III. Possible Optimizations
- When dragging weights with the mouse, and when running the
backpropagation algorithm, the weights are animated as they change.
Currently, the entire window is redrawn during such operations, which
causes an unsightly flicker effect. This could be improved by having
a RedrawNetwork function in class TNVisWindow.
- If the current ES involves only one parent, the best, mean, and worst
fitness are one and the same. In this case only the best fitness needs
to be graphed in TESGraphWindow.
IV. Potential Features
- Add ability to calculate "best guess fitness", i.e. the fitness score
(RMS error) that a network would obtain simply by always outputting the
average of each of the outputs in the training set. If this best guess
fitness is better than the fitness for the best network in the population,
one can conclude that the networks have made no significant progress
toward solving the problem. This feature would probably take the
form of a "Best Guess Error" menu in TNVisWindow.
- Currently when you drag a weight using the mouse, it is possible to
change its magnitude, but not its sign. It would be nice if dragging the
weight "too high" (i.e. above the top end of the weight) caused the
sign to flip.
- It would be nice to be able to zero-out the weights of a network.
This could be implemented as a "Zero Out" option on a "Weights" menu added
to TNVisWindow. There could also be a "Randomize" menu option
which would randomize the weights.
- When invoking the backprop algorithm, it would be useful to be able
to specify the learning rate and momentum parameters through
a dialog box.
- In the "Network" menu of TNVisWindow, there could be an
"Insert Into Population" option which would allow you to insert an
edited network into the population. It may also help to be able
to insert a network as "immortal", so that it always survives into the
next generation.
- It might be useful to show the "dead" members of each generation
in TGenerationWindow, as well as the ones that survived.
- The "Mutation" display could be made into a button, and clicking on
this button could bring up a dialog box that would allow the user to
specify the maximum values for the mutators associated with each weight.
- In addition to being able to load and save individual networks,
it should be possible to load and save entire "sessions", so that the
entire state of the program, including all the generations, the statistics
in the plot window, and all other relevant data can be saved to a file and
later restored.
- Neither the neural network code nor the visualization in
TNVisWindow currently allows for a bias node.
- When running in a 32-bit environment, both the backpropagation
algorithm and the ES algorithm could be run as separate threads. There is
currently a USE_THREADS
#define
in backprop.h that allows the backpropagation algorithm to
run as a thread, but this is very crash-prone.
- It would be nice to be able to view the compact matrix representation
of a network from TNVisWindow.
- The user should be able to select a network in TFamilyTreeWindow
as you can in the TGenerationWindow.
- Within TNVisWindow, there could be a menu option to mutate a
network, and to breed it with any other network.
- Many data sets that one acquires from third party sources are
presented as attribute value strings, rather than numeric data. I have
created a utility called TGEN that converts attribute strings to
numeric values. It would be better to be able to do this automatically
from within LoadTrainingSet(). If this is done, it would be helpful
to have some way to show the attribute values associated with
each numeric input in TNVisWindow.
- Links from parents to children in TGenerationWindow and
TFamilyTreeWindow could encode the difference between the
parent and child (Euclidean distance in weight space), using the same
length/brightness scheme used in TNVisWindow.
- As described in the section on TFamilyTreeWindow in the
"Program Implementation" chapter, the links used for parents that survive
multiple generations could be made longer, so that each "tier" of the tree
holds networks from the same generation.
- TFamilyTreeWindow should have horizontal and vertical scroll
bars.
- Might be helpful to add support for Cheops-style compaction of trees
in TFamilyTreeWindow
- The "Scale" menu could be brought back to life in
TESGraphWindow.
- In TNVisWindow, it would be nice to have a "New Window" option
on the "File" menu that allowed you to bring up another TNVisWindow
to edit a copy of the current network.
- In TFamilyTreeWindow, the the children of a given network
could be displayed in addition to the parents. Ideally, a menu could
allow the user to choose between viewing the children, the parents, or
both.
- In TGenerationWindow, the "T" and "E" keys could be shortcuts
for "Tree" and "Edit". This can actually be done quite simply in the
resource editor.
- When the zoom factor is changed in TGenerationWindow, the
relative scroll position should be maintained.
- TNVisWindow could show birth & death date of network, and provide
links to the network's parents.
- It would be nice to be able to backpropagate with respect to a specific
sample, or to the currently selected sample in TNVisWindow.
Currently, the backpropagation algorithm is always run with respect to all
samples.
- The notion of a "training set" and a "test set" could be more
tightly integrated into the program.
- TGenerationWindow could provide some indication of the
diversity in each generation.
- TNVisWindow could be "hot", so that changes made to the network
would be reflected in the population. Right now, TNVisWindow allows
the user to edit a copy of a selected network.
- In TNVisWindow, it would be nice to be able to see the expected
output for a sample.
- TESMainWindow could have a menu option that allowed the user
to specify the maximum and minimum weight values for all weights in
a network.
- It may be useful to incorporate the notion of "population pools" into
the program. A group of networks could be selected to form a pool, and
this pool could be bred, evolved, reported on, what have you.
- In TNVisWindow, it may be useful to see the input contributions
from each weight when examining the input to a node. Perhaps the values
could simply be displayed as text over the corresponding weights.
- In TNVisWindow, TGenerationWindow, and
TFamilyTreeWindow, anti-aliased lines could be used for enhanced
visual appeal.
- In TNVisWindow, it may be better for weights to be rendered
using variable opacity instead of variable brightness.
- A "Help" menu in TESWindow could provide on-line help for the
program.