I have spent all too much time trying to get Caffe running on a CentOS based cluster that I use. I was hoping this would be a straightforward process. Suffice it to say it has not been. Not even close. None of the problems I encountered were particularly challenging to solve. The complication came from the fact that I ran into one hurdle after another. I should note however that installing Caffe on my personal machine which runs Linux Mint 17.1 went smoothly.
I'm writing this post as a record of the problems I encountered and the solutions I used. Unfortunately because I wasn't expecting to need to write this I may be missing details. If you notice something missing please feel free to leave a comment and I will update this document. Similarly, if you know of better ways to solve any of these problems please feel free to share. I will not likely test the solutions my self unless I need to reinstall for some reason so your comments would be largely for posterity. One thing to note is that some if not many of the problems I encountered may be rather specific too the cluster I'm using. My apologies if the following doesn't address the problem you are experiencing.
The first problem I ran into was with protobuf. The problem was related to the members of a unions being defined as constant in src/google/protobuf/util/internal/datapiece.h. Specifically the union defining the types i32_, i64_, u32_, u64_, double_, float_, bool_, and str_. This problem appears to be fairly common according to a quick Google search and the fix is as simple as removing the const keyword. However the error itself can be a bit misleading as it doesn't lead one specifically to the offending lines.
The next problem I encountered was related to glog. Specifically it requires a newer version of autotools than was installed on the system I'm using. To solve this I performed a user space install of autoconf and automake. It proved tricky to install autoconf for reasons I still don't understand. Thanks to the cluster admins I was able to finally do so using these instructions. Automake simply required downloading the tarball, configuring for my home directory, and then performing make followed by make install. Unfortunately glog was still not happy! The included make file hardcoded aclocal-1.14 and the upgraded autotools gave me autotools-1.15. Bah! Executing autoreconf -ivf fixed that issue though. I am not completely certain this is a good solution however as I have not used autoreconf before.
The next hurdle was with gflags. Evidently it requires cmake which was not already installed. Downloading and installing cmake resolved this problem. One thing to note when performing a user space install of cmake is that you need to use the --prefix flag when calling the boostrap script to indicate that you want cmake installed in your home directory. I also found that I had to compile with -fPIC, so the complete cmake command I ended up using was CXXFLAGS="-fPIC" cmake -DCMAKE_INSTALL_PREFIX=~ .. in a build subdirectory of the repository.
I also had to install OpenCV. I didn't run into any trouble here. But a word of warning for those that have never built it before -- it takes a very long time!
Next up was leveldb. In this case I just cloned the github repository and ran make in it. From there caffe needs to be told where to find the header files and shared objects that were built. I told it as much by appending to the INCLUDE_DIRS and LIBRARY_DIRS lists respectively in caffe/Makefile.config. The headers are in the include subdirectory of the repository while the libraries will be placed at the root of the repository.
From there I found I needed lmdb. This library is developed under OpenLDAP. At the time of this writing they offer a github repository with just the lmdb code so I cloned it and built the library. From there I updated the INCLUDE_DIRS and LIBRARY_DIRS lists in caffe/Makefile.config to point to libraries/liblmdb within the repository.
Next I had to install the Google snappy library. In this case I had to get the tarball from the Google code repository not the github repository. For reasons I don't know or really care about it seems that build files are missing from the gihub repository.
The last problem I ran into was related to Atlas. I had previously performed a user space install of it but did not add the resulting lib directory to my LD_LIBRARY_PATH and LIBRARY_PATH environment variables. Doing so allowed me to finally able to execute make all in the Caffe repository and have it complete without errors. It took a while though, in part because I was using a single thread since I never knew what it would stumble over next. As such I advise throwing more threads at it by instead using the command make all -jX where X is the number of threads you want it to use.
One final note on the installation. Don't forget to add the appropriate atlas, leveldb, and liblmdb directories to LD_LIBRARY_PATH in your .bashrc.
At this point I'm really hoping it was worth the effort to install Caffe. Comparatively the Theano and Pylearn2 installations were so much easier on this same system.
Musings on artificial intelligence, machine learning, robotics, research, and just about anything else that comes to mind.
20150725
20150421
Linux Mint 17.1, Nvidia, CUDA, and cuDNN
I recently replaced a Titan X, which was on loan, with a GTX 980. After messing with drivers for nearly a day I was able to get my dual monitor setup running again. Unfortunately whatever i did freaked out Theano yielding the error:
dustin@Cortex ~ $ ipython Python 2.7.6 (default, Mar 22 2014, 22:59:56) Type "copyright", "credits" or "license" for more information. IPython 1.2.1 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: import theano WARNING (theano.sandbox.cuda): CUDA is installed, but device gpu0 \ is not available (error: Unable to get the number of gpus available: \ unknown error)I tried upgrading the Nvidia driver to 346.59 and CUDA from 6.5 to 7.0 with no luck. So I decided to start fresh since I had been wanting to upgrade from Linux Mint 17 to 17.1 anyway. Following are the steps I used to get my system running Theano again. I have not replicated these results so hopefully I am not overlooking any major steps.
Nvidia Driver
I used the xorg-edgers PPA to install Nvidia drivers 346.59 as described on Noobs Lab. In short, add the new repository:sudo add-apt-repository ppa:xorg-edgers/ppaUpdate to get the list of available packages:
sudo apt-get updateInstall 346:
sudo apt-get install nvidia-346 nvidia-settingsI have a dual monitor setup that require I execute nvidia-settings to Enable Xinerama via the X Server Display Configuration page.
CUDA
I found some helpful instructions for installing CUDA. In short, start by installing the GNU Compiler Collection tools with:sudo apt-get install build-essentialDownload the Nvidia CUDA 7.0 DEB. Though I'm running Linux Mint 17.1 I used the Ubuntu 14.04 Network DEB. Install it:
sudo dpkg -i cuda-repo-ubuntu1404_6.5-14_amd64.debUpdate to get the list of packages:
sudo apt-get updateInstall CUDA:
sudo apt-get install cudaFinally alter your .bashrc to add CUDA to your PATH and LD_LIBRARY_PATH environment variables. Theano will also want to know where CUDA is located so now is a good time to setup the CUDA_ROOT environment variables as well.
export PATH=/usr/local/cuda-7.0/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH export CUDA_ROOT=/usr/local/cuda-7.0
cuDNN
Installing cuDNN for use with Theano can be found on the cuDNN page of deeplearning.net. I used the first method currently suggested on that page which is to copy *.h to $CUDA_ROOT/includes and *.so* to $CUDA_ROOT/lib64.20141221
Monitoring Experiments in Pylearn2
In an earlier post I covered the basics of running experiments in Pylearn2. However I only covered the bare minimum commands required leaving out many details. One fundamental concept to running experiments in Pylearn2 is knowing how to monitor their progress, or "monitoring" for short.
In this tutorial we will look at two forms of monitoring. The basic form which is always done and a new approach for real-time remote monitoring.
Pylearn2 performs monitoring at the end of each epoch and it can monitor any combination of the parts of the dataset. When using Stochastic Gradient Descent (SGD) as the training algorithm one uses the monitoring_dataset parameter to specify which parts of the dataset are to be monitored. For example, if we are only interested in monitoring the training set we would add the following entry to the SGD parameter dictionary:
This will instruct Pylearn2 to calculate statistics about the performance of our learner using the training part of the dataset at the end of each epoch. This will change the default output after each epoch from:
to:
Each of the entries in the output (e.g. learning_rate, train_objective) are called channels. Channels give one insight into what the learner is doing. The two most frequently used are train_objective and train_y_nll. The channel train_objective reports the cost being optimized by training while train_y_nll monitors the negative log likelihood of the current parameter values. In this particular example these two channels are monitoring the same thing but this will not always be the case.
Monitoring the train part of the dataset is useful for debugging purposes. However it is not enough alone to evaluate the performance of our learner because the learner will likely always improve and at some point it begins to overfit on the training data. In other words it will find parameters that work well on the data used to train it but not on data it has not seen during training. To combat this we use a validation set. MNIST does not explicitly reserve a part of the data for validation but it has become a de facto standard to use the last 10,000 samples from the train part. To specify this one uses the start and stop parameters when instantiating MNIST. If we were only monitoring the validation set our monitoring_dataset parameter to SGD would be:
Note that the key to the dictionary, 'valid' in this case, is merely a label. It can be whatever we choose. Each channel monitored for the associated dataset is prepended with this value.
It's also worth noting that we are not limited to monitoring just one part of the dataset. It is usually helpful to monitor both the train and validation parts of a data set. This is done as follows:
Note that here we use the start and stop parameters when loading both the train and valid parts to appropriately partition the dataset. We do not want the learner to validate on the data from the train dataset otherwise we will not be able to identify overfitting.
Putting it all together our our complete YAML now looks like:
Note that here we have used a YAML trick to reference a previously instantiated object to save ourselves typing. Specifically the dataset has been tagged "&train" and when specifying monitor_dataset the reference "*train" is used to identify the previously instantiated object.
An alternative approach is to use a new mechanism called live monitoring. To be completely forthright the live monitoring mechanism is something that I developed to combat the aforementioned problems. Furthermore I am interested in feedback regarding its user interface and what additional functionality people would like. Please feel free to send an E-mail to the Pylearn2 users mailing list or leave a comment below with feedback.
The live monitoring mechanism has two parts. The first part is a training extension, i.e. an optional plug-in that modifies the way training is performed. The second part is a utility class that can query the training extension for data about channels being monitored.
Training extensions can be selected using the extensions parameter to the train object. In other words add the following to the parameters dictionary for the train object in any YAML:
The full YAML would look like:
The LiveMonitoring training extension listens for queries about channels being monitored. To perform queries one need only instantiate LiveMonitor and use it's methods to request data. Currently it has three methods:
Each of the methods listed above return a different message object. The data of interest is contained in the data member of that object. As such, given an instance of LiveMonitor, one would view the channels being monitored as follows:
Which, if we're running the experiment specified by the YAML above, will yield:
From this we can pick channels to plot using follow_channels:
This command will then display a graph like that in figure 1 and continually updates the plot at the end of each epoch.
Figure 1: Example output from the follow_channels method of the LiveMonitor utility object.
The live monitoring mechanism is network aware and by default it answers queries on port 5555 of any network interface on the computer wherein the experiment is being executed. It is not necessary for a user to know anything about networking to use live monitoring however. By default the live monitoring mechanism assumes the experiment of interest is being executed on the same computer as the LiveMonitor utility class. If that is not the case and one knows the IP address of the computer on which the experiment is running then one need only specify the address when instantiating LiveMonitor. The live monitoring mechanism will automatically take care of the networking.
Live monitoring is also very efficient. It only ever requests data it does not already have and the underlying networking utility waits for new data without taking unnecessary CPU time.
The live monitoring mechanism has many benefits including:
In this tutorial we will look at two forms of monitoring. The basic form which is always done and a new approach for real-time remote monitoring.
Basic Monitoring
We will build upon the bare-bones example from the previous tutorial which means we will be using the MNIST dataset. Most datasets have two or three parts. At a minimum they have a part for training and a part for testing. If a dataset has a third part its purpose is for validation, or measuring the performance of our learner without unduly biasing our learner towards the dataset.Pylearn2 performs monitoring at the end of each epoch and it can monitor any combination of the parts of the dataset. When using Stochastic Gradient Descent (SGD) as the training algorithm one uses the monitoring_dataset parameter to specify which parts of the dataset are to be monitored. For example, if we are only interested in monitoring the training set we would add the following entry to the SGD parameter dictionary:
monitoring_dataset:
{
'train': !obj:pylearn2.datasets.mnist.MNIST { which_set: 'train' }
}
This will instruct Pylearn2 to calculate statistics about the performance of our learner using the training part of the dataset at the end of each epoch. This will change the default output after each epoch from:
Monitoring step: Epochs seen: 1 Batches seen: 1875 Examples seen: 60000 Time this epoch: 2.875921 seconds
to:
Monitoring step: Epochs seen: 0 Batches seen: 0 Examples seen: 0 learning_rate: 0.0499996989965 total_seconds_last_epoch: 0.0 train_objective: 2.29713964462 train_y_col_norms_max: 0.164925798774 train_y_col_norms_mean: 0.161361783743 train_y_col_norms_min: 0.158035755157 train_y_max_max_class: 0.118635632098 train_y_mean_max_class: 0.109155222774 train_y_min_max_class: 0.103917405009 train_y_misclass: 0.910533130169 train_y_nll: 2.29713964462 train_y_row_norms_max: 0.0255156457424 train_y_row_norms_mean: 0.018013747409 train_y_row_norms_min: 0.00823106430471 training_seconds_this_epoch: 0.0 Time this epoch: 2.823628 seconds
Each of the entries in the output (e.g. learning_rate, train_objective) are called channels. Channels give one insight into what the learner is doing. The two most frequently used are train_objective and train_y_nll. The channel train_objective reports the cost being optimized by training while train_y_nll monitors the negative log likelihood of the current parameter values. In this particular example these two channels are monitoring the same thing but this will not always be the case.
Monitoring the train part of the dataset is useful for debugging purposes. However it is not enough alone to evaluate the performance of our learner because the learner will likely always improve and at some point it begins to overfit on the training data. In other words it will find parameters that work well on the data used to train it but not on data it has not seen during training. To combat this we use a validation set. MNIST does not explicitly reserve a part of the data for validation but it has become a de facto standard to use the last 10,000 samples from the train part. To specify this one uses the start and stop parameters when instantiating MNIST. If we were only monitoring the validation set our monitoring_dataset parameter to SGD would be:
monitoring_dataset:
{
'valid': !obj:pylearn2.datasets.mnist.MNIST {
which_set: 'train',
start: 50000,
stop: 60000
}
}
Note that the key to the dictionary, 'valid' in this case, is merely a label. It can be whatever we choose. Each channel monitored for the associated dataset is prepended with this value.
It's also worth noting that we are not limited to monitoring just one part of the dataset. It is usually helpful to monitor both the train and validation parts of a data set. This is done as follows:
monitoring_dataset:
{
'train': !obj:pylearn2.datasets.mnist.MNIST {
which_set: 'train',
start: 0,
stop: 50000
},
'valid': !obj:pylearn2.datasets.mnist.MNIST {
which_set: 'train',
start: 50000,
stop: 60000
}
}
Note that here we use the start and stop parameters when loading both the train and valid parts to appropriately partition the dataset. We do not want the learner to validate on the data from the train dataset otherwise we will not be able to identify overfitting.
Putting it all together our our complete YAML now looks like:
!obj:pylearn2.train.Train {
dataset: &train !obj:pylearn2.datasets.mnist.MNIST {
which_set: 'train'
start: 0,
stop: 50000
},
model: !obj:pylearn2.models.softmax_regression.SoftmaxRegression {
batch_size: 20,
n_classes: 10,
nvis: 784,
irange: 0.01
},
algorithm: !obj:pylearn2.training_algorithms.sgd.SGD {
learning_rate: 0.05,
monitoring_dataset:
{
'train': *train,
'valid': !obj:pylearn2.datasets.mnist.MNIST {
which_set: 'train',
start: 50000,
stop: 60000
}
}
}
}
Note that here we have used a YAML trick to reference a previously instantiated object to save ourselves typing. Specifically the dataset has been tagged "&train" and when specifying monitor_dataset the reference "*train" is used to identify the previously instantiated object.
Live Monitoring
There are two problems with the basic monitoring mechanism in Pylearn2. First the output is raw text. This alone can make it difficult to understand how the values of the various channels are evolving in time. Especially when attempting to track multiple channels simultaneously. Second, due in part to the ability to add channels for monitoring, the amount of output after each epoch can and frequently does grow quickly. Combined these problems make the basic monitoring mechanism difficult to use.An alternative approach is to use a new mechanism called live monitoring. To be completely forthright the live monitoring mechanism is something that I developed to combat the aforementioned problems. Furthermore I am interested in feedback regarding its user interface and what additional functionality people would like. Please feel free to send an E-mail to the Pylearn2 users mailing list or leave a comment below with feedback.
The live monitoring mechanism has two parts. The first part is a training extension, i.e. an optional plug-in that modifies the way training is performed. The second part is a utility class that can query the training extension for data about channels being monitored.
Training extensions can be selected using the extensions parameter to the train object. In other words add the following to the parameters dictionary for the train object in any YAML:
extensions: [
!obj:pylearn2.train_extensions.live_monitoring.LiveMonitoring {}
]
The full YAML would look like:
!obj:pylearn2.train.Train {
dataset: &train !obj:pylearn2.datasets.mnist.MNIST {
which_set: 'train'
start: 0,
stop: 50000
},
model: !obj:pylearn2.models.softmax_regression.SoftmaxRegression {
batch_size: 20,
n_classes: 10,
nvis: 784,
irange: 0.01
},
algorithm: !obj:pylearn2.training_algorithms.sgd.SGD {
learning_rate: 0.05,
monitoring_dataset:
{
'train': *train,
'valid': !obj:pylearn2.datasets.mnist.MNIST {
which_set: 'train',
start: 50000,
stop: 60000
}
}
},
extensions: [
!obj:pylearn2.train_extensions.live_monitoring.LiveMonitoring {}
]
}
The LiveMonitoring training extension listens for queries about channels being monitored. To perform queries one need only instantiate LiveMonitor and use it's methods to request data. Currently it has three methods:
- list_channels: Returns a list of channels being monitored.
- update_channels: Retrieves data about the list of specified channels.
- follow_channels: Plots the data for the specified channels. This command blocks other commands from being executed because it repeatedly requests the latest data for the specified channels and redraws the plot as new data arrives.
from pylearn2.train_extensions.live_monitoring import LiveMonitor lm = LiveMonitor()
Each of the methods listed above return a different message object. The data of interest is contained in the data member of that object. As such, given an instance of LiveMonitor, one would view the channels being monitored as follows:
print lm.list_channels().data
Which, if we're running the experiment specified by the YAML above, will yield:
['train_objective', 'train_y_col_norms_max', 'train_y_row_norms_min', 'train_y_nll', 'train_y_col_norms_mean', 'train_y_max_max_class', 'train_y_min_max_class', 'train_y_row_norms_max', 'train_y_misclass', 'train_y_col_norms_min', 'train_y_row_norms_mean', 'train_y_mean_max_class', 'valid_objective', 'valid_y_col_norms_max', 'valid_y_row_norms_min', 'valid_y_nll', 'valid_y_col_norms_mean', 'valid_y_max_max_class', 'valid_y_min_max_class', 'valid_y_row_norms_max', 'valid_y_misclass', 'valid_y_col_norms_min', 'valid_y_row_norms_mean', 'valid_y_mean_max_class', 'learning_rate', 'training_seconds_this_epoch', 'total_seconds_last_epoch']
From this we can pick channels to plot using follow_channels:
lm.follow_channels(['train_objective', 'valid_objective'])
This command will then display a graph like that in figure 1 and continually updates the plot at the end of each epoch.
Figure 1: Example output from the follow_channels method of the LiveMonitor utility object.
The live monitoring mechanism is network aware and by default it answers queries on port 5555 of any network interface on the computer wherein the experiment is being executed. It is not necessary for a user to know anything about networking to use live monitoring however. By default the live monitoring mechanism assumes the experiment of interest is being executed on the same computer as the LiveMonitor utility class. If that is not the case and one knows the IP address of the computer on which the experiment is running then one need only specify the address when instantiating LiveMonitor. The live monitoring mechanism will automatically take care of the networking.
Live monitoring is also very efficient. It only ever requests data it does not already have and the underlying networking utility waits for new data without taking unnecessary CPU time.
The live monitoring mechanism has many benefits including:
- The ability to filter the channels being monitored.
- The ability to plot data for any given set of channels being monitored.
- The ability to retrieve data from an experiment in real-time*
- The ability to query for data from an experiment running on a remote machine.
- The ability to change which channels are being followed or plotted without restarting an experiment.
Conclusion
Monitoring the progress of experiments in Pylearn2 is as easy as setting up an experiment. Monitoring is also very flexible and offers output both directly in the terminal as text or graphically via a training extension.20141021
Thoughts Regarding the Michael Jordan Interview on IEEE Spectrum
For the few that may not have already seen it Dr. Michael Jordan was interviewed by IEEE Spectrum recently. He offers commentary on a number of topics including computer vision, deep learning, and big data.
Overall I found the article to be an interesting read though it seems to offer little new over what he said on his AMA on Reddit.
Ultimately I find my self agreeing with his position on computer vision. Even given the major strides we have made as of late with convnets and the like we are still far from having a system as capable as we are at vision tasks. After all, the state-of-the-art challenge is the classification of just 1,000 classes of objects in high resolution images. This is a hard problem but it is something that we, humans, and many other animals do trivially.
I am a bit torn about his perspective on deep learning. Notably because of the statement "it’s largely a rebranding of neural networks." I have encountered this idea a couple of times now but I argue that it is not accurate. It is true that neural networks are a favored tool amongst those in the deep learning community and that the strides made in the DL community have been seen while using NNs. But as Bengio et al. note in their forth-coming text called Deep Learning, it "involves learning multiple levels of representation, corresponding to different levels of abstraction." Neural networks have been shown to do this but it has not been shown that they are required to perform such a task. On the flip side, they are out performing other methods that could be used.
Another point that stood out to me were is comments on the singularity. I find myself waffling on this topic and his comments help highlight the reason. Specifically he points out that discussions of the singularity are more philosophical in nature. I rather enjoy philosophy. I often say that if I had another life I would be a mathematician but if I had another one beyond that I would be a philosopher. More so than I am now anyway. I meet so many AI/ML people that think the singularity folks are just crackpots. And if we are being honest, there do seem to be more than a reasonable proportion of crackpots in the community. However that does not prevent us from approaching the topic with sound and valid argumentation. We just have to be prepared to encounter those that cannot or chose not.
Edit 2014-10-23: It appears Dr. Jordan was a bit displeased with IEEE Spectrum interview as he explains in Big Data, Hype, the Media and Other Provocative Words to Put in a Title. The long and short of it appears to be that he believes his perspective was intentionally distorted for the reason that many of my colleagues have been discussing. Namely the title, and arguably the intro, imply much stronger claims than his subsequent comments in the article seem to allude to. As such he he felt the need to clarify his perspectives.
On the one hand I though that a careful critical read of the interview allowed one to pick out his perspective fairly well. But in reading his response there appear to be some things that seem to come across just plain wrong. For instance his opinion about whether we should be collecting and exploring these large data sets. In the interview he makes the great point that we must be cognizant of bad correlations that can and will likely arise. But in the context I did get the impression that he was arguing against doing it all, i.e. collecting and analyzing such data sets, whereas in his response he argues that doing it can be a good thing because it can contribute to the development of principals that are currently missing.
As a side note, I find it interesting that he did not link to the interview but instead gave a link to it. As if to say, let's not lend any more credibility to this article than is absolutely necessary.
Overall I found the article to be an interesting read though it seems to offer little new over what he said on his AMA on Reddit.
Ultimately I find my self agreeing with his position on computer vision. Even given the major strides we have made as of late with convnets and the like we are still far from having a system as capable as we are at vision tasks. After all, the state-of-the-art challenge is the classification of just 1,000 classes of objects in high resolution images. This is a hard problem but it is something that we, humans, and many other animals do trivially.
I am a bit torn about his perspective on deep learning. Notably because of the statement "it’s largely a rebranding of neural networks." I have encountered this idea a couple of times now but I argue that it is not accurate. It is true that neural networks are a favored tool amongst those in the deep learning community and that the strides made in the DL community have been seen while using NNs. But as Bengio et al. note in their forth-coming text called Deep Learning, it "involves learning multiple levels of representation, corresponding to different levels of abstraction." Neural networks have been shown to do this but it has not been shown that they are required to perform such a task. On the flip side, they are out performing other methods that could be used.
Another point that stood out to me were is comments on the singularity. I find myself waffling on this topic and his comments help highlight the reason. Specifically he points out that discussions of the singularity are more philosophical in nature. I rather enjoy philosophy. I often say that if I had another life I would be a mathematician but if I had another one beyond that I would be a philosopher. More so than I am now anyway. I meet so many AI/ML people that think the singularity folks are just crackpots. And if we are being honest, there do seem to be more than a reasonable proportion of crackpots in the community. However that does not prevent us from approaching the topic with sound and valid argumentation. We just have to be prepared to encounter those that cannot or chose not.
Edit 2014-10-23: It appears Dr. Jordan was a bit displeased with IEEE Spectrum interview as he explains in Big Data, Hype, the Media and Other Provocative Words to Put in a Title. The long and short of it appears to be that he believes his perspective was intentionally distorted for the reason that many of my colleagues have been discussing. Namely the title, and arguably the intro, imply much stronger claims than his subsequent comments in the article seem to allude to. As such he he felt the need to clarify his perspectives.
On the one hand I though that a careful critical read of the interview allowed one to pick out his perspective fairly well. But in reading his response there appear to be some things that seem to come across just plain wrong. For instance his opinion about whether we should be collecting and exploring these large data sets. In the interview he makes the great point that we must be cognizant of bad correlations that can and will likely arise. But in the context I did get the impression that he was arguing against doing it all, i.e. collecting and analyzing such data sets, whereas in his response he argues that doing it can be a good thing because it can contribute to the development of principals that are currently missing.
As a side note, I find it interesting that he did not link to the interview but instead gave a link to it. As if to say, let's not lend any more credibility to this article than is absolutely necessary.
20141018
A First Experiment with Pylearn2
Vincent Dumoulin recently wrote a great blog post titled Your models in Pylearn2 that shows how to quickly implement a new model idea in Pylearn2. However Pylearn2 has a fair number of models already implemented. This post is meant to compliment his post by explaining how to setup and run a basic experiment using existing components in Pylearn2.
In this tutorial we will train a very simple single layer softmax regression model on MNIST,
a database of handwritten digits. Softmax is a generalization of a
binary predictor called logistic regression to the prediction of one of
many classes. The task will be to identify which digit was written, i.e.
classify the image into the classes 0-9.
YAML Syntax
A
main goal of pylearn2 is to make managing experiments quick and easy.
To that end a basic experiment can be executed by writing a description
of the experiment in YAML (Yet Another Markup Language) and running the
train script (pylearn2/scripts/train.py)
on it.
YAML is a markup language intended to be very sparse as compared to other markup languages such as XML. A run down of useful features for use with Pylearn2 can be found in the document YAML for Pylearn2 and the full specification can be found on yaml.org in case you need to something particularly out of the ordinary like defining a tuple.
A Pylearn2 YAML configuration file identifies the object that will actually perform the training and the parameters it takes. I believe there is only one type of training object at the moment so it's kind of redundant but it allows for easy incorporation of special training procedures. The existing training object takes a specification of the model to be trained, the dataset on which the model should be trained, and the object representing the algorithm that will actually perform the training.
Basic YAML syntax is extremely straight forward and the only special syntax that is really needed for the simplest of experiments is the !obj: tag. This is a Pylearn2 custom tag that instructs the Pylearn2 to instantiate a python object as specified immediately following the tag. For example the statement:
YAML is a markup language intended to be very sparse as compared to other markup languages such as XML. A run down of useful features for use with Pylearn2 can be found in the document YAML for Pylearn2 and the full specification can be found on yaml.org in case you need to something particularly out of the ordinary like defining a tuple.
A Pylearn2 YAML configuration file identifies the object that will actually perform the training and the parameters it takes. I believe there is only one type of training object at the moment so it's kind of redundant but it allows for easy incorporation of special training procedures. The existing training object takes a specification of the model to be trained, the dataset on which the model should be trained, and the object representing the algorithm that will actually perform the training.
Basic YAML syntax is extremely straight forward and the only special syntax that is really needed for the simplest of experiments is the !obj: tag. This is a Pylearn2 custom tag that instructs the Pylearn2 to instantiate a python object as specified immediately following the tag. For example the statement:
!obj:pylearn2.datasets.mnist.MNIST { which: 'train' }
results in the instantiation of the MNIST dataset class found amongst the various Pylearn2 datasets in pylearn2.datasets in the file mnist.py specifying a supplies the value 'train' for a parameter called which that identifies the portion (e.g. training, validation, or test) of the dataset that should be loaded via a python dictionary.
Note that the quotes around the value 'train' are required as they indicate that the value is string which is the required data type for the 'which' parameter.
Note that the quotes around the value 'train' are required as they indicate that the value is string which is the required data type for the 'which' parameter.
It's important to note that any parameters required for the instantiation of a class must be provided in the associated dictionary. Check the Pylearn2 documentation for the class you need to instantiation to understand the available parameters and specifically which are required for the task you are attempting to perform.
Defining an Experiment
To define an experiment we need to define a train object and provide it a dataset object, a model object, and an algorithm object via its parameters dictionary.
We have already seen how to instantiate the MNIST dataset class so lets look next at the algorithm. The Pylearn2 algorithm classes are found in the training_algorithms sub-directory. In this example we are going to use stochastic gradient descent (SGD) because it is arguably the most commonly used algorithm for training neural networks. It requires only one parameter, namely learning_rate, and is instantiated as follows:
Using what we know, we can now construct the train object and in effect the full YAML file as follows:
We have already seen how to instantiate the MNIST dataset class so lets look next at the algorithm. The Pylearn2 algorithm classes are found in the training_algorithms sub-directory. In this example we are going to use stochastic gradient descent (SGD) because it is arguably the most commonly used algorithm for training neural networks. It requires only one parameter, namely learning_rate, and is instantiated as follows:
!obj:pylearn2.training_algorithms.sgd.SGD { learning_rate: 0.05 }
The final thing we need to do before we can put it all together is to define a model. The Pylearn2 model classes are located in the model sub-directory. The class we want is called SoftmaxRegression and found in softmax_regression. In its most basic form we only need to supply four parameters:- nvis: the number of visible units in the network, i.e. the dimensionality of the input.
- n_classes: the number of output units in the network, i.e. the number of classes to be learned.
- irange: the range from which the initial weights should be randomly selected. This is a symmetric range about zero and as such it is only necessary to supply the upper bound.
- batch_size: the number of samples to be used simultaneously during training. Setting this to 1 results in pure stochastic gradient descent whereas setting it to the size of the training set effectively results in batch gradient descent. Any value in between yields stochastic gradient descent with mini-batches of the size specified.
Using what we know, we can now construct the train object and in effect the full YAML file as follows:
!obj:pylearn2.train.Train {
dataset: !obj:pylearn2.datasets.mnist.MNIST { which_set: 'train' },
model: !obj:pylearn2.models.softmax_regression.SoftmaxRegression {
batch_size: 20,
n_classes: 10,
nvis: 784,
irange: 0.01
},
algorithm: !obj:pylearn2.training_algorithms.sgd.SGD { learning_rate: 0.05 }
}
Note that a Pylearn2 YAML file can contain definitions for multiple experiments simultaneously. Simply stack them one after the other and they will be executed in order from top to bottom in the file.
Executing an Experiment
The final step is to run the experiment. Assuming the scripts sub-directory is in your path we simply call train.py and supply the YAML file created above. Assuming that file is called basic_example.yaml and your current working directory contains it the command would be:train.py basic_example.yamlPylearn2 will load the YAML, instantiate the specified objects and run the training algorithm on the model using the specified dataset. An example of the output from this YAML looks like:
dustin@Cortex ~/pylearn2_tutorials $ train.py basic_example.yaml compiling begin_record_entry... compiling begin_record_entry done. Time elapsed: 0.013530 seconds Monitored channels: Compiling accum... Compiling accum done. Time elapsed: 0.000070 seconds Monitoring step: Epochs seen: 0 Batches seen: 0 Examples seen: 0 Time this epoch: 0:02:18.271934 Monitoring step: Epochs seen: 1 Batches seen: 1875 Examples seen: 60000 Time this epoch: 0:02:18.341147
...Note we have not told the training algorithm under what criteria it should stop so it will run forever!
Under the hood the Pylearn2 uses Theano to construct and train many of the models it supports. The first four lines of output, i.e. those related to begin_record_entry and accum, are related to this fact and can be disregarded for our purposes.
The rest of the output is related to Pylearn2's monitoring functionality. Since no channels, particular metrics or statics about the training, have been specified the rest of the output is rather sparse. There are no channels listed under the Monitor channels heading and the only things listed under the Monitoring step headings are those things common to all experiments (e.g. epochs seen, batches seen, and examples seen). The only other output is a summary of the time it took to train each epoch.
Conclusion
Pylearn2 to makes specifying and training models easy and fast. This tutorial looked at the most basic of models. However it does not discuss the myriad training and monitoring options provided by Pylearn2. Nor does it show how to build more complicated models like those with multiple layers as in multilayer perceptrons nor those with special connectivity patterns as in convolutional neural networks. My inclination is to continue in the next post by discussing the types of stopping criteria and how to use them. From there I would proceed to discussing the various training options and work my way towards more complicated models. However I'm amenable to the idea of changing this order if there is something of particular interest so let me know what you would like to see next.20141013
Harvard Librarians Advise Open Access Publishing
Excellent. The Harvard university librarians have written a letter the Harvard faculty and staff encouraging they start publishing in journals that make content free to the public, known as open access journals, as opposed to hidden behind a pay wall. I have been watching this debate for some time as a number of the UofU CS professors have been arguing for exactly this change.
I quite like the policy at the Machine Learning Lab here in Montreal which requires us to publish our articles on Arxiv.org, a database for freely publishing and accessing of scholarly works. It’s not without it’s challenges. For instance you never know the quality of a given paper that you find on Arxiv until you have invested time in reading it. Many arguing for the open access model have been actively trying to devise strategies for such problems. Regardless I believe it’s preferable to not having access to a paper that should probably be cited.
From a grad student's perspective it is nice because I don’t have to spend time submitting special requests for access to articles and then waiting to receive them. It could end up meaning that I have to pay to have my articles published but I personally prefer this because I want my work available to others to hopefully build upon.
I quite like the policy at the Machine Learning Lab here in Montreal which requires us to publish our articles on Arxiv.org, a database for freely publishing and accessing of scholarly works. It’s not without it’s challenges. For instance you never know the quality of a given paper that you find on Arxiv until you have invested time in reading it. Many arguing for the open access model have been actively trying to devise strategies for such problems. Regardless I believe it’s preferable to not having access to a paper that should probably be cited.
From a grad student's perspective it is nice because I don’t have to spend time submitting special requests for access to articles and then waiting to receive them. It could end up meaning that I have to pay to have my articles published but I personally prefer this because I want my work available to others to hopefully build upon.
20140413
Installing RL-Glue and ALE without Root Access
In 2012 Bellemare, Naddaf, Veness, and Bowling [1] introduced the Arcade Learning Environment (ALE) for developing and evaluating general AI methods. It interfaces with an Atari 2600 simulator called Stella. They motivate their use of the the Atari 2600 because it permits access to hundreds of "game environments, each one different, interesting, and designed to be a challenge for human players." ALE also interfaces with RL-Glue, a collection of tools for developing and evaluating Reinforcement Learning agents.
RL-Glue is a two part system; a language agnostic part, referred to as the core, and a language specific part, referred to as the codec. There are multiple codecs supporting development in C/C++, Java, Lisp, Matlab, and Python.
The following discusses installing RL-Glue and ALE. First I cover installing RL-Glue and then ALE.
Installing RL-Glue in the user space as opposed to system wide requires compiling the core code from source. To do so, execute the following commands.
At this point it is necessary to identify the location wherein you wish to install the core as you must tell this to the configure script. I made a directory called rlglue in my home directory resulting in the following command:
5. Build and install RL-Glue Core
Because the core has been installed in a non-standard location it is necessary to inform the system of it's location. This merely entails updating your PATH environment variable to include rlglue/bin, i.e.:
At this point executing rl_glue should result in:
This is another step that is only necessary because we're installing into a non-standard location.
1. Download ALE
ALE supports Linux, OSX, and Windows and as such a makefile is supplied for each platform. Installing ALE requires making a makefile from one of these. I advise copying the one you want as opposed to renaming it:
4. Enable RL-Glue support
RL-Glue support in ALE is disabled by default. To enable it edit the makefile and change the line:
Similarly it is necessary to inform ALE where the RL-Glue libraries are installed. This is done by changing the line:
5. Build ALE
Because the RL-Glue libraries have been installed in a non-standard location it is necessary to tell ALE where to find them. This is done using the LD_LIBRARY_PATH environment variable as follows:
7. Update your PATH
As before it is necessary to update your path to inform the system of the location of the ALE binaries since they are installed in a non-standard location.
At this point you can execute ale which should result in:
RL-Glue is a two part system; a language agnostic part, referred to as the core, and a language specific part, referred to as the codec. There are multiple codecs supporting development in C/C++, Java, Lisp, Matlab, and Python.
The following discusses installing RL-Glue and ALE. First I cover installing RL-Glue and then ALE.
Installing RL-Glue
The instructions for installing the RL-Glue core and Python codec are drawn from the technical manuals for versions 3.04 and 2.0 and assume versions 3.04 and 2.02 respectively. However, looking over older versions of the manual it appears these instructions have not changed much, if at all, which means they may also work for future versions with the correct changes in the commands. I leave it as an exercise to the reader to determine what changes are needed. (Don't you love it when an author does that?)Installing RL-Glue in the user space as opposed to system wide requires compiling the core code from source. To do so, execute the following commands.
RL-Glue Core
1. Download RL-Glue Core$ cd ~ && wget http://rl-glue-ext.googlecode.com/files/rlglue-3.04.tar.gz2. Unpack RL-Glue Core
$ tar -xvzf rlglue-3.04.tar.gz3. Make a directory into which RL-Glue will be installed:
$ mkdir ~/rlglue4. Configure RL-Glue Core
At this point it is necessary to identify the location wherein you wish to install the core as you must tell this to the configure script. I made a directory called rlglue in my home directory resulting in the following command:
$ cd rlglue-3.04 && ./configure --prefix=<rlglue>where <rlglue> is the absolute path to the directory into which you want RL-glue installed.
5. Build and install RL-Glue Core
$ make && make install6. Update your PATH
Because the core has been installed in a non-standard location it is necessary to inform the system of it's location. This merely entails updating your PATH environment variable to include rlglue/bin, i.e.:
$ export PATH=~/rlglue/bin:$PATHNote that you can make this change in your .bashrc to avoid doing it every time you open a new terminal.
At this point executing rl_glue should result in:
RL-Glue Version 3.04, Build 909 RL-Glue is listening for connections on port=4096This indicates that RL-Glue is waiting for programs managing the agent, environment, and experiment to connect. For now you can type ctrl-c to exit the program.
Python Codec
1. Download the Python Codec$ cd ~ && wget http://rl-glue-ext.googlecode.com/files/python-codec-2.02.tar.gz2. Unpack the codec
$ tar -xvzf python-codec-2.02.tar.gz3. Update your PYTHONPATH
This is another step that is only necessary because we're installing into a non-standard location.
$ export PYTHONPATH=~/python-codec/srcNote that this is another command that can be placed into your .bashrc to avoid executing it every time you open a new terminal.
Installing ALE
Installing ALE takes a little more effort. This is due to the fact that ALE does not supply a configure script to build a makefile specific for your system. These instruction are for installing ALE 0.4.3 and may not extend to newer versions well so your mileage may vary. As before, execute the following commands.$ wget http://www.arcadelearningenvironment.org/wp-content/uploads/2014/01/ale_0.4.3.zip2. Unpack ALE
$ unzip ale_0.4.3.zip3. Select Makefile
ALE supports Linux, OSX, and Windows and as such a makefile is supplied for each platform. Installing ALE requires making a makefile from one of these. I advise copying the one you want as opposed to renaming it:
$ cd ale_0.4.3/ale_0_4/ && cp makefile.unix makefileUpdate 2014-04-15: Frédéric Bastien notes that this step can be avoided by supplying the name of the preferred makefile to make on the command line as follows:
$ make -f makefile.unixStill be sure to change your working directory to ale_0.4.3/ale_0_4 as the following commands assume that context.
4. Enable RL-Glue support
RL-Glue support in ALE is disabled by default. To enable it edit the makefile and change the line:
USE_RLGLUE := 0to
USE_RLGLUE := 1It is also necessary to inform ALE where the RL-Glue headers are located. This can be done by changing the line:
INCLUDES := -Isrc/controllers -Isrc/os_dependent -I/usr/include -Isrc/environmentto
INCLUDES :=-Isrc/controllers -Isrc/os_dependent -I/usr/include -Isrc/environment -I<rlgluedir>/includewhere <rlgluedir> indicates the directory into which rlglue was installed earlier.
Similarly it is necessary to inform ALE where the RL-Glue libraries are installed. This is done by changing the line:
LIBS_RLGLUE := -lrlutils -lrlgluenetdevto
LIBS_RLGLUE := -L<rlgluedir>/lib -lrlutils -lrlgluenetdevUpdate 2014-04-15: Frédéric Bastien notes that one can override these variables on the command line. For example:
$ make USE_RLGLUE=1sets USE_RLGLUE to 1. However it is unclear how to append to variables via the command line so this may only work for the USE_RLGLUE variable without restating the existing variable value.
5. Build ALE
$ make6. Update LD_LIBRARY_PATH
Because the RL-Glue libraries have been installed in a non-standard location it is necessary to tell ALE where to find them. This is done using the LD_LIBRARY_PATH environment variable as follows:
$ export LD_LIBRARY_PATH=<rlgluedir>/lib:$LD_LIBRARY_PATHNote that this is another command you can add to your .bashrc to avoid needing to execute the command every time you open a new terminal.
7. Update your PATH
As before it is necessary to update your path to inform the system of the location of the ALE binaries since they are installed in a non-standard location.
$ export PATH=~/ale_0.4.3/ale_0_4:$PATHNote that this is yet another command you will have to execute every time you open a terminal unless you add this command to your .bashrc.
At this point you can execute ale which should result in:
A.L.E: Arcade Learning Environment (version 0.4) [Powered by Stella] Use -help for help screen. Warning: couldn't load settings file: ./stellarc No ROM File specified or the ROM file was not found.
Disregard the warnings, they are simply saying that ALE was unable to find your stella configuration and that a game ROM was not specified. This is to be expected since you did not specify the locations for them.
In a future post, or possibly more than one, I will outline the processes for making and executing agents, environments, and experiments.
Conclusion
This covers installing RL-Glue and ALE. I have not discussed anything beyond basic testing as such material can be found in the documentation for the tools.In a future post, or possibly more than one, I will outline the processes for making and executing agents, environments, and experiments.
References
[1] Bellemare, Marc G., et al. "The arcade learning environment: An evaluation platform for general agents." arXiv preprint arXiv:1207.4708 (2012).20140404
What's Wrong with the Turing Test?
If I could answer one question through the course of my research it
would be "what is intelligence?" This question like no other drives my
studies. I wrote this post a while ago but did not post it. I did not post it because I intended to refine it. But the reality is I will always be refining my thoughts on this topic. Tonight I went out to the pub with several of my colleagues at Université de Montréal and this topic came up reminding me that I need to just put this out there. As such I am posting it now, with some small changes. I look forward to your responses.
The question "what is intelligence?" is non-trivial. We have been seeking an answer for millennia. While many definitions have been offered [1] no single definition has really ever dominated. Even in the sixty or so years that we have been seriously studying how to create an artificial intelligence we have never actually formally defined intelligence. Ask 100 people to define it and you will likely receive 100 different definitions [1], [2]. The de facto standard is the Turing test developed by Alan Turing [3]. History tells us that he was worried about getting mired in a long drawn out philosophical debate which would likely prevent any progress on actually creating an artificially intelligent being.
The Turing Test as it has come to be known is a variation on a game known as the imitation game [2] wherein a participant, the interrogator, attempts to identify which of the other two participants, one male and one female, was in fact male. Of course the female's objective was to fool the interrogator. The crux of the game was that the decision had to be made solely from communication patterns. In other words, the interrogator did not meet nor could they see the other participants. Additionally, to avoid cues from writing styles, messages would be passed between them in an anonymous way, such as through a computer terminal.
In the Turing Test the objective is to identify the artificial being [4], the computer, as opposed to the male. The hypothesis being that if the interrogator cannot differentiate the artificial being and the human, the artificial being must necessarily be intelligent if we accept that humans are intelligent. This test is clever because it does not require a definition of intelligence nor a measure of intelligence other than agreement that humans are intelligent. However the Turing Test is a behavioral test. Not everyone accepts the test. One of the more well known opponents is John Searle, a professor of philosophy at the University of California, Berkeley. Dr. Searle offers the Chinese Room argument in counter to the Turing Test.
According to the Chinese Room argument we can construct a process that appears intelligent but in fact is not. We do so by placing a person in a room, particularly one that does not speak Chinese. The resident will receive messages from outside the room written in Chinese. The resident must then consult a set of instructions that, when followed, dictate the appropriate response. One, that to any outside observer, would have to have been written by someone that knows Chinese. Since the resident does not know Chinese it supposedly follows that intelligence had only been imitated by the process.
There are a number of counter arguments to the Chinese Room argument. Some argue that the analogy breaks down as a result of the fact that a human performing the processing would simply take too long. Others argue that the room itself is intelligent. But I digress.
While I don't personally accept the Chinese Room argument I do agree there is a flaw in the Turing Test. Specifically, by the nature of its construction, it will permit us to classify a being as intelligent if it behaves like a human. From this we have to conclude that everything else is either not intelligent or at least not classifiable as intelligent without some added criterion.
This not only applies to the animals but to all other beings. Consider the scenario wherein we are visited by aliens that can talk to us, that can do incredibly complicated mathematics, even teach us a few things, and possess technologies way beyond our understanding such as a clearly engineered means of interstellar travel which they used to come to Earth. Would we consider these beings intelligent? We can all think of scenarios wherein the answer is "not necessarily" but in all likelihood we would agree that they are in fact intelligent. But how likely is it that the Turing test will apply?
Of course this problem applies to artificial beings as well, i.e. our computer programs. Have we already created an artificial intelligence? Some might argue we have with Cleverbot garnering 59.3% positive votes from 1,334 participants at the Techniche 2011 festival. Others would likely respond that the real turing test involves physical interaction, i.e. shaking hands with the being, and still not being able to discern a difference. This again highlights the problem.
A precise definition of intelligence would address this problem. However it would not only allow us to differentiate between intelligent and not and answer the question of whether we have already created an artificial intelligence. But it could allow for the development of metrics for comparing intelligences and even help us understand why our existing creations are not intelligent, if that is truly the case.
[1] Legg & Hutter, 2006, A Collection of Definitions of Intelligence, http://www.vetta.org/documents/A-Collection-of-Definitions-of-Intelligence.pdf
[2] Pfeifer, 1999, Understanding Intelligence
[3] Turing, 1950, Computing Machinery and Intelligence http://www.csee.umbc.edu/courses/471/papers/turing.pdf
[4] Russel and Norvig, 2009, Artificial Intelligence: A Modern Approach Third Edition
The question "what is intelligence?" is non-trivial. We have been seeking an answer for millennia. While many definitions have been offered [1] no single definition has really ever dominated. Even in the sixty or so years that we have been seriously studying how to create an artificial intelligence we have never actually formally defined intelligence. Ask 100 people to define it and you will likely receive 100 different definitions [1], [2]. The de facto standard is the Turing test developed by Alan Turing [3]. History tells us that he was worried about getting mired in a long drawn out philosophical debate which would likely prevent any progress on actually creating an artificially intelligent being.
The Turing Test as it has come to be known is a variation on a game known as the imitation game [2] wherein a participant, the interrogator, attempts to identify which of the other two participants, one male and one female, was in fact male. Of course the female's objective was to fool the interrogator. The crux of the game was that the decision had to be made solely from communication patterns. In other words, the interrogator did not meet nor could they see the other participants. Additionally, to avoid cues from writing styles, messages would be passed between them in an anonymous way, such as through a computer terminal.
In the Turing Test the objective is to identify the artificial being [4], the computer, as opposed to the male. The hypothesis being that if the interrogator cannot differentiate the artificial being and the human, the artificial being must necessarily be intelligent if we accept that humans are intelligent. This test is clever because it does not require a definition of intelligence nor a measure of intelligence other than agreement that humans are intelligent. However the Turing Test is a behavioral test. Not everyone accepts the test. One of the more well known opponents is John Searle, a professor of philosophy at the University of California, Berkeley. Dr. Searle offers the Chinese Room argument in counter to the Turing Test.
According to the Chinese Room argument we can construct a process that appears intelligent but in fact is not. We do so by placing a person in a room, particularly one that does not speak Chinese. The resident will receive messages from outside the room written in Chinese. The resident must then consult a set of instructions that, when followed, dictate the appropriate response. One, that to any outside observer, would have to have been written by someone that knows Chinese. Since the resident does not know Chinese it supposedly follows that intelligence had only been imitated by the process.
There are a number of counter arguments to the Chinese Room argument. Some argue that the analogy breaks down as a result of the fact that a human performing the processing would simply take too long. Others argue that the room itself is intelligent. But I digress.
While I don't personally accept the Chinese Room argument I do agree there is a flaw in the Turing Test. Specifically, by the nature of its construction, it will permit us to classify a being as intelligent if it behaves like a human. From this we have to conclude that everything else is either not intelligent or at least not classifiable as intelligent without some added criterion.
This not only applies to the animals but to all other beings. Consider the scenario wherein we are visited by aliens that can talk to us, that can do incredibly complicated mathematics, even teach us a few things, and possess technologies way beyond our understanding such as a clearly engineered means of interstellar travel which they used to come to Earth. Would we consider these beings intelligent? We can all think of scenarios wherein the answer is "not necessarily" but in all likelihood we would agree that they are in fact intelligent. But how likely is it that the Turing test will apply?
Of course this problem applies to artificial beings as well, i.e. our computer programs. Have we already created an artificial intelligence? Some might argue we have with Cleverbot garnering 59.3% positive votes from 1,334 participants at the Techniche 2011 festival. Others would likely respond that the real turing test involves physical interaction, i.e. shaking hands with the being, and still not being able to discern a difference. This again highlights the problem.
A precise definition of intelligence would address this problem. However it would not only allow us to differentiate between intelligent and not and answer the question of whether we have already created an artificial intelligence. But it could allow for the development of metrics for comparing intelligences and even help us understand why our existing creations are not intelligent, if that is truly the case.
[1] Legg & Hutter, 2006, A Collection of Definitions of Intelligence, http://www.vetta.org/documents/A-Collection-of-Definitions-of-Intelligence.pdf
[2] Pfeifer, 1999, Understanding Intelligence
[3] Turing, 1950, Computing Machinery and Intelligence http://www.csee.umbc.edu/courses/471/papers/turing.pdf
[4] Russel and Norvig, 2009, Artificial Intelligence: A Modern Approach Third Edition
20140308
Day One in Canada
I crossed the US-Canada border today.
The process was fast and simple enough. However many of the "facts" on my visa were wrong and the gentleman at the border had to fix them. Evidently my last name was "Dustin James Webb" and I had no first or middle names, I was listed as a mechanical engineer not a computer scientist, and I was destined for Calgary, Alberta, not Montreal, Quebec. Oh, and I came to Canada in 2002, not today. I guess all the paper work we submitted to the NY consulate was for show as was the processing time for our visas. And no, my identity was not stolen. I won't go into the details on how I know this though.
Shortly after leaving the border I stopped for food. Ironically the first place I saw was a Tim Hortons. Naturally I had soup and a coffee to combat the cold. Even given all the warnings from friends and family about just how cold it is here I was still not prepared. It is insanely cold. And yes, I consider 30-40 degrees + large windchill factor to be insanely cold. I don't look forward to sub-zero temperatures.
Unfortunately I lost internet access on my phone at the border. Apparently T-mobile does not offer it to their US customers through their local partner. Worse yet I have had horrible cell reception. Google maps cached the info to get from the border to Toronto. But that took me downtown and I was unable to get direction anywhere else at that point. As such I set out to find a gas station and a hotel which are both very difficult tasks without reliable means of communication. This would not have been a problem if I had actually let my wife book my hotel when she had intended. As it is I am paying nearly twice what I should be for a hotel tonight. C'est la vie!
I also had fun trying to fill my tank. For reasons I still don't understand the gas pumps at the station I found would not accept our credit card. So I went into the store to pay in advance. The attendant asked how much I wanted so asked the price. He said it was 1.50 CAD! I was astounded. I have been paying about $3.50 on average throughout this trip. But I shrugged it off and asked for $12 because our Prius only has an 8 gallon tank. It turns out they measure gas in litres here. Duh! Place this one in the category "should have seen that coming." Oh well, my tank is currently half full which is better than the gallon or so I had when I found the station.
Tomorrow, Montreal!
The process was fast and simple enough. However many of the "facts" on my visa were wrong and the gentleman at the border had to fix them. Evidently my last name was "Dustin James Webb" and I had no first or middle names, I was listed as a mechanical engineer not a computer scientist, and I was destined for Calgary, Alberta, not Montreal, Quebec. Oh, and I came to Canada in 2002, not today. I guess all the paper work we submitted to the NY consulate was for show as was the processing time for our visas. And no, my identity was not stolen. I won't go into the details on how I know this though.
Shortly after leaving the border I stopped for food. Ironically the first place I saw was a Tim Hortons. Naturally I had soup and a coffee to combat the cold. Even given all the warnings from friends and family about just how cold it is here I was still not prepared. It is insanely cold. And yes, I consider 30-40 degrees + large windchill factor to be insanely cold. I don't look forward to sub-zero temperatures.
Unfortunately I lost internet access on my phone at the border. Apparently T-mobile does not offer it to their US customers through their local partner. Worse yet I have had horrible cell reception. Google maps cached the info to get from the border to Toronto. But that took me downtown and I was unable to get direction anywhere else at that point. As such I set out to find a gas station and a hotel which are both very difficult tasks without reliable means of communication. This would not have been a problem if I had actually let my wife book my hotel when she had intended. As it is I am paying nearly twice what I should be for a hotel tonight. C'est la vie!
I also had fun trying to fill my tank. For reasons I still don't understand the gas pumps at the station I found would not accept our credit card. So I went into the store to pay in advance. The attendant asked how much I wanted so asked the price. He said it was 1.50 CAD! I was astounded. I have been paying about $3.50 on average throughout this trip. But I shrugged it off and asked for $12 because our Prius only has an 8 gallon tank. It turns out they measure gas in litres here. Duh! Place this one in the category "should have seen that coming." Oh well, my tank is currently half full which is better than the gallon or so I had when I found the station.
Tomorrow, Montreal!
20140116
Making Learning Fun with Electronics and Robotics
In my last two posts I discussed my thoughts on making learning fun. In the first post the vehicle was games while in second post the vehicle was scientific experimentation. Electronics and robotics seem to me another possible vehicle. While I have a fair bit of experience with these topics I have not done much with them as a educational tool.
I'm most excited about using the Lego Mindstroms. This is Lego's robotics kits. While it is recommended for kids ages 10 and up it actually allows for construction of real autonomous robots. It comes with several sensors for measuring features of the environment such as light intensity, color, distance to the nearest object, audio, and the rotations of it's own motors. It introduces children to programming using a language called NXT-G which is a visual programming language. Think programming via legos. And of course it's compatible with all things Lego.
I look forward to use the Mindstorms to teach everything from mechanics and programming to how to use sensors and basic motion planning techniques.
My motivation for using the Mindstorms as an educational tool comes from my experience volunteering for First Lego League (FLL). FLL is a program for children between 9 and 15 years of age that promotes science and technology. Each year the kids are given a topic about which they must learn. To aid in the learning process they are given a large game board with lots of challenges built out of Lego pieces. The kids must then build one or more robots to solve the challenges. FLL is part of a larger program called FIRST, but is my favorite because the robots made by the kids are actually truly autonomous. For several years now I have volunteered as a robot design judge and through that effort I have seen just how excited the kids can get about learning and solving real world problems.
My children are not yet old enough to participate in FLL. However my son and I have started a Jr. First Lego League (Jr.FLL) team. Jr.FLL is like FLL but shoots to teach the basics of design, mechanics, research, and team building. In fact he and his team will be showing off they have learned about natural disasters on January 25th (2014) at the University of Utah Student Union building. Please feel free to come talk to them. I must warn you though, the FLL finals will be going on at the same time so the place will be an absolute mad house.
An alternative to the Mindstorms are Bo & Yana by iPlay. They are meant to teach the basics of programming, sensing, and actuation. We have not received ours yet but they look promising and are even compatible with other systems like the Mindstorms which should allow for a simple transition when the time is right.
Still another alternative are the solutions from Modular Robotics called Cubelets and their latest product called MOSS. These are just cubes with basic sensing and actuation capabilities that snap together using magnets. But in connecting them one is making simple robots. Unfortunately the MOSS Kickstarter came and went before I could get involved. If anyone has these, I would be interested in hearing about your experience with them. Specifically MOSS.
I'm most excited about using the Lego Mindstroms. This is Lego's robotics kits. While it is recommended for kids ages 10 and up it actually allows for construction of real autonomous robots. It comes with several sensors for measuring features of the environment such as light intensity, color, distance to the nearest object, audio, and the rotations of it's own motors. It introduces children to programming using a language called NXT-G which is a visual programming language. Think programming via legos. And of course it's compatible with all things Lego.
I look forward to use the Mindstorms to teach everything from mechanics and programming to how to use sensors and basic motion planning techniques.
My motivation for using the Mindstorms as an educational tool comes from my experience volunteering for First Lego League (FLL). FLL is a program for children between 9 and 15 years of age that promotes science and technology. Each year the kids are given a topic about which they must learn. To aid in the learning process they are given a large game board with lots of challenges built out of Lego pieces. The kids must then build one or more robots to solve the challenges. FLL is part of a larger program called FIRST, but is my favorite because the robots made by the kids are actually truly autonomous. For several years now I have volunteered as a robot design judge and through that effort I have seen just how excited the kids can get about learning and solving real world problems.
My children are not yet old enough to participate in FLL. However my son and I have started a Jr. First Lego League (Jr.FLL) team. Jr.FLL is like FLL but shoots to teach the basics of design, mechanics, research, and team building. In fact he and his team will be showing off they have learned about natural disasters on January 25th (2014) at the University of Utah Student Union building. Please feel free to come talk to them. I must warn you though, the FLL finals will be going on at the same time so the place will be an absolute mad house.
An alternative to the Mindstorms are Bo & Yana by iPlay. They are meant to teach the basics of programming, sensing, and actuation. We have not received ours yet but they look promising and are even compatible with other systems like the Mindstorms which should allow for a simple transition when the time is right.
Still another alternative are the solutions from Modular Robotics called Cubelets and their latest product called MOSS. These are just cubes with basic sensing and actuation capabilities that snap together using magnets. But in connecting them one is making simple robots. Unfortunately the MOSS Kickstarter came and went before I could get involved. If anyone has these, I would be interested in hearing about your experience with them. Specifically MOSS.
Of course to build a robot it helps to know something about electronics. One need not be an expert by any means but it helps to be able to build simple circuits. A few years ago I encountered a method for teaching children about circuits called Squishy Circuits. The foundation of this idea is to use "playdough", i.e. modeling compound, to make circuits. It turns out that if you make a modeling compound using a salt base it conducts electricity. Conversely, if you make a modeling compound with a sugar base it does not conduct electricity. As such you can make small sculptures from the two different types. Circuits can then be formed by connecting conductive portions of the sculpture with discrete components like a battery pack and LEDs.
There are a lot of other solutions out there for teaching children about electrics and circuits but I have no experience with any of them. Some of the ones I have found are:
Again, if you have any experience with these I would like to hear your thoughts.
20140108
Making Learning Fun with Experiments
In my last post I talked about how to take advantage of games to make learning fun. By no means is this an original idea. In fact it's rather obvious. Another approach which is probably again pretty obvious is to do experiments.
Their are numerous sites describing fun experiments. One that everyone seems to know is the classic baking-soda-vinegar volcano. For anyone that may be unfamiliar you take something like dirt or clay and sculpt a volcanic cone with an extra deep caldera. From there you pour in some baking-powder into the caldera. Finally you pour in some vinegar. The baking soda and vinegar react and discharge carbon dioxide in the form of bubbles that are heavier than air so, when done correctly, the bubbles overflow the volcano and spill down the sides much like a lava flow from a real volcano would.
This experiment is a great experiment because it opens the door to talking about all kinds of things from the structure of the earth, to how volcanoes form, to how volcanos can lead to other natural disasters like earth quakes and tsunamis, how pyroclastic flow can in a way preserve whatever it hits. For us the volcano devolved to just mixing baking soda and vinegar. After all, who doesn't like watching a vigorous chemical reaction? Even this is great though as it opens the door for talking about things like pressure, surface tension, and chemistry. In a similar vein, the Coke and Mentos experiment is always fun to do. Last I read the reaction wasn't well understood but it's clear that the process is releasing a lot of gas in short order.
Another experiment we have had fun with is the basic electromagnet. Again for those that are unfamiliar you wrap a length of wire around something like an iron bolt and connect the two ends of the wire to the opposite ends of a battery. It is important that the object around which you wrap the wire is ferrous. We usually call this object the core. The movement of the electrons through the wire then produces an electromagnetic field which is amplified by whatever you use for your core. From there you can use whatever other magnetic objects you have lying around to show the formation and destruction of the magnetic field as you connect and disconnect the battery.
It is not necessary for the experiment to seem obviously fun though. Take for instance testing soil types. In this experiment you gather a couple of soil samples from different places. Potting soil and dirt from outside are great. You put the potting soil in a jar, the dirt in another, and then mix of both into yet a third. Then fill the jars with water, cap them, and shake. What do you get? Mud! Of course the educational part comes from the discussion that ensues when everything settles and talking about how long it takes to settle. My son and I played with this experiment for a couple of days.
As I eluded to earlier, the list of possible experiments is endless. They often lead to the same discussions but that doesn't make them any less fun. To close out this post I will leave you with some links to other particularly fun experiments:
Their are numerous sites describing fun experiments. One that everyone seems to know is the classic baking-soda-vinegar volcano. For anyone that may be unfamiliar you take something like dirt or clay and sculpt a volcanic cone with an extra deep caldera. From there you pour in some baking-powder into the caldera. Finally you pour in some vinegar. The baking soda and vinegar react and discharge carbon dioxide in the form of bubbles that are heavier than air so, when done correctly, the bubbles overflow the volcano and spill down the sides much like a lava flow from a real volcano would.
This experiment is a great experiment because it opens the door to talking about all kinds of things from the structure of the earth, to how volcanoes form, to how volcanos can lead to other natural disasters like earth quakes and tsunamis, how pyroclastic flow can in a way preserve whatever it hits. For us the volcano devolved to just mixing baking soda and vinegar. After all, who doesn't like watching a vigorous chemical reaction? Even this is great though as it opens the door for talking about things like pressure, surface tension, and chemistry. In a similar vein, the Coke and Mentos experiment is always fun to do. Last I read the reaction wasn't well understood but it's clear that the process is releasing a lot of gas in short order.
Another experiment we have had fun with is the basic electromagnet. Again for those that are unfamiliar you wrap a length of wire around something like an iron bolt and connect the two ends of the wire to the opposite ends of a battery. It is important that the object around which you wrap the wire is ferrous. We usually call this object the core. The movement of the electrons through the wire then produces an electromagnetic field which is amplified by whatever you use for your core. From there you can use whatever other magnetic objects you have lying around to show the formation and destruction of the magnetic field as you connect and disconnect the battery.
It is not necessary for the experiment to seem obviously fun though. Take for instance testing soil types. In this experiment you gather a couple of soil samples from different places. Potting soil and dirt from outside are great. You put the potting soil in a jar, the dirt in another, and then mix of both into yet a third. Then fill the jars with water, cap them, and shake. What do you get? Mud! Of course the educational part comes from the discussion that ensues when everything settles and talking about how long it takes to settle. My son and I played with this experiment for a couple of days.
As I eluded to earlier, the list of possible experiments is endless. They often lead to the same discussions but that doesn't make them any less fun. To close out this post I will leave you with some links to other particularly fun experiments:
- Rock Candy: This one takes a bit longer but you get a treat in the end.
- Fluorescent Jello: Not so tasty, but it glows in the dark!
- Squishy Circuits: This is great for introducing children to both chemistry and electronics.
20140101
Making Learning Fun with Games
In the last few days I have had a couple of conversations with friends about teaching children. These conversations have inspired me to write a bit about my thoughts on the topic. My experience basically comes from teaching my own son. I strongly believe in the need for parents to supplement their childs education. To the point that I try to work with my kids a little bit every day.
As anyone with children will likely tell you it can be difficult at times to maintain their interest. Even if you are incredibly passionate about a topic it can be challenging to imbue them with that passion. One thing I have noticed while working with my son is that he gets excited when the solutions come easily. Conversely, failure to immediately understand quickly leads to disinterest. This would seem to imply a need for instant gratification. For that reason I often seek ways of removing that need or replacing that need in some way.
One obvious but still great method to address this problem while still providing a lesson is through games. Any gamer will tell you as much. Not just because they are attempting to justify their pastime but because any games provide myriad lessons in the guise of entertainment. Two of my favorite games are DragonBox and LightBot.
DragonBox teaches the principles of algebra without focusing on the mathematical foundations. It simply challenges the child with a puzzle that involves isolating an object from a set of others using the rules of algebra. Early in the game it doesn't even use numbers, just pictures, so that the child may focus on the rules. Unfortunately there isn't enough content. My son has beat this game numerous times and basically lost interest.
LightBot teaches the basics of programming. The objective is to get a robot to turn on lights placed throughout an environment. The crux is that the series of commands needed to execute the task must be provided before the robot ever does anything. As with all games it starts off simply and increases in complexity. In this case the complexity comes from restricting the number of commands the player can use, requiring the use of subprocedures, requiring the application of recursion, and the like.
Another game we have been playing is from MindSnacks. Specifically we've been studying French to help our son prepare for entry into the Montreal educational system where at least a third of the class is taught strictly in French. In total it has nine subgames but only permits the child access to two at the beginning. The child must gain levels to unlock the others. It also focuses the child on certain aspects of the topic of study. In the case of French, and probably the other languages it supports, the topics include numbers, colors, days of the week, and greetings for a total of 50 different topics.
Of course games don't have to be deemed educational to in fact be educational. One of my son's favorite games is Minecraft. He prefers creative mode and will play for hours constructing little houses and zoos for all the animals he hatches. I don't particularly care for the game myself but it has a lot of great educational aspects to it. For instance it is great for talking about Geometry, from the different types of shapes we study to the difference between 1D, 2D, and 3D. Because it is in part focused on crafting it also offers a segue into talking about how real things are made.
Another "non-educational" game that I like is StarMade. This one is inspired by Minecraft but takes place in space. The objective is to make a spacecraft and fly it around collecting materials and fighting space pirates. I particularly like this one because it is more challenging than Minecraft but my son finds it interesting enough to work through the challenges. For instance, he would prefer to play and have to practice his reading to accomplish his goal than not. This is significant because he has not yet found that reading for the sake of reading is fun. It also offers additional lessons to those found in Minecraft. For instance, building a spacecraft requires an understanding of the different parts including the different computers required (e.g. control computer, weapons computers) to engines and shielding.
Games are not the only method for making learning fun. I also like to use experimentation to bring lessons to life but I'll talk more about this in my next entry. I have also been looking for a way to introduce my son to real world electronics and robotics. As part of this we have created a Jr. FLL but this is limited to simple machines and designing solutions. There are a lot of products being made to go beyond this which I will also discuss later.
As anyone with children will likely tell you it can be difficult at times to maintain their interest. Even if you are incredibly passionate about a topic it can be challenging to imbue them with that passion. One thing I have noticed while working with my son is that he gets excited when the solutions come easily. Conversely, failure to immediately understand quickly leads to disinterest. This would seem to imply a need for instant gratification. For that reason I often seek ways of removing that need or replacing that need in some way.
One obvious but still great method to address this problem while still providing a lesson is through games. Any gamer will tell you as much. Not just because they are attempting to justify their pastime but because any games provide myriad lessons in the guise of entertainment. Two of my favorite games are DragonBox and LightBot.
DragonBox teaches the principles of algebra without focusing on the mathematical foundations. It simply challenges the child with a puzzle that involves isolating an object from a set of others using the rules of algebra. Early in the game it doesn't even use numbers, just pictures, so that the child may focus on the rules. Unfortunately there isn't enough content. My son has beat this game numerous times and basically lost interest.
LightBot teaches the basics of programming. The objective is to get a robot to turn on lights placed throughout an environment. The crux is that the series of commands needed to execute the task must be provided before the robot ever does anything. As with all games it starts off simply and increases in complexity. In this case the complexity comes from restricting the number of commands the player can use, requiring the use of subprocedures, requiring the application of recursion, and the like.
Another game we have been playing is from MindSnacks. Specifically we've been studying French to help our son prepare for entry into the Montreal educational system where at least a third of the class is taught strictly in French. In total it has nine subgames but only permits the child access to two at the beginning. The child must gain levels to unlock the others. It also focuses the child on certain aspects of the topic of study. In the case of French, and probably the other languages it supports, the topics include numbers, colors, days of the week, and greetings for a total of 50 different topics.
Of course games don't have to be deemed educational to in fact be educational. One of my son's favorite games is Minecraft. He prefers creative mode and will play for hours constructing little houses and zoos for all the animals he hatches. I don't particularly care for the game myself but it has a lot of great educational aspects to it. For instance it is great for talking about Geometry, from the different types of shapes we study to the difference between 1D, 2D, and 3D. Because it is in part focused on crafting it also offers a segue into talking about how real things are made.
Another "non-educational" game that I like is StarMade. This one is inspired by Minecraft but takes place in space. The objective is to make a spacecraft and fly it around collecting materials and fighting space pirates. I particularly like this one because it is more challenging than Minecraft but my son finds it interesting enough to work through the challenges. For instance, he would prefer to play and have to practice his reading to accomplish his goal than not. This is significant because he has not yet found that reading for the sake of reading is fun. It also offers additional lessons to those found in Minecraft. For instance, building a spacecraft requires an understanding of the different parts including the different computers required (e.g. control computer, weapons computers) to engines and shielding.
Games are not the only method for making learning fun. I also like to use experimentation to bring lessons to life but I'll talk more about this in my next entry. I have also been looking for a way to introduce my son to real world electronics and robotics. As part of this we have created a Jr. FLL but this is limited to simple machines and designing solutions. There are a lot of products being made to go beyond this which I will also discuss later.
20130825
Musings on Robotic Proprioception
Proprioception is the sense of the relative positions and orientations of ones own body and its composing parts. How does our nervous system calculate these estimations? We don't even know how the data is represented in the nervous system.
It seems to me that if multiple sensors of the same type are used then each of their individual estimates could be filtered together to improve the estimation. For instance, imagine measuring the resistance across a stretchable conductive fabric. The resistance in such a product increases as it's stretched allowing an estimation of its length. If several pieces are attached between two links then the combination of the values could be used to estimate the relative orientations of the links under certain conditions. Furthermore, filtering the data from multiple sensors should result in cross sensor noise cancellation. Of course a model of how the values change given any given state of the joint would be necessary. However the model need not be known a priori as a regressor could be used to learn the model.
Recently someone, I don't recall who, stated that they had read that a baby's tendency to put its appendages in its mouth was a form of calibration. (If you know of any literature on this, please let me know.) The idea at least makes intuitive sense because such actions would provide additional information about the relation of two body parts. For instance, when standing, one cannot touch their toes with their hands if they do not bend at the waist. However our finger tips can reach to just a bit above our knee which tells us that our shoulder and thigh are closer together than our shoulder and our feet. Of course we can literally see this fact too.
What might be some strategies to learning a model of ones self from nothing? In other words, what actions can be performed to gather information about ourselves and what do the actions tell us?
[1] Blakeslee, Sandra (2007). The Body has a Mind of its Own. Random House LLC.
It seems to me that if multiple sensors of the same type are used then each of their individual estimates could be filtered together to improve the estimation. For instance, imagine measuring the resistance across a stretchable conductive fabric. The resistance in such a product increases as it's stretched allowing an estimation of its length. If several pieces are attached between two links then the combination of the values could be used to estimate the relative orientations of the links under certain conditions. Furthermore, filtering the data from multiple sensors should result in cross sensor noise cancellation. Of course a model of how the values change given any given state of the joint would be necessary. However the model need not be known a priori as a regressor could be used to learn the model.
Recently someone, I don't recall who, stated that they had read that a baby's tendency to put its appendages in its mouth was a form of calibration. (If you know of any literature on this, please let me know.) The idea at least makes intuitive sense because such actions would provide additional information about the relation of two body parts. For instance, when standing, one cannot touch their toes with their hands if they do not bend at the waist. However our finger tips can reach to just a bit above our knee which tells us that our shoulder and thigh are closer together than our shoulder and our feet. Of course we can literally see this fact too.
What might be some strategies to learning a model of ones self from nothing? In other words, what actions can be performed to gather information about ourselves and what do the actions tell us?
- Moving randomly would give a sense of what commands move what parts. This would be the start of a dynamic model. It would provide information about how quickly a given part can be moved. It would also give some kinematic information because the movement of one body part would be felt in neighbouring body parts. It would even give information as to the extent of influence moving one part has on another, at least in relative terms. For instance moving the shoulder quickly in a circle would induce torques on the elbow as a result of the lower arm swinging around, controlled or otherwise. It would also induce torques in the upper torso but because the mass of the upper torso is higher than that of the lower arm one would expect the lower arm to be impacted more in a sense.
- As previously discussed, touching two separate body parts provides additional information. Such information contributes to a kinematic model. One question that arises is, how does one know when contact is made? Is there only a temporal correlation or can two nerves, not normally connected, form some sort of temporary connection? Certainly not a chemical connection but are there nerves that sense a change in conductivy?
Such contact may or may not be intentional. Intentionally creating a contact would in effect be a test of the hypothesis of the various parameters involved. This could be done at random or strategically in which case learning may be sped up.
Either way, such values could only be relative values without some form of a priori knowledge. For instance, touching ones hip , and knowing approximately how the elbow is bent, only gives one a sense of how far from the shoulder their hip is located. However if two pieces of information are know, such as the distance from the shoulder to the hip and the length of one of the arm links, then the other components can be solved for in closed form. Humans don't so much have this ability because we don't know the lengths of the various components of our body. - Contacting the environment can provide information in a number of ways. For instance we know that contact with a stationary object eliminates drift in our sense of balance [1] . We also know that proprioception and vision work together, we call this hand-eye coordination. Tapping on an object provides another example. Tapping results in the nerves in our ears being activated at the same time our finger contacts the environment. This goes back to Dr. V.s Ramachandran TED talk where he discusses how the mind draws correlations between sounds and visual constructs called a cross-model synesthetic abstraction.
[1] Blakeslee, Sandra (2007). The Body has a Mind of its Own. Random House LLC.
20130213
Strategies to picking research projects
Just the other night I submitted the final copy of Kinodynamic RRT*: Optimal Path Planning for Systems with Linear Differential Constraints to ICRA 2013. Doing so inspired several ideas for extending the work. Of course they run the gamut -- some interesting, most not. But then how do you tell what is a potential interesting research idea versus what isn't?
I spoke to my advisor about a couple of these ideas. Curiously he was more interested in the one that I thought was the least interesting of the two. This has made me really focus on the question of what makes a good research idea. I realize that he has more experience than I so it's not a surprise that we disagreed. But to become a good researcher one needs some ability to determine what makes an idea interesting, right?
I also realize that this is not an original question and I'm certain that a quick search would yield a great number of results on the topic. But I'm more interested in first hearing your thoughts on the topic. So, if you would, please tell me how you decide whether an idea is worth pursuing?
I spoke to my advisor about a couple of these ideas. Curiously he was more interested in the one that I thought was the least interesting of the two. This has made me really focus on the question of what makes a good research idea. I realize that he has more experience than I so it's not a surprise that we disagreed. But to become a good researcher one needs some ability to determine what makes an idea interesting, right?
I also realize that this is not an original question and I'm certain that a quick search would yield a great number of results on the topic. But I'm more interested in first hearing your thoughts on the topic. So, if you would, please tell me how you decide whether an idea is worth pursuing?
20121225
The Webb's are Okay
On December 24th at about 10PM my family and I were T-boned on our way home from my mother's but we are all okay.
I was in the front passenger seat and Darliegh was driving. We were in the lane adjacent the HOV lane. I had just finished reading, closed the book, shut off my reading light, and looked over to see a white Blazer take a hard left in the far right lane. I yelled at Darliegh to watch out but I don't think she even had time to register what I was saying before the passenger side headlight of the other vehicle met the point where our front passenger fender and front passenger door come together.
My son was asleep at the time of impact and suffice it to say the event woke him and completely freaked him out. He began yelling fairly immediately which made us worry that he was hurt. I had to force my door open and then his to get him out.
My daughter was also asleep at the time of the impact. Surprisingly it did not phase her. She did not even wake up.
Our vehicle settled in the HOV lane. After making sure that Darliegh and the kids were okay I ran across the freeway to check on the passengers of the other vehicle. When I got there I met three people. Two were witnesses that saw the accident and stopped to offer assistance. These are truly good people and I deeply appreciate their kindness.
The other person I met claimed to be the passenger of the Blazer and that the driver ran off. However there were no other foot prints in the snow leaving the vehicle and one of the witnesses believes he saw the man exit from the drivers side of the vehicle. Myself and at least one of the witnesses smelled alcohol on the man but he appeared completely sober so I don't believe this was the initial cause of the accident. It appeared to me that he hit a patch of ice and lost control. Of course it could have played a role in his ability retain or regain contorl. Assuming he was actually the driver.
It took a long time for the first sheriff to arrive. While waiting a passing EMT stopped and offered assistance. I told her I would be grateful if she would check out my children so she ran across the freeway and did so. She also checked out Darliegh and saw nothing concerning.
Also while waiting I called 911 again to ask if there was a way to get my family off the freeway while we waited. Instead of answering the question the operator decided to berate me stating "I told you and your wife to get back in your car." A suggestion I believed to be completely ill-advised and that I was not willing to do given the state of the car.
Unfortunately as the first officer arrived on the seen the unidentified man from the other car walked away. For reasons I don't understand the officer felt it was more important to chase the man down rather than help get my family off the freeway. At this point we do not know whether they found him or the supposed driver.
Awhile later a second sheriff showed up. I expressed my concern for my families' safety to her and asked what could be done to get my family off the freeway. She said she needed to go over there and then ended up sitting there in her vehicle while we awaited yet another officer.
When the third officer arrived one of the witnesses and I approached his vehicle and spoke with him. The witness pointed out that the first officer was chasing down the driver of the Blazer. I told him I was from the car still sitting in the middle of the freeway and that I had ran across the freeway. I also told him I was worried for the safety of my family. He asked the witnesses for statements and proceeded to check out the other vehicle.
A bit later a fire truck and ambulance showed up. When I saw them I realized I should fill out a statement and asked the third officer for a form to fill out in case I needed to leave in the ambulance. He responded "Oh, I thought you already filled one out. Which vehicle were you with?" I pointed to our car at which point he asked "how did you get over here?" Suffice it to say this annoyed me, but I repeated myself anyway. Instead of giving me a statement form he decided to lecture me on the dangers of running across the freeway. I found this even more frustrating since it was wasting time. At this point I noted that we were off topic and repeated my request for a form.
Fortunately the EMTs did not feel it was necessary to go to the hospital though they did not check out Darliegh or myself, again for reasons I do not understand.
Finally after an hour the officers notified me that we should call someone to pick us up because they did not have enough space in there vehicles. A statement I found completely confusing given that they had six empty seats between there two cars. Fortunately for us our friend Alisha was willing to come pick us up at 11:30 on Christmas eve. One of the witnesses was also kind enough to offer us a ride much earlier but I told her that I thought we would be going to the hospital and thanked her for her kindness and told her that I did not want to make her wait around. She had already gone out of her way and her family was at home waiting for her.
I am thoroughly disappointed in the way this situation was handled by the emergency personnel but more importantly I am ecstatic that my family is okay.
I was in the front passenger seat and Darliegh was driving. We were in the lane adjacent the HOV lane. I had just finished reading, closed the book, shut off my reading light, and looked over to see a white Blazer take a hard left in the far right lane. I yelled at Darliegh to watch out but I don't think she even had time to register what I was saying before the passenger side headlight of the other vehicle met the point where our front passenger fender and front passenger door come together.
My son was asleep at the time of impact and suffice it to say the event woke him and completely freaked him out. He began yelling fairly immediately which made us worry that he was hurt. I had to force my door open and then his to get him out.
My daughter was also asleep at the time of the impact. Surprisingly it did not phase her. She did not even wake up.
Our vehicle settled in the HOV lane. After making sure that Darliegh and the kids were okay I ran across the freeway to check on the passengers of the other vehicle. When I got there I met three people. Two were witnesses that saw the accident and stopped to offer assistance. These are truly good people and I deeply appreciate their kindness.
The other person I met claimed to be the passenger of the Blazer and that the driver ran off. However there were no other foot prints in the snow leaving the vehicle and one of the witnesses believes he saw the man exit from the drivers side of the vehicle. Myself and at least one of the witnesses smelled alcohol on the man but he appeared completely sober so I don't believe this was the initial cause of the accident. It appeared to me that he hit a patch of ice and lost control. Of course it could have played a role in his ability retain or regain contorl. Assuming he was actually the driver.
It took a long time for the first sheriff to arrive. While waiting a passing EMT stopped and offered assistance. I told her I would be grateful if she would check out my children so she ran across the freeway and did so. She also checked out Darliegh and saw nothing concerning.
Also while waiting I called 911 again to ask if there was a way to get my family off the freeway while we waited. Instead of answering the question the operator decided to berate me stating "I told you and your wife to get back in your car." A suggestion I believed to be completely ill-advised and that I was not willing to do given the state of the car.
Unfortunately as the first officer arrived on the seen the unidentified man from the other car walked away. For reasons I don't understand the officer felt it was more important to chase the man down rather than help get my family off the freeway. At this point we do not know whether they found him or the supposed driver.
Awhile later a second sheriff showed up. I expressed my concern for my families' safety to her and asked what could be done to get my family off the freeway. She said she needed to go over there and then ended up sitting there in her vehicle while we awaited yet another officer.
When the third officer arrived one of the witnesses and I approached his vehicle and spoke with him. The witness pointed out that the first officer was chasing down the driver of the Blazer. I told him I was from the car still sitting in the middle of the freeway and that I had ran across the freeway. I also told him I was worried for the safety of my family. He asked the witnesses for statements and proceeded to check out the other vehicle.
A bit later a fire truck and ambulance showed up. When I saw them I realized I should fill out a statement and asked the third officer for a form to fill out in case I needed to leave in the ambulance. He responded "Oh, I thought you already filled one out. Which vehicle were you with?" I pointed to our car at which point he asked "how did you get over here?" Suffice it to say this annoyed me, but I repeated myself anyway. Instead of giving me a statement form he decided to lecture me on the dangers of running across the freeway. I found this even more frustrating since it was wasting time. At this point I noted that we were off topic and repeated my request for a form.
Fortunately the EMTs did not feel it was necessary to go to the hospital though they did not check out Darliegh or myself, again for reasons I do not understand.
Finally after an hour the officers notified me that we should call someone to pick us up because they did not have enough space in there vehicles. A statement I found completely confusing given that they had six empty seats between there two cars. Fortunately for us our friend Alisha was willing to come pick us up at 11:30 on Christmas eve. One of the witnesses was also kind enough to offer us a ride much earlier but I told her that I thought we would be going to the hospital and thanked her for her kindness and told her that I did not want to make her wait around. She had already gone out of her way and her family was at home waiting for her.
I am thoroughly disappointed in the way this situation was handled by the emergency personnel but more importantly I am ecstatic that my family is okay.
20120530
Reflections of ICRA 2012 and ROScon 2012 -- Part II
"I don't want it. I just need it. To feel, to breathe, to know I'm alive." --Tool, Stinkfist
In this post I'm continuing to reflect on my experiences at at ICRA 2012 and ROScon 2012. Hence the name. If you have not read the previous post you may wish to do so as it will provide some context.
In the last post I mentioned my surprise by the number of ideas spawned by the numerous talks I saw and the conversations I had. While I can observe that I found the conferences very inspirational that doesn't do it justice. Truth be told I came back with a bit of research fever.
To manage my thoughts at the conferences I found it helpful, even necessary, to keep my notebook on hand. The initial intent was to keep track of questions that arose, of which there were plenty. But I ended up keep track of a number of other things.
For example I ended up making a "todo" list with many of the items being of the ilk "learn more about ..." and "what is ...?" The remaining items were related to projects I need to finish. Player/ROS drivers I have started but not submitted for example. Suffice it to say it's going to take some time to make it through this list.
I also started a list of new research ideas. This list wasn't as long as the other lists and obviously these ideas weren't all great. My thought was that in writing them down I could review them later and gauge them with a clearer head. Looking back at them most are just okay. However I like the idea of this list and plan to keep a copy readily available from now on. This blog was supposed to be in part a way for me to clarify my ideas but it doesn't make a good repository of random thoughts.
At this point I feel like I'm rambling and my mind keeps wandering back to a proof that I have been working on so I'm going to sign off for now.
In this post I'm continuing to reflect on my experiences at at ICRA 2012 and ROScon 2012. Hence the name. If you have not read the previous post you may wish to do so as it will provide some context.
In the last post I mentioned my surprise by the number of ideas spawned by the numerous talks I saw and the conversations I had. While I can observe that I found the conferences very inspirational that doesn't do it justice. Truth be told I came back with a bit of research fever.
To manage my thoughts at the conferences I found it helpful, even necessary, to keep my notebook on hand. The initial intent was to keep track of questions that arose, of which there were plenty. But I ended up keep track of a number of other things.
For example I ended up making a "todo" list with many of the items being of the ilk "learn more about ..." and "what is ...?" The remaining items were related to projects I need to finish. Player/ROS drivers I have started but not submitted for example. Suffice it to say it's going to take some time to make it through this list.
I also started a list of new research ideas. This list wasn't as long as the other lists and obviously these ideas weren't all great. My thought was that in writing them down I could review them later and gauge them with a clearer head. Looking back at them most are just okay. However I like the idea of this list and plan to keep a copy readily available from now on. This blog was supposed to be in part a way for me to clarify my ideas but it doesn't make a good repository of random thoughts.
At this point I feel like I'm rambling and my mind keeps wandering back to a proof that I have been working on so I'm going to sign off for now.
20120521
Reflections of ICRA 2012 and ROScon 2012 -- Part I
"Teeter between tired and really really tired. I'm wiped and I'm wired but I guess it's just as well." --Ani DiFranco, Swan Dive
This quote describes, very well, an aspect of conferences I did not fully appreciate until spending the past week in St. Paul Minnesotta. Specifically I learned that they are as much about networking as anything else.
But let me back up. My advisor Dr. Jur van den Berg sent my colleagues and I to St. Paul Minnesota to see the state of the art in robotics and to meet others in our respective fields. Monday through Friday we attended the International Conference on Robotics and Automation (ICRA). On Saturday and Sunday we attended ROScon, a conference on Robot Operating System (ROS).
Going in it seems obvious that one would meet a lot of people as research often involves collaboration. However, and maybe I'm alone in this revelation, but I underestimated the amount of time I would spend meeting new people and learning about their work. I guess I expected to meet a few people whose interests align with mine and this occurred. I did not expect to be awake from 7:30 AM until about 2:00 AM the next morning everyday.
Even with the lack of sleep I felt quite good. A couple cups of coffee in the morning to wake up and a few beers each night to ensure I rested well and I was raring to go. I think there was an additional dimension to this though. I did not expect the sheer number of "new" ideas spawned by seeing what others were doing (I qualify because not having done a literature review one cannot be certain whether any given idea is in fact new). With this came something of a high.
I don't believe I was the only one feeling this way though. A very common question was "so, what do yo do?" Granted this is a classic small talk question, but what better way is there to seek out new ideas? Suffice it to say that by the end of the week I felt almost choreographed in my response, save for the minor variations that arose based on the specialty of the person I was speaking with at any given moment.
From all this I met a lot of great people. Several that I have idolized, some with which I hope to collaborate, and a whole lot I'm glad to call friend. Thank you for making this past week so fun.
This quote describes, very well, an aspect of conferences I did not fully appreciate until spending the past week in St. Paul Minnesotta. Specifically I learned that they are as much about networking as anything else.
But let me back up. My advisor Dr. Jur van den Berg sent my colleagues and I to St. Paul Minnesota to see the state of the art in robotics and to meet others in our respective fields. Monday through Friday we attended the International Conference on Robotics and Automation (ICRA). On Saturday and Sunday we attended ROScon, a conference on Robot Operating System (ROS).
Going in it seems obvious that one would meet a lot of people as research often involves collaboration. However, and maybe I'm alone in this revelation, but I underestimated the amount of time I would spend meeting new people and learning about their work. I guess I expected to meet a few people whose interests align with mine and this occurred. I did not expect to be awake from 7:30 AM until about 2:00 AM the next morning everyday.
Even with the lack of sleep I felt quite good. A couple cups of coffee in the morning to wake up and a few beers each night to ensure I rested well and I was raring to go. I think there was an additional dimension to this though. I did not expect the sheer number of "new" ideas spawned by seeing what others were doing (I qualify because not having done a literature review one cannot be certain whether any given idea is in fact new). With this came something of a high.
I don't believe I was the only one feeling this way though. A very common question was "so, what do yo do?" Granted this is a classic small talk question, but what better way is there to seek out new ideas? Suffice it to say that by the end of the week I felt almost choreographed in my response, save for the minor variations that arose based on the specialty of the person I was speaking with at any given moment.
From all this I met a lot of great people. Several that I have idolized, some with which I hope to collaborate, and a whole lot I'm glad to call friend. Thank you for making this past week so fun.
20110925
Technology Failures
I realize I am a bit late in posting this week but my mind has been on my research which isn't sufficiently mature to discuss here. Tonight my mind is on technology failures. I seem to be plagued with them at the moment. In fact I'm currently using my wife's machine to write this because my own laptop is in the shop getting a new motherboard. Initially they told me it shouldn't take more than 3 days to fix however when I dropped it off this evening they said it will probably be ready tomorrow, so that's a good thing. In fact even though my machine has had four failures in the two and a half years since I purchased it I have been extremely pleased with it. This stems from the fact that the OS is incredibly intuitive, mostly, and Apple is extremely efficient at fixing hardware issues.
I find myself a little less thrilled about my Galaxy Tab 10.1 lately. This is mostly because the E-mail and calendar clients leave a lot to be desired. This is partly the fault of the IT staff at the U. Recently they changed their security policy so as to require a great deal of security control over my tablet. I would understand this better if they weren't targeting Android devices alone. As a result of this policy change I decided to use Gmail as my U-mail client. While this works great from the Gmail web client it doesn't work as well from the Gmail Android app. Specifically it doesn't allow me to send E-mails via my U-mail account. With a little research I found a great number of people have the same issue and the "fixes" are kludgy at best and often ineffective as in my case.
The Google calendar app on the tablet has its own unique issues. First while you can add meetings via the app they are not sent back to Google. Secondly the calendar app believes the current time is seven hours earlier than is actually the case. You're probably thinking something along the lines of "well, just adjust your timezone." I thought of that and it actually corrects the issue. However it reschedules all meetings accordingly. Worse yet those changes get sent back to Google.
Truth be told, I bought the tablet to make it easier to carry and read the myriad papers I need to get through and it has served this purpose well. I'm not even certain where the fault lies, e.g. with Google or Samsung, since these issues only started occurring after the last update from Samsung.
Unfortunately the problems aren't confined to my personal machines. We just purchased two nice machines for the Algorithmic Robotics Lab. However one of them is suffering fromperformance issues for reasons we have not yet identified.
Don't get me wrong, all these issues are relatively minor and can be worked around. However we it makes me wonder about they types of errors that will arise as a result of integrating machine learning into our lives. I won't speculate as to what could occur. The list of possibilities is extensive I'm sure. Though I will say that I'm not talking about the robot apocalypse here. If you are concerned about such an event then I suggest reading the Willow Garage blog entry entitled Averting the Robot Uprising. Actually I suggest reading it anyway as it's quite humorous.
I find myself a little less thrilled about my Galaxy Tab 10.1 lately. This is mostly because the E-mail and calendar clients leave a lot to be desired. This is partly the fault of the IT staff at the U. Recently they changed their security policy so as to require a great deal of security control over my tablet. I would understand this better if they weren't targeting Android devices alone. As a result of this policy change I decided to use Gmail as my U-mail client. While this works great from the Gmail web client it doesn't work as well from the Gmail Android app. Specifically it doesn't allow me to send E-mails via my U-mail account. With a little research I found a great number of people have the same issue and the "fixes" are kludgy at best and often ineffective as in my case.
The Google calendar app on the tablet has its own unique issues. First while you can add meetings via the app they are not sent back to Google. Secondly the calendar app believes the current time is seven hours earlier than is actually the case. You're probably thinking something along the lines of "well, just adjust your timezone." I thought of that and it actually corrects the issue. However it reschedules all meetings accordingly. Worse yet those changes get sent back to Google.
Truth be told, I bought the tablet to make it easier to carry and read the myriad papers I need to get through and it has served this purpose well. I'm not even certain where the fault lies, e.g. with Google or Samsung, since these issues only started occurring after the last update from Samsung.
Unfortunately the problems aren't confined to my personal machines. We just purchased two nice machines for the Algorithmic Robotics Lab. However one of them is suffering fromperformance issues for reasons we have not yet identified.
Don't get me wrong, all these issues are relatively minor and can be worked around. However we it makes me wonder about they types of errors that will arise as a result of integrating machine learning into our lives. I won't speculate as to what could occur. The list of possibilities is extensive I'm sure. Though I will say that I'm not talking about the robot apocalypse here. If you are concerned about such an event then I suggest reading the Willow Garage blog entry entitled Averting the Robot Uprising. Actually I suggest reading it anyway as it's quite humorous.
20110911
Learning to Learn from Nature
Science has frequently taken pages from the book of Nature when trying to solve its puzzles. The ability to learn is clearly a natural phenomenon. As such it is no surprise that learning algorithms have been inspired by nature.
A well known example are neural networks. These algorithms model, though fairly simply, the operations nerves. Neural networks have been used extensively to perform character recognition, face recognition, to generate gaits, to classify data, and so much more. It has been shown that neural networks approximate the process of Fourier transformations and can approximate any function given the correct basis functions.
Genetic algorithms are another popular example. These algorithms constitute a class of algorithms that model the operations of genetic material. In short, the first generation is created by randomly generating multiple hypotheses. A function, known as the fitness function, is used to measure how accurately a hypothesis estimates the target function. Hypotheses are chosen based on their fitness to be bred. The next generation is then measured and again bred. This process repeats until some desired accuracy is achieved.
Another example, though less well known, is reinforcement learning. Reinforcement learning was inspired by the concepts of pleasure and pain. However Sutton & Barto showed that any algorithm that learns from interaction with its environment is a reinforcement learning algorithm. Reinforcement learning has also been widely employed. It is particularly good where learning needs to be performed online.
What other learning algorithms have been inspired by nature? What are their origins? How have they grown since then?
A well known example are neural networks. These algorithms model, though fairly simply, the operations nerves. Neural networks have been used extensively to perform character recognition, face recognition, to generate gaits, to classify data, and so much more. It has been shown that neural networks approximate the process of Fourier transformations and can approximate any function given the correct basis functions.
Genetic algorithms are another popular example. These algorithms constitute a class of algorithms that model the operations of genetic material. In short, the first generation is created by randomly generating multiple hypotheses. A function, known as the fitness function, is used to measure how accurately a hypothesis estimates the target function. Hypotheses are chosen based on their fitness to be bred. The next generation is then measured and again bred. This process repeats until some desired accuracy is achieved.
Another example, though less well known, is reinforcement learning. Reinforcement learning was inspired by the concepts of pleasure and pain. However Sutton & Barto showed that any algorithm that learns from interaction with its environment is a reinforcement learning algorithm. Reinforcement learning has also been widely employed. It is particularly good where learning needs to be performed online.
What other learning algorithms have been inspired by nature? What are their origins? How have they grown since then?
20110906
Nature's Particle Filters
Regardless of how diligent we are occasionally we wake to find a swarm of fruit flies in our kitchen. The reality is that when this occurs we've probably slipped up and allowed a banana peel to rot in the garbage can a bit too long. This last occurred about a month ago and despite our efforts to eliminate them there are still a couple buzzing around. Rest assured if we leave something in the trash in the near future we'll have a flare up.
It dawned on me recently that these little buggers are basically nature's particle filter. Particle filters are a way of estimating belief about something that cannot or is not directly observed. In other words they estimate a probability density function of hidden variables. In this case the fruit flies estimate the existence of food in a given area. When there is food there are lots of fruit flies, when there isn't there isn't.
I first encountered the concept in my AI class. The example used, if I recall correctly, tried to estimate the weather outside from the perspective of an observer that can't go outside. Instead the observer bases their belief on whether others were carrying an umbrella. A bit contrived but illustrative none-the-less.
A more compelling use comes out of robotic localization research; the problem of determining ones location in an environment given a map and a sequence of sensor readings. Monte Carlo localization specifically employs particle filtering to accomplish this task. The process generally starts by distributing particles over the area(s) of the map where the robot is believed to be. It's not uncommon for the particles to be evenly distributed over the map which implies the initial position of the robot is completely unknown. From there the particles are repeatedly altered based on how the robot moves, odometric sensor input, and what it sees, input from IR sensors, ultrasonic sensors, laser range finders, and even vision systems to name a few.
Of course there are numerous uses of particle filters; they're generally applicable when performing simulation over an infinite space which makes them quite useful. I've only touched on a few examples here. I've had the inkling that gremlins can be cast as a particle filter. Thus far I have not succeeded in doing so but I'll let you know if I do.
It dawned on me recently that these little buggers are basically nature's particle filter. Particle filters are a way of estimating belief about something that cannot or is not directly observed. In other words they estimate a probability density function of hidden variables. In this case the fruit flies estimate the existence of food in a given area. When there is food there are lots of fruit flies, when there isn't there isn't.
I first encountered the concept in my AI class. The example used, if I recall correctly, tried to estimate the weather outside from the perspective of an observer that can't go outside. Instead the observer bases their belief on whether others were carrying an umbrella. A bit contrived but illustrative none-the-less.
A more compelling use comes out of robotic localization research; the problem of determining ones location in an environment given a map and a sequence of sensor readings. Monte Carlo localization specifically employs particle filtering to accomplish this task. The process generally starts by distributing particles over the area(s) of the map where the robot is believed to be. It's not uncommon for the particles to be evenly distributed over the map which implies the initial position of the robot is completely unknown. From there the particles are repeatedly altered based on how the robot moves, odometric sensor input, and what it sees, input from IR sensors, ultrasonic sensors, laser range finders, and even vision systems to name a few.
Of course there are numerous uses of particle filters; they're generally applicable when performing simulation over an infinite space which makes them quite useful. I've only touched on a few examples here. I've had the inkling that gremlins can be cast as a particle filter. Thus far I have not succeeded in doing so but I'll let you know if I do.
Subscribe to:
Posts (Atom)
