人工知能のチュートリアルを乗り越えるために

最近は時間を見つけてはPythonで機械学習のコード(自己組織化マップとか2層ニューラルネットワーク)を書いています。現状コーディングに詰まるところはいくつもあるのですが、やはり大きな壁になるのはチュートリアルを乗り越え応用に持っていくことだと思います。

 

ディープラーニングや機械学習のチュートリアルにはMNISTのデータセットを用いた画像認識がよく行われます。これは0~9の数字が描かれた画像から、どの数字が書かれているのかを認識するモノです。入力データと出力データに着目すると、入力はサイズが28*28の画像(28*28=784次元のベクトル)で出力は10次元のベクトルです。(個人的には特徴量を保った状態での次元の圧縮と考えています。)

mnist

それでは、MNISTのチュートリアルをもとにsin波の予測をするモノを作りたいと考えたとします。入力にはサイズが28*28のsin波の画像(28*28=784次元のベクトル)、出力は入力したsin波のそのあとの波形の画像(28*28=784次元のベクトル)とします。イメージはこんな感じ↓

mnist (1)

2つのモデルを見比べて大きく違うのは出力データの形状ですね。MNISTのデータセットでは0~9のどれかが分かればよかったのですが、sin波の予測のためのデータセットでは波形の画像の出力を求めています。

詳しく言うと、MNISTの出力データはone-hot-vectorと呼ばれる表現を使っています。one-hot-vectorとはベクトルの中の一つの要素だけが1でそれ以外は0というベクトルです。例えば入力画像に描かれている数字が2だと人工知能に教えたいときは[0,0,1,0,0,0,0,0,0]とします。(配列のインデックスの2番目の要素が1となり、それ以外は0)

sin波の予測のためのデータセットのように出力データを画像にしたい場合はone-hot-vector表現は使えなさそう。(波形を一つ一つ分類できればそれに越したことはないが、いくつの波形に分類するかを人間が考えるとなると気が遠くなる)

また、ここで起きる問題はMNISTでの出力データ(教師データ)が10次元だったものがsin波の予測では784次元に拡大しちゃうこと(さらにone-hot-vector表現でもない)。教師データが複雑になるのでそれを教えこませるためにさらに大量の学習データがいるっぽい気がする。

そして、MNISTでは出力が0~9の10個のうちのどれかに属しているが、sin波の予測では無数にある波形のパターンをいくつに分類するかを考える必要がありそう…。(波形のパターンがいくつ、どんなパターンがあるかをこちらで与える必要がある?)

 

 

そうなると別に出力を画像にこだわる必要はないと考えられる。例えば、ハイアンドローのように上がるか下がるかだけを出力してもよいと思う。これならHIGH or LOWのone-hot表現の2次元ベクトルで済む。

しかし、上がるか下がるかを決めるのは教師データを与える人間である。人間のエゴが人工知能に反映されてしまう。

 

実はチュートリアルに用いられるMNISTはとてもよく練られた人工知能のテストケースなのだと改めて思い知った。しかし、このチュートリアルを応用するには壁がある。この壁、どう越えよう。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to top