三層パーセプトロンの重みの学習
from 三層パーセプトロン
重みの学習
誤差関数は、いま考えているのは分類問題なのでクロスエントロピー
$ E(\mathbf{W, V}) = -\frac{1}{N}\sum^{N-1}_{n=0} \sum^{K-1}_{k=0} t_{nk} \log(y_{nk})
($ tはデータの出力値, $ Kはクラス数)
これをパラメータ(重み)ごとに偏微分して、誤差が小さくなる方向へ重みを動かせばよい
線形回帰モデルの学習やロジスティック回帰の学習でやった勾配法
さて、この微分はどうなる?
この誤差関数は、線形モデルのときのようにお椀型のような簡単な形をしていない
数値微分による学習
数値微分によっても解くことはできる
https://gyazo.com/f75d593cfac70b838dc66b1856929ac4
図は『Pythonで動かして学ぶ!あたらしい機械学習の教科書 第3版』より引用
つまり以下のように微分値を近似する
https://gyazo.com/7df0eedbe97c6ce853b5945866e20f38
これを用いれば簡単であるが、計算量が大きくなる
解析的微分による学習(バックプロパゲーション:誤差逆伝播法)
数値微分でなく、連鎖律(合成関数の微分)を駆使することによって、解析的に微分値を求めることができる
出力層から誤差を逆向きに(出力層→中間層)伝播させることになるので、誤差逆伝播法(バックプロパゲーション)とよばれる
中間層が2層以上になっても同様に操作できる
この手法の発見により、1980年代にニューラルネットワーク研究が盛んになったようである
ちょっとややこしいが、メカニズム(根気があれば自分で調べたり式変形したりてみよう)
クロスエントロピーhttps://gyazo.com/144b110fe4b5b326a4b7492ab0c41ef6を減らしたい
まず、1つのデータだけに対するクロスエントロピー$ E_nを考える
https://gyazo.com/24abcc324765051211eb22ca4e506c54
これにより$ Eは以下のように、データごとのクロスエントロピー$ E_nの平均と解釈できる
https://gyazo.com/b9e45c313cf78d7bdfadfd9309b8bdbf
よって、$ E_nについてパラメータの偏微分を求めて平均すればよいことになる
中間層→出力層の重み$ v_{kj}と、入力層→出力層の重み$ w_{ji}の偏微分を求める
(ややこしいので再掲)
https://gyazo.com/e748fdfa0379c9e91421821d83c43379
図は『Pythonで動かして学ぶ!あたらしい機械学習の教科書 第3版』より引用
まずは中間層→出力層の重みについて
https://gyazo.com/fd9d6e55373389c86720c6ca232ab769を求めることになる
連鎖律によりhttps://gyazo.com/c947844422e8ffa6aa8499b40cf69d9c
https://gyazo.com/0e52f02dd702af30ba4ecbaaebb9e747について
$ k=0について考えると
https://gyazo.com/74d577c011536fad946b5bbb3a165e5b
https://gyazo.com/4344424977d2949c833ddfa4a52b6c06
https://gyazo.com/619b24c32a565034822b34f659305844
同様にhttps://gyazo.com/54bc21ed83b3e84a8de2250f55f76df5
よってhttps://gyazo.com/8c0096b68d3dcfa0d253e72b7212f42c
同様にしてhttps://gyazo.com/dab0e927d1424dcec04c14179f17db7f
まとめるとhttps://gyazo.com/bbae0eb3fc6212e6fbc950ae32f548cf
これをhttps://gyazo.com/e02fae5737d415ecd6c65b4f8e561095と表しておく
https://gyazo.com/72ff96d69bec25bc473a7c6b83f2c4baについて
$ k=0について
https://gyazo.com/c67ee26131c79f2d16f8e8f3a8b8ef53
よってhttps://gyazo.com/4959a675c06e0c06d72fa84af4b47da7
まとめるとhttps://gyazo.com/38ea5434588bc34904cb900dd7c26281
同様にしてhttps://gyazo.com/4f3757f65d753e84fa4b18a84bebb47d
これらの結果から
https://gyazo.com/a1285944158d0a1be655d861524c4f42
よって更新則は
https://gyazo.com/fa49561d87e99a02f329da597547bba7
https://gyazo.com/9758a982adbaf6b442922de10b79c56f
図は『Pythonで動かして学ぶ!あたらしい機械学習の教科書 第3版』より引用
次に入力層→中間層の重みについて
上と同様にしていくと
https://gyazo.com/9ccdcb375f9886ddad5a3550af101acc
ここで、まずこのように置いてみる
https://gyazo.com/12509362f21763964bd70a718cc02ee0
するとhttps://gyazo.com/37c63252f534a1e02aa7a107c2ef11c6となり、
更新則はhttps://gyazo.com/1dac9ad48ca24fa1cd636bf6a737be07となる
https://gyazo.com/677643df78fecc97a4116bd587cbd640
図は『Pythonで動かして学ぶ!あたらしい機械学習の教科書 第3版』より引用
しかし、https://gyazo.com/366c7282acd10ac4656328d9545881dbはとりあえず置いただけなので、これを求めてみる
https://gyazo.com/fa5c617c418eef3068604a87c97f6f55
https://gyazo.com/2efe5b27b7ff25aff0653d13d4ac8233
https://gyazo.com/d86d08ee01ac100ffa5bb33229991002
以上より
https://gyazo.com/accfdd66a33006779d048b45f7f44b58
https://gyazo.com/d510bcff4b9583f41938e4ca2fe1f999
図は『Pythonで動かして学ぶ!あたらしい機械学習の教科書 第3版』より引用
以上の手順をまとめると
まとめると以下のようになる
https://gyazo.com/ae57dc6e2b41821fcb834db0c3f54731
https://gyazo.com/46f6a947382b0746ebd6de2cc1e9b95f
https://gyazo.com/da42de96a7917f25adc63bc87034e43b
https://gyazo.com/ea1d4b497dfa4fc1a9b2534bfc8b89e8
図は『Pythonで動かして学ぶ!あたらしい機械学習の教科書 第3版』より引用
ただしこれはデータ1個分なので、データ個数分だけ繰り返して平均をとり、更新幅を決めることになる
バックプロパゲーション手順まとめ
https://gyazo.com/b0f3e21da22c1798b6fc081f8e4b2eb6
学習が一気に進むところ
学習のプロセスをみると、誤差の減り方が停滞する時間を経て、一気に誤差が減る時間があったりする
なにが起こっているか?
https://gyazo.com/3385c03f8104b4a181209eeed894630d
図は『Pythonで動かして学ぶ!あたらしい機械学習の教科書 第3版』より引用
このように、鞍点というポイントで重みの更新が進んだりしている