はじめに
この記事は、私個人の、機械学習に対しての理解と、イメージを掴むためのメモ/勉強の記録として、記載します。勉強したこと等を、メモしているだけなので、一度は勉強したけど、つまづいて立ち止まった人向けかつ、シンプルなところから、勉強したい人向けで、何かしら、ご参考、お役に立てればです。
機械学習に必要な数学
・因数分解
・展開
・微分
・導関数の微分
・偏微分
・逆数の微分法
・指数関数の微分
・商の微分方程式
・内積
・線形代数
よく見かける、機械学習のHello Worldブログは、高校数学の知識で〇〇な、シリーズが多いいですが、この辺りの記事を見ても、イメージが掴みづらかったのは、中学校で学ぶ、数学も、一部忘れたため、中高で学ぶ数学を一旦、復習しました。
内積と、線形代数は、2,3次元ベクトル/行列を仕事でよく扱うため薄く理解していた感じです。
復習方法は、googleで、ひたすら、公式/例題等を探して、ローカルにメモ書き/手書き計算、もしくは、youtube、で上記のキーワードを入力すれば、意外と、動画での説明もあり、すぐ復習できます。
※n'とか、良く見かけますが、この「'」の部分は、微分しろという意味です。
順伝播計算が、わかりやすかった資料
・深層学習の非常に簡単な説明
https://www.slideshare.net/SeiichiUchida/ss-71479583
このスライドが、今のところ、内積を理解していれば、誰でも理解できてしまいそうな、内容です。
ものすごくわかりやすかったです。
内積は、3Dだと、ライトベクトルから、光の当たり具合を算出(面の色味を調整)する際に、良く使われたりしますよね。3Dプログラム得意な人は、これ見たら、すぐ、理解してしまうのではないでしょうか?
このスライドでは、ニューロンは、内積とあります、以下のように、
入力(ベクトル)
x1
xi
xd
重み(ベクトル)
w1
w2
wk
この2つのベクトルの内積が、類似度を表現し、
x1*w1+xi*w2+xd*wk = 類似度
1に近いほど、類似度が高い。
というのは、非常に、わかりやすかったです。
この後の、類似度の精度を出すための、線形変換のところの説明は、わかりずらかったので、一旦、ここまで、理解しました。
・高校数学で理解・実装するニューラルネットワーク
http://qiita.com/perrying/items/6b782a21e0b105ea875c#重みとバイアスの更新
非線形関数をかます、やり方が非常にわかりやすい、記事です。
例は、シグモイド関数を使った説明ですが、上記の、内積で、類似度を表すところを当てはめると、
\frac{1}{1+exp(-内積)} = \frac{1}{1+exp(-(x1*w1+xi*w2+xd*wk))}
というやり方で、非線形関数をかますことができます。
シグモイド関数の微分
誤差逆伝播を理解するにあたって、この、シグモイド関数の微分の理解が必要そうだったので、メモです。
・指数関数の微分
(e^-x)'\\
= e^-x(-x)'\\
= e^-x*-1\\
= -e^-x
・商の微分方程式
(\frac{f(x)}{g(x)})' = \frac{f'(x)g(x)-f(x)g(x)'}{g(x)^2}
・実際のシグモイド関数の微分
f(x)' = \frac{1}{1+e^-x}\\
「1」の分子が、商の微分方程式によると、f(x)\\
「1+e^-x」の分母が、g(x)\\
商の微分方程式に当てはめると\\
= \frac{1'*(1+e^-x)-1*(1+e^-x)'}{(1+e^-x)^2} \\
= \frac{0*(1+e^-x)-1*-e^-x}{(1+e^-x)^2}\\
= \frac{e^-x}{(1+e^-x)^2}\\
= \frac{1}{1+e^-x}\frac{e^-x}{1+e^-x}\\
\frac{1}{1+e^-x}このパートは、f(x)に置き換えられるので、以下のようになる\\
= f(x)*\frac{e^-x}{1+e^-x}\\
さらに、\frac{e^-x}{1+e^-x}について、式を展開し、\\
\frac{e^-x}{1+e^-x} = \frac{1+e^-x}{1+e^-x}-\frac{1}{1+e^-x}\\
= 1 - \frac{1}{1+e^-x}\\
= 1 - f(x)\\
となり、\\
f(x)' = f(x)*(1 - f(x))\\
が、シグモイド関数の微分になる。
誤差逆伝播
・ニューラルネットワークの順伝播,逆伝播,確率的勾配降下法を手計算する
http://qiita.com/sz_dr/items/800d043f8ff92f49c18c#comment-0ee03e7d6ad7fb178328
この記事の参考にしたところは、手計算で、重みの更新の計算をしているところです、実際に、この記事見ながら、ノートに、同じく、手計算して、やってみることで、重みの更新方法を理解しました。
二乗和誤差の微分は、
E'=\frac{1}{2}(y-t)^2\\
=\frac{1}{2}(y-t)(y-t)\\
=\frac{1}{2}(y^2-2yt-t^2)\\
=\frac{1}{2}(2y-2t)\\
= y - t
TODO
ここまでは、理解できたので、これらを、tensorflow使わず、pythonで、実際にやってみて、理解してみる。
良い、リソース見つけたら、時間ができたら、更新。