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

マンモス武勇伝~暗黒魔界編~

マンモスほっちぃ☆さんの快進撃が今...始まる...!!

ニューラルネットワークでSin[x]を近似してみた.

環境はMathematica で実装しました.

(Mathematica愛してる)

 

参考図書:

熊沢逸夫 著 学習とニューラルネットワーク

岡谷貴之 著 深層学習

 

参考サイト:

http://nnadl-ja.github.io/nnadl_site_ja/index.html 

Michael Nielsen 著 ニューラルネットワークと深層学習

 

と言う本の翻訳した奴??的なサイトです.

(参考図書と参考サイト似たようなタイトルで笑う)

 

これらは本当にオススメです!!

 

近似の流れをさっと説明すると,

入力層にxを入れ(ランダムで[0,Pi/2]で発生)目標出力としてSin[x]を与えます.

隠れ層は5つの素子から構成されており, 層が3つで素子が1-5-1のニューラルネットワークで考えました.

素子と素子は重み付きで隣接しており(有向グラフ) 入力に対してSin[x]を作り出せるような,ある重みを求めることがこの問題の目標です.

ちなみにニューラルネットワークで任意の関数を近似できることは理論的にわかっています.

一つの層の全てのF(素子の値)*重みの和が次の層の隣接している素子の入力となっています.

ここでFは活性化関数と呼ばれる関数で通常, sigmoid関数やhyperbolic tangent関数などがよく用いられます.

今回はsigmoid関数を使いました.

このように次の層の素子の値を求めることを繰り返し, 出力までこぎつけたら, 出力層の素子の値に対して別の活性化関数を用いるか否かの選択をします.

私はそのままsigmoid関数を使いましたが, sigmoid関数は値域が(0,1)なので目標出力がその値域を超える場合には恒等写像を使うなどしたらよいでしょう.

 

そして, 勾配法で目的の出力と実際の出力の二乗誤差の極小値を探していきます.

 

誤差逆伝播法と呼ばれるアルゴリズムで逆から(出力層から)重みの修正率を求めます.

また, 学習係数と呼ばれる重み修正の際に掛ける係数は0.1としました.

 

こうして重みを更新するのですが前回の記事で書いた致命的欠陥とは, この誤差逆電波のアルゴリズムにおける偏微分の計算において, 重みの値の絶対値が十分に小さくなるような更新をする場合(活性化関数によるけど)に正負の表現に関して注意が必要なことです.

それを防ぐコードを書き書きしたら直りました.

これに気づくまでの日々を思い出します...

 

てか, 本(ネット)に書いてある通りに誤差逆伝播法を実装した奴これに直面するはずなのに何で誰もそのことに触れていないの??www

訓練データで近似できて満足しちゃったのかな...?テストデータでちゃんと近似できてるか確かめよう!!

 

何の話してたか忘れたので, とりあえず結果貼っときます.

ノートpcでやってるし(言い訳)メモリすくねーし(言い訳)反復回数は少なめです.

GPUを使った並列計算を勉強しよう!!(しなきゃいけないのは解ってる...)

 

 

f:id:chbakensousasi:20160723030027j:plain

 

訓練データを与え終わった後の重みを取り出し, 10^3回[0,Pi/2]の範囲のxをランダムで出してその重みを使って, 順伝播計算させた曲線,つまり,Sin[x]を近似したものが赤.

目標のSin[x]が青.

参考までに近似させる前のsigmoid関数が灰色となっています.

 

0に近いところはsigmoid関数の形状的に近似しづらいのは分かるので, そこら辺にもう少し訓練データを与えればよかったなと今は思っていますw

 

反復回数をもっと増やせばもっと綺麗になるけどもう私的には本質が行けたと思う(小並感)からとりあえずこれに関しては満足かなぁ.

こうなる前は過学習に悩まされたり, 活性化関数に悩まされたり,

それで思い出したけど, オートエンコーダ(自己符号化器(重みの良い初期値求める的な))は使ってないけど, ドロップアウト(たまに層を無視させる(ノイズを入れる的な))は使ってます.

あー疲れた.

然し, これはニューラルネットワークがちゃんと動くかのテストに過ぎなかったのである...

なぜなら, そう!目標は遥か彼方...!!!

それがうまくいかなかったから(さっき述べた誤差逆伝播法の欠陥)こっち(Sin[x]の近似)で性能チェックしていた次第であります. 

それはまたこんど紹介します(夏休みの自由課題のレポートにする予定)

 

寝て起きてソシャゲやってから期末テスト勉強します.

 

質問, 批判(煽り耐性ないからイケボかウィスパーボイスでオナシャス)歓迎.

※オフパコは受け付けておりません.