学習記録(27日目)
勉強開始:12/7(土)〜
教材等:
・大重美幸『詳細! Python3 入門ノート』(ソーテック社、2017年):12/7(土)〜12/19(木)読了
・Progate Python講座(全5コース):12/19(木)〜12/21(土)終了
・Andreas C. Müller、Sarah Guido『(邦題)Pythonではじめる機械学習』(オライリージャパン、2017年):12/21(土)〜12月23日(土)読了
・Kaggle : Real or Not? NLP with Disaster Tweets :12月28日(土)投稿〜1月3日(金)まで調整
・Wes Mckinney『(邦題)Pythonによるデータ分析入門』(オライリージャパン、2018年):1/4(水)〜1/13(月)読了
・斎藤康毅『ゼロから作るDeep Learning』(オライリージャパン、2016年):1/15(水)〜
『ゼロから作るDeep Learning』
p.164 第5章 誤差逆伝播法 まで読み終わり。
5章 誤差逆伝播法
・誤差逆伝播法は要素の重要度である重みパラメータの勾配計算を効率良く行う手法
4章で実施した数値微分による勾配計算はシンプルであるが時間がかかるのに対し、こちらは高速に計算ができる。(ただし、複雑な部分がある。)
本書においては「計算グラフ」を用いて解説が実施されている。
・順伝播(forward propagation):計算を左から右へ進める。
逆伝播(backward propagation):計算を右から左へ進める。
・計算グラフでは局所的な計算、つまり自分に関係する小さな範囲のみを考えて次の結果を出力することができる。
局所的な計算は単純であるが、結果を伝播することで全体を構成する複雑な計算の結果が得られる。
・順伝播では局所的な計算結果をアローダイアグラムのように左から右へ伝播するのに対し、逆伝播では「局所的な微分」の結果を右から左へ伝播させる。
この計算結果は最終的に最初の要素(値段であったり個数であったり)まで伝播され、ここに現れた数値が最終的な値段に与える影響の大きさを示している。
・連鎖率(chain rule):合成関数の微分についての性質
"ある関数が合成関数で表される場合、その合成関数の微分は、合成関数を構成するそれぞれの関数の微分の積によって表すことができる。""
\frac{\partial_z}{\partial_x} = \frac{\partial_z}{\partial_t}\frac{\partial_t}{\partial_x}
この連鎖率の原則を用いて微分の逆伝播を進めていく。
ノードの入力信号に対して同じように後ろにくっつけていけばよいだけ。
入力信号が右から左にh、yと続くのであれば以下のようになる。
\frac{\partial_z}{\partial_t}\frac{\partial_t}{\partial_x}\frac{\partial_x}{\partial_h}\frac{\partial_h}{\partial_y}
・加算ノード:z = x + y という数式を考える。
どちらの偏微分も定数となるため、加算ノードにおける逆伝播はそのままの数値を次のノード(前のノード)に流す。
・乗算ノード:z = x * y という数式を考える。
xに関する偏微分の解は y、yに関する偏微分の解は x
となるため、乗算ノードの逆伝播は入力信号をひっくり返した値を乗算して次のノード(前のノード)に流す。
つまり、xが流れてきた方にはyを乗算して、yが流れてきた方にはxを乗算して返す。
・上記の考え方に活性化関数(ReLU, Sigmoid)を適用させることで、実際のニューラルネットワークの仕組みとなる。
・ReLUは回路における「スイッチ」のように機能する。
値が基準を満たさない場合は、ノードを通過する際に「0」を値として送る。
(つまり、その系統の伝播はそこで止まる。)
・アフィン変換:ニューラルネットワークの順伝播で行う行列の積の計算
ニューロンの重み付き和は Y = np.dot(X, W) + B のように表すことができる。
この重み付き和を伝播させる際、アフィン変換を行う。
・最後の処理である出力層における処理で、ソフトマックス関数もしくは恒等関数を用いる。
前回の学習のとおり、分類はソフトマックス関数(+交差エントロピー誤差)を、回帰は恒等関数(+2乗和誤差)を用いる。
・勾配確認(gradient check):数値微分の結果と誤差逆伝播法で求めた勾配の結果を確認すること。
誤差逆伝播の値から数値微分の数値を引く。
正しい実装がされていれば、誤差は0に近い限りなく小さい値になる。