AIへ秒読み

人工知能、機械学習、自然言語処理のトレンドを追っかけるページ

脳のコネクショニスト・モデル

産業技術総合研究所の一杉裕志氏のサイトで 氏は大脳皮質の計算論的モデル BESOM を提案しています。 それは4つの機械学習技術(自己組織化マップ、ベイジアンネット、独立成分分析、強化学習)を 組み合わせたもので、 すでにプログラムがありソースコードも公開されています。 その機能はもちろんまだ実際の人間の脳の機能からは程遠いとはいえ、 ここまで具体的な脳のモデルを既知の技術の組み合わせにより提示できるということが、 機械学習の進歩を物語っていると思います。

実際の脳にできることを考えてみると、脳の機能をコンピューター上で実現しようとするときの必要条件が見えてきます。

例えば

  • ニューロンの活動(化学的な反応)の遅さにも関わらす 高速な処理が可能 → 大規模な並列計算が必要
  • 人間の赤ん坊はさまざまな映像の中から一塊の物体や親の顔を認識するようになる → 独立成分分析のような「抽象化」をおこなう仕組みが必要
  • 快を求め不快を避けるという動物に共通した性質を実現するには強化学習のような 「報酬」という概念を含む機構が必要

ここで思考実験として、脳のコネクショニスト(つまりニューラル・ネットを用いた)モデルを 人間の脳が持つ能力から逆算しながら構成するということを試みたいと思います。 つまり、知能の個体発生(認知の発達過程)をたどりながら、人間の脳が備えている能力と、 それをニューラル・ネットの手法によって実現する方法を考えていきます。

ランダムな置換とクヌース・シャッフル

ニューラルネットをプログラムするときに、ランダムな置換 (ここでは $ 0 $ から $ n-1 $ までの数がランダムな順で並んだものと考えます)が 必要になることがあります。例えば、

  • SGD with minibatch において、サンプルの配列の中からランダムな順序で 100 ずつ、 順番に取り出したい。ランダムな置換を使って配列のインデックスをかき混ぜればよい。
  • Dropout において、n 個の入力のうちランダムに選んだ半分を 0 にセットしたい。 それぞれの入力を確率 0.5 で 0 にするのではちょうど半分になるとは限らない。 ランダムな置換を使えば、$ n / 2 $ 未満の要素を選ぶことによりちょうど半分 をランダムに選ぶことができる。半分ではなく他の比率でも大丈夫。

ランダムな置換を得るには Knuth shuffles という便利なアルゴリズムがあります。これは $ 0, 1, \ldots, n - 1 $ という シーケンスに対し、$i$ 番目と、$ 0, \ldots, i $ からランダムに選んだ $j$ による $j$ 番目とを入れ替える、という操作を $i = 0, 1, \ldots, n-1$ について 繰り返すというものです。

変数の初期化も同時にやってしまうのが以下のコードです。

CharRecog を GitHub にアップしました

ニューラルネットによる文字認識プログラム CharRecog を GitHub にアップしました

特徴

  • C++ で作成。OpenCV の ANN_MLP クラスを参考に、コアの部分はゼロから書きなおしました。
  • 並列処理 : インテル TBB、OpenMP, C++ AMP などを使い、マルチコア CPU や GPU による並列処理をおこなっています。
  • 行列計算による高速化 : すべてのサンプル画像を処理する際、できるだけループを回さず一回の行列計算により処理をおこないます。
  • さまざまな手法への対応 : autoencoding, convolutional layer, max pooling, maxout, dropout の各手法や 入力画像のランダムな affine 変換などに対応しています。
  • ビルド済み実行ファイルでは float で計算をおこないますが、ソースを一ヶ所変更してリビルドすれば double にも対応します。
  • 学習された重みを画像として出力できます。

すぐに使えるよう 64 ビット版のバイナリもアップしています。 MNIST 画像セットを使って autoencoding や dropout などの実験が簡単におこなえます。

今後も気になる手法があればインプリメントしていく予定です。 また、画像認識や言語処理のための高速なNNエンジンとしても使えるようにしていきたい。