NNPropagator

人工知能講習会(機械学習講習会)やることまとめ

目標

MNISTデータベースの学習

内容目次

全4回,予備1回

1.Python入門

1.1 環境構築(Anaconda + Mako + PyOpenCL,Device for OpenCL)

1.2 Dive Into Python

2.数値計算入門

2.1 NUMPY+SCIPY入門

3 .ニューラルネットワーク入門

3 .1 機械学習の基礎知識

3 .2 ニューラルネットワークの基礎知識

3.3 NNPropagator入門

4.NNPropagatorを使ったニューラルネットワークの学習

4.1 多層パーセプトロンによる関数近似

4.2 MNIST学習

前提条件

手続き型プログラミング言語を少し習得していること.

※手続き型プログラミング言語:C,C++,Python,Java,C#,Javascript…など.

内容

1.Python入門

人工知能プログラミングで必要となる,Pythonについて入門します.

1.1 環境構築(Anaconda + Mako + PyOpenCL,Device for OpenCL)

Pythonでプログラミングできる環境を作ります.KCS製のニューラルネットワークライブラリ「NNPropagator」を動作させるための環境となっています.

1.2 Python入門

Pythonを知らない人向けに,一通り簡単にPythonを学びます.

2.数値計算入門

数値計算を知らない人向けに,一通り簡単にPythonを学びます

2.1 NUMPY+SCIPY入門

Pythonには,優秀な数値計算用のライブラリが多数存在します.そのうち,汎用性が高く習得が容易な「Numpy」について一通り簡単に学びます.Scipyは必要に応じて学びます.

3 .ニューラルネットワーク入門

機械学習でも最先端で活用されている,ニューラルネットワークについて学びます.

3 .1 機械学習の基礎知識

機械学習とは何かについて簡単に学びます.

3 .2 ニューラルネットワークの基礎知識

ニューラルネットワークとは何かについて簡単に学びます.確率と線形代数の知識が多少必要ですが,わからなければ教えます.

3.3 NNPropagator入門

KCS独自開発のライブラリNNPropagatorについて学びます.独自開発のライブラリと言っても,ニューラルネットワークの実装を補助するものです.ライブラリもナイーブに書いており,実装を理解するのも簡単です.

4.NNPropagatorを使ったニューラルネットワークの学習

NNPropagatorを用いて,こちら側で用意したデータベースを解析して頂きます.

今回の講習会では,2系統(関数近似系/MNIST)用意してあります.また,確認用に自分でデータベースを作り,評価します.

4.1 多層パーセプトロンによる関数近似

こちらで用意した学習用のデータ群をNNPropagatorを用いて学習・評価します.

4.2 MNIST学習(数字文字認識)

MNISTデータ群をNNPropagatorを用いて学習・評価します.

MNISTとは,下の画像の様な数字の画像と教師データのデータベースです.

(画像を与えられた時に何の数値であるか推定する人工知能を作ります.)

img679

教科書

1~3.2インターネット上または書籍で適当なものを引用し,活用します.

3.3~ 独自の教科書を用います.

OPENCL版NNPropagatorを開発しました!

OpenCL版NNPropagatorを開発しました!

高速なニューラルネットワークの学習のために,OpenCLを使い学習の高速化をしました.

NNPropagatorの理念に基づき,OpenCL版の実装も,トリッキーな最適化を施したものではなく,アルゴリズムが把握しやすいものになっています.

参考に,私の環境では,後日投稿予定の「CNNでMNIST実装」では,数千倍程度の高速化となりました.OpenCL_Logo

OpenCLとは?

OpenCLとは,マルチコアCPUやGPU、Cellプロセッサ、DSPなどによる異種混在の計算資源を利用した並列コンピューティングのためのクロスプラットフォームなフレームワークです。どんな計算資源でも同一のコードで並列プログラミングをすることができます.OpenCLのカーネルはOpenclC言語というC言語ライクな言語で記述することができ,非常に使いやすいです.

NNPropagatorでの使い方

NNPropagatorでの使い方は,CPU版と比べて一切変化しません.

あたらしい種類の層を追加するときに,OpenCLコードで書く必要があります.

 

 

AdaGrad,RMSProp,+L2Normを実装しました[NNPropagator]

AdaGrad,RMSProp,+L2Normを実装しました

NNPropagatorについて,新しくAdaGrad,RMSProp,+L2Normを実装しました.

どんどん新しいものを追加予定ですが,公開はもう少し先になりそうです.

では今回新しく追加したものについての話をしましょう.

dfsfsfsf
サムネ

重み更新アルゴリズム

今回追加された3つは,すべて重み更新に関する仕組みです.

ニューラルネットワークは,まずニューラルネットワークを構造を定義し,構造内の学習すべきパラメータを適切な値にすることによって回帰・分類問題を解くことになります.

このとき,現在一般的に使われているパラメータ推定方法として,誤差伝搬法が用いられています.

誤差伝搬法とは,小さいほうが適切なパラメータとなる,パラメータからスカラー値への写像関数=誤差関数を導入し,誤差関数のパラメータ変数での勾配を計算して誤差関数の値が小さくなる方向にパラメータを変化させる,ということを繰り返し行うことでパラメータを推定する手法です.数式で書くと,

\[w←w -\mu \frac{\partial L}{\partial w}\]

となります.ここで\(\mu\)は,適切な十分に小さな値(<1)です.この計算式を難度も繰り返すことにより,十分な回数であれば極小値にたどり着くことができます.

この方式は,NNPropagatorではGradアルゴリズムで定義されています.

AdaGrad,RMSPropとは?

しかしながら,Gradアルゴリズムには問題点があります.代表的なものを3つ上げるとすれば,

1.十分に\(\mu\)を小さくしなければ極小値にたどりつけない.しかし小さくすると学習が遅くなる.

2.Gradアルゴリズムでたどり着くのは極小値であって,最小値ではない.本当に辿り着きたいのは最小値である.

3.パラメータが莫大やほぼゼロの値をとるとき,学習が発散・停止する.(深層学習)

が挙げられます.

このうち1.の問題点を回避しようと考えだされたものがAdaGrad,RMSPropです.これらのアルゴリズムは,\(\mu\)を学習中に変化させることで,早く極小値にたどり着くことができるように設計されました.

L2Normとは?

さらに,3.の問題点を解決しようと考えだされたものが,L2Normalization(L2ノルム正規化)です.

L2Normは,上式の更新アルゴリズムに,パラメータに比例する減少項を追加することにより,パラメータが大きくなり過ぎないように調整されます.この方法では,パラメータがある範囲に束縛された状況下においての,誤差関数を最小化する点を求めることができると証明されています.

また,L2Normには過学習を抑制する,というメリットもあります.

感想

このアルゴリズムを実装して早速使ってみましたが,L2NormはかなりDeepLearningで役に立ちました.パラメータが抑制されることによって誤差の発散がかなりおさえられ,学習が破綻することが少なくなりました.また,RMSProp,AdaGradによって高速で精度良いパラメータを算出できることも確認しました.詳しくは,後日書く「CNNでMNIST実装」に書こうと思います.

時系列データを学習するニューラルネットワーク「RNN」が使えるようになりました(NNPropagator)

「NNPropagator」誠意開発中!

前回,ニューラルネットワークのライブラリを独自に開発を進めていくということをお知らせいたしましたが,今回も開発状況をお知らせ致します.

この「NNPropagator」では,簡単にニューラルネットワークの構造を定義し学習ができる,シンプルなライブラリである,と前回書きました.これは,ニューラルネットワークが層構造をなしているという点から,「層」を「結合」させるという簡単なコードを書くことでニューラルネットワークを定義する事ができる,というものです.これは,TensorflowやChainerなどの機械学習ライブラリと同様な仕組みとなっています.

この層構造を基本に置くことの利点のうちの1つは,新たな仕組みを比較的容易にライブラリに追加することができるということにあると考えることもできます.では,前回から追加された機能の1つを説明してきます.

今回の主題は,「未来方向ディレイコネクタ」です.

ディレイコネクタ

前回までのニューラルネットワークでは,可変長の時系列データを扱うことはできませんでした.データ系列に時系列データを用いると,異なる時刻間で情報に相関が存在する場合,相関がないとして独立したデータとしてニューラルネットワークに学習させる方法や,固定時刻でニューラルネットワークの入力次元=時間幅として学習させる方法など,制限のあるやりかたで時系列データを処理することはできますが,本来可変であるはずの時系列データを扱うのには,少し不便と言わざるを得ません.

そこで登場するのが再帰結合型ニューラルネットワーク「RNN」です.このネットワークは,一部の層間結合に「遅れ(delay)」を導入することで,ネットワークを拡張します.具体的には,次のようになります.前回のニューラルネットワークの構造に比べると,新しいものは三角マークの結合ですね.+マークは,ただ結合を加算合流させるためのものです.

DelayConnect N

この三角マークは遅延結合と言って,制御理論ではおなじみですが入力されたデータを単位時間保持し,その後出力する結合です.この結合によって,過去の情報を現在へ伝える事ができ,過去との層間のあるデータを扱うことができるようになります.

では実装!

とは言っても,やっぱり実際にやってみなければなんだかよくわかりませんよね.実例を以って体感してみましょう.

今回学習に挑戦するのは,簡単な遅延出力器です.ランダムなパルス幅のパルス信号を1単位時間だけ遅らせて出力することを学習させます.

パルス信号
パルス信号の例

入力データにランダムなパルス幅のパルス信号,出力データ(教師データ)に,入力データを1つだけ未来方向にずらしたものをセットし,上図のネットワークを定義しNNPropagatorで学習を実行します.
<NNPropagatorでのネットワークの定義は次のようになりました.delay=Trueでディレイコネクタであることを明示します.

<br />
NNList = [<br />
    OneConnection(1,3,connect = [&quot;plus0&quot;],name=&quot;W&quot;),<br />
    PlusConnection(connect = [&quot;V&quot;,&quot;U&quot;],name=&quot;plus0&quot;),<br />
    OneConnection(3,3,connect = [&quot;plus0&quot;],name=&quot;U&quot;,delay=True),<br />
    OneConnection(3,1,name=&quot;V&quot;)]<br />

実行結果

学習した結果は,次のようになりました.青が入力データで,緑がニューラルネットワークが出した出力データです.

RNN D0 RESULT

見事に1単位時間だけ位相をずらすニューラルネットワークが学習できましたね!これでおしまいです.

余談

上のように定義したRNNでは,勾配消失/勾配爆発問題が発生すると説明されることが多いです.実際,学習係数を順伝播NNと同じにしてやってみると数値が発散してしまうことが確認できました.これを解決する方法がたくさん開発されていますが,今回は割愛します.

 

追記(2016/3/18)

かなり良い学習結果が得られたので追記

出力層の手前にSigmoid層を入れたことによりものすごい改善が起きたことをここに記す.

rnn_delay_good

ニューラルネットワークライブラリ「NNPropagator」を開発中です!

「NNPropagator」とは?

「NNPropagator」とは,Pythonで動く,機械学習研究者,特に初学者のための機械学習を簡単に行えるライブラリです(予定).ニューラルネットワークに特化したライブラリとなっております.

順伝搬ニューラルネットワーク,リカレントニューラルネットワーク,畳み込みニューラルネットワーク,深層ネットワークなど,様々なネットワークを簡単に実装することができます(予定).

そもそも,なぜ新しいニューラルネットワークライブラリを作ったのか,と疑問に思うかもしれません.現在では,有名な機械学習ライブラリとしてTensorFlow, Chainer, Caffe, DeepDream, 画風変換など,豊富な選択肢のライブラリがあります.これらのライブラリではダメなのでしょうか?

結論を言ってしまえば,上に挙げたライブラリで十分です.ですが,私が気になったのは次の点です.すなわち,「ライブラリに頼っているだけでは何の成長もしない」ということです.自らの手でプログラミングをして,試行錯誤の中で解決策を見つける,それが成長の糧となるのだと思います.

よって,「NNPropagator」では,次のことを目標にしています.

  • 機械学習の実装を学ぶのに適切な量のコードのみで構成
  • 実装を直感的に組み合わせることのできる構造
  • これに加えて,十分に実用的であること.

この目標のもとでライブラリを開発することにより,「後学者が実装を学びやすく,なおかつ実用に供する機械学習ライブラリ」が完成するのではないかと考えています.今回は,「NNPropagator」は開発途中であるので,「NNPropagator」の使用方法だけを説明していきたいと思います.開発が進み次第,コードや組み込み方法などを公開していく予定です.

「NNPropagator」を使ってみる!

注:これは開発中のライブラリですので,実装が変わる可能性があります.

まず,次のコードを見てください.

<br />
NNList = [ SimpleConnection(1,50),<br />
           SigmoidConnection(50),<br />
           SimpleConnection(50,1) ]<br />
NetWork = ForwardNN(NNList)<br />
NetWork.setLossFunc(&quot;Square Error&quot;)<br />
NetWork.setDataSet(xd,yd)<br />
NetWork.learn(threshold = 0.1)<br />

実はなんと,このコードだけで,入力層1,隠れ層50,出力層1の多層パーセプトロンの定義と学習が完了するのです!
これだけで,以下の式に基づいた関係式を(xd,yd)で定義された教師データにもとづいて,パラメータ (W_1) と (W_2) を学習する,と言ったプログラムを書いていることになります!ただしsig(x)はシグモイド関数です.
\begin{aligned}
y = W_2 sig( W_1 x )
\end{aligned}

チャートで表すと,次のようになっています.

testNN01

このように,簡単にニューラルネットワークを実装できます.実際にプログラムを実行して,学習したデータを視覚化したものがこちらです.

NNPropagater_test01

今回は,二次関数を「NNPropagator」に学習してもらいました.上図の緑が学習元データ系列で,青線が学習した関数です.見事に学習できていますね.

今回の「NNPropagator」の紹介は以上ですが,開発を進め次第どんどん情報を公開したいと思います.

さらに,この「NNPropagator」を2016年度KCS「AI講習会」で使用しようと考えています.お楽しみに!

 

 

「NNPropagator」サポート予定のネットワーク(太字は実装済み2016/3/31更新)

・ネットワーク:順伝搬ニューラルネットワークリカレントニューラルネットワーク

・順伝搬NN に使えるNN:全結合層畳み込み層Pooling層,Batch Normalization層,活性化層(Sigmoid,Tanh,MaxOut,ReLU

・リカレントNN に使えるNN 自己結合層,LSTM,GRU

・最適化アルゴリズム Grad(通常),AdaGradRMSProp,Adam

・誤差関数 交差エントロピー,最小二乗

・たくさんつなげることで,深層NNに対応.