読者です 読者をやめる 読者になる 読者になる

人工知能を基本から理解したい!

 この一週間、通勤電車の中でAIの本、特にDNNとかCNNとか呼ばれる深層学習ものを中心に読んだ。で、腑に落ちた文言がこれ。

ニューラルネットワーク関数近似器」

 多くのパラメーターを層状に重ねるのは関数を近似するためだったんだね。世界が量子力学相対性理論で記述できるとすれば、物事全て関数でできているとも考えられる。それらを近似できそうなところに魅力を感じるのかな。

 と、いうわけで、まずは、”囲碁で勝つ”とか高度なことは考えないで、関数の近似から始めようと思う。チリもツモれば山となるかも。

 本から学んだことから、私なりに手順を考えた。

  1. 近似したい対象にマッチしたネットワークを描く。
  2. 活性化関数を決める。(こいつがあると非線形にも対応可。)
  3. 誤差関数を決める。(二乗のやつとかエントロピーとか。)
  4. 更新の仕方を決める。(バッチとかミニバッチとか。)
  5. 全体の数式を整理。
  6. レッツ、プログラミング。(苦手ですが。。)

じゃあ、1から。

【近似したい対象にマッチしたネットワークを描く。】

 今回はニューラルネットワーク関数近似っぷりを実感できればいいので、簡単に。ニューロンみたいなやつ一本だけ。近似できるのは一次関数だけだろうな。

f:id:myuteru:20170419233026p:plain

xは入力データ、wは重み、bはバイアス、f()は活性化関数、uは出力、Eは誤差関数、tは教師データ。一本でも基本要素はちゃんとね。

【活性化関数を決める。】

今回はなし。yからuへ、スルーパス

【誤差関数を決める。】

直観的で分かりやすいから二乗誤差を採用だ。

【パラメーターの更新の仕方を決める。】

今回は、逐一更新する。過学習とか関係ないし。

データ入力から誤差逆伝播までの数式を整理。

縦書きの方が直観的でプログラミングに自然に移れる気がする。

f:id:myuteru:20170422051818p:plain

 pは学習係数。こんな単純な構造なのに、誤差逆伝播(Back Propagation)法の部分は煩雑。深層学習ともなればごちゃごちゃしそうだわ。

レッツ、プログラミング

  関数近似する対象は、総務省統計局が発行している「日本の統計」から引用したいと思う。これ、ほんと好きで手元にあるとなんかいい。あ、これ面白い。「年齢別 体力・運動能力(平成27年)」。”握力”。でもニューロン一本じゃぴったりいかないと思うけど。まあいいか。

出典 総務省統計局「日本の統計 2017」 *引用した数値をグラフ化

f:id:myuteru:20170420002359p:plain

思春期あたりでグンと伸びるのね。自分のことは昔すぎて忘れたわ。

プログラムはエクセルのVBAを使用。ソースコードはこんな感じ。記号そのまんま。さっき描いた図を順番にコーディングしたようなもの。

f:id:myuteru:20170420003737p:plain

 で、結果はこんな感じ。

f:id:myuteru:20170420004116p:plain

あ~、なんか、うまくいった気がする。wとpの初期値適当だけど。。

 このときの誤差と因子の変化がこれ↓。あんまり考えないでやったけどちゃんと収束していく様子が分かる。大したことしてないけど面白い~。

f:id:myuteru:20170420004137p:plain

 誤差が残るのはあたりまえ。線形関数で非線形関数を近似しているようなものだから。これって単回帰分析だよね。

 

 もひとつ、誤差関数をクロスエントロピーにしてみる。使い分けとかよくわからんし。えい!

f:id:myuteru:20170426232612p:plain f:id:myuteru:20170426232826p:plain

 あれ?なにこれ?あー、エクセルの数値確認したら誤差がマイナスになっておる。右のグラフは縦軸にlog使ってるから表示されてないんだ。。

 理由はすぐわかった。クロスエントロピーって、1以下の値が入力されないとだめなのね。頭にマイナスついてるから。そっか、だから画像認識とかでは使われるんだ。「この画像は猫です。」とかいう判定は、出力を0~1に規格化して出力するもんだものね。

f:id:myuteru:20170426233405p:plain

失敗したけど、ようけ学んだ。

今日はここまで。では、また。