Coursera Machine Learning
Week4【学習メモ】【機械学習】
スタンフォード大学のAndrew Ng氏が手掛ける機械学習講義の学習メモ。
機械学習のスキルと知識を付けるために2020/10/30からスタート。全講義を終えるのに11週間をベース(1日1~2時間ペース?)としていますが、気にせずに理解できているか確認しながら進めていこうと思います。
Ⅰ.Neural Networks: Representation
なぜ脳に着目するのか?
→脳は耳や手の動かし方・使い方に関する個別のアルゴリズムを持っているわけではなく、1つの学習アルゴリズムを持っているということが実験で分かった。
(脳の聴覚皮脂につながっている耳の神経を切断し、代わりに目の神経をつなげると、聴覚皮脂が視る事を学ぶ。体性感覚皮脂に対して同じようになっても同じ結果になった)
ニューラルネットワークについて話しているときは、シグモイド関数やロジスティック関数のことはアクティベーション関数と呼ぶ。
多項ロジスティック回帰を使うことで非線形の分類問題にも対応できるが、特徴量の数が増えてしまうと、計算量が多くなりすぎる難点がある。それに対応するためのニューラルネットワーク。画像分類は特にその例が当てはまる。
たまに”ウェイト”と呼ぶ人がいるが、これはパラメータ\(\theta\)のことを指している。
ニューラルネットワークにおいて最初のレイヤーを「入力レイヤー」、最後のレイヤーを「出力レイヤー」、二つの間のレイヤーを「隠れたレイヤー」と呼ぶ。
以下が隠れニューロン\(a\)とパラメータ\(\theta\)です。
\(a\)の中の\(j\)は何番目のレイヤーの\(i\)は何個目のユニットかを表しています。
\(\theta^{(j)}\)は1番目のレイヤーから2番目のレイヤーへと、2番目のレイヤーから3番目のレイヤーへとなどをマッピングする関数を制御するウェイトとなる行列。
\(\begin{align*}& a_i^{(j)} = \text{“activation” of unit $i$ in layer $j$} \newline& \Theta^{(j)} = \text{matrix of weights controlling function mapping from layer $j$ to layer $j+1$}\end{align*}\)
\(x_0\)や\(a^(10)_0\)ユニットはBias unitと呼ばれる。常に1。ユニット数を数える場合には数えられない。
例として隠れ層が3のニューロンの例です。
\(\begin{bmatrix}x_0 \newline x_1 \newline x_2 \newline x_3\end{bmatrix}\rightarrow\begin{bmatrix}a_1^{(2)} \newline a_2^{(2)} \newline a_3^{(2)} \newline \end{bmatrix}\rightarrow h_\theta(x)\)
隠れ層と出力層のあたいは以下の計算で求めることができます。
\(a_1^{(2)} = g(\Theta_{10}^{(1)}x_0 + \Theta_{11}^{(1)}x_1 + \Theta_{12}^{(1)}x_2 + \Theta_{13}^{(1)}x_3)\)
\(a_2^{(2)} = g(\Theta_{20}^{(1)}x_0 + \Theta_{21}^{(1)}x_1 + \Theta_{22}^{(1)}x_2 + \Theta_{23}^{(1)}x_3)\)
\(a_3^{(2)} = g(\Theta_{30}^{(1)}x_0 + \Theta_{31}^{(1)}x_1 + \Theta_{32}^{(1)}x_2 + \Theta_{33}^{(1)}x_3)\)
\(h_\Theta(x) = a_1^{(3)} = g(\Theta_{10}^{(2)}a_0^{(2)} + \Theta_{11}^{(2)}a_1^{(2)} + \Theta_{12}^{(2)}a_2^{(2)} + \Theta_{13}^{(2)}a_3^{(2)})\)
一見どれをどうしたらこんな計算になるのか意味不明であったが、調べていくと、上記の例では\(a_1^{(2)}\)を求めるためには、\(\Theta_{10}^{(1)}x_0\)から連なる積を和で計算するものである。この\(\Theta_{10}\)というのは少し下に解説有。つまり、1レイヤーの2ユニット目なら重さ\(\Theta_{2,0}\)から始まり、次のユニットでは(2,1)/(2,2)という重さをかけていくわけである。もちろん何にかけるのかと言うと、\(\Theta_{1,0}\)なら1番目のユニットである\(x_0\)、\(\Theta_{1,1}\)なら2番目のユニットである\(x_1\)にかけていく。
ちなみに、\(a_1^{(2)}\)\(a_2^{(2)}\)\(a_3^{(2)}\)とかはシグモイド関数の中にあるので、全て0から1の間の数値ということになります。
下記拡大図参照。
レイヤー\(j\)に\(s_j\)個ユニットがあって、レイヤー\(j+1\)に\(s_{(j+1)}\)個ユニットがあった場合、\(\Theta^{(j)}\)の次元は\(s_{(j+1)}\)×\((s_j+1)\)になる。
講義を進めていくと、上記の長い式をまとめたものがありました。
例として、2つ目のレイヤーのノード\(k\)である\(z\)は以下の式で表すことができます。
\(z_k^{(2)} = \Theta_{k,0}^{(1)}x_0 + \Theta_{k,1}^{(1)}x_1 + \cdots + \Theta_{k,n}^{(1)}x_n\)
先ほどのこの式と比べると分かりやすいですね。
\(a_2^{(2)} = g(\Theta_{20}^{(1)}x_0 + \Theta_{21}^{(1)}x_1 + \Theta_{22}^{(1)}x_2 + \Theta_{23}^{(1)}x_3)\)
ベクトル化した計算だと以下のようになります。
\(\begin{align*}x = \begin{bmatrix}x_0 \newline x_1 \newline\cdots \newline x_n\end{bmatrix} &z^{(j)} = \begin{bmatrix}z_1^{(j)} \newline z_2^{(j)} \newline\cdots \newline z_n^{(j)}\end{bmatrix}\end{align*}\)
\(z^{(j)} = \Theta^{(j-1)}a^{(j-1)}\)
ここのようにレイヤーの若い方から計算を進めていくことを、フォワードプロパゲーション(Forward Propagation:順方向伝搬)といいます。
ニューラルネットワークが(異なるニューロンが互いに)どう接続されるかはアーキテクチャと呼ばれている。(隠れ層が2つ以上の場合の事を指す?)
ニューラルネットワークを使ってand演算を使用する。
下記例の式。
\(\begin{align*}\begin{bmatrix}x_0 \newline x_1 \newline x_2\end{bmatrix} \rightarrow\begin{bmatrix}g(z^{(2)})\end{bmatrix} \rightarrow h_\Theta(x)\end{align*}\)
パラメータ\(\theta\)を以下のように仮定した場合、and演算ができる。
\(\Theta^{(1)}\)=[-30 20 20]
\(h_\Theta(x) = g(-30 + 20x_1 + 20x_2)\)
\(x_1 = 0 \ \ and \ \ x_2 = 0 \ \ then \ \ g(-30) \approx 0\)
\(x_1 = 0 \ \ and \ \ x_2 = 1 \ \ then \ \ g(-10) \approx 0\)
\(x_1 = 1 \ \ and \ \ x_2 = 0 \ \ then \ \ g(-10) \approx 0\)
\(x_1 = 1 \ \ and \ \ x_2 = 1 \ \ then \ \ g(10) \approx 1\)
andとorで出力が1になる組み合わせを探す感じなのかな?
次はNOT演算。
負の大きなウェイトを否定したい変数の前にNOTをつける。
NOT\(x_1\) and NOT\(x_2\)は\(x_1 = x_2 = 0\)という意味。
以下図。右図は真理値表。
上記の図から見ても分かる通り、\(x_1\)と\(x_2\)が0のときのみ\(a^{(2)}_1\)が1となる。
これまでのand,NOT,orを組み合わせると\(x_1 XNOR x_2\)という関数ができあがる。
以下先生の図。とてもわかりやすい。
つまり、\(x_1 XNOR x_2\)というのは、\(x_1 = x_2 = 0 or x_1 = x_2 = 1\)という、\(x\)両方が0か1かの意味である。
これまでは、0か1の分類であったが、より多くの分類をするとき(例だと、画像を見て歩行者か車かバイクかトラックかを分類)には以下の図のようにする。
それぞれが出力層である(ここでの出力層は4つのレイヤーとなる)。
例として挙げた、歩行者を分類したいなら一番左の1番目のユニットだけが1で他は0、車を分類したいなら左から2番目の出力層で2番目のユニットだけが1、他は0というように以前学習したONEvsALLを使用することで分類する。
Ⅱ.おまけ
aとbがベクトルの場合、\(a^{(T)}b = b^{(T)}a\)。よく使うのでメモ。
Ⅲ.さいごに
今回はニューラルネットワークについて学習しました。前回は0か1かの計算でしたが、今回はONEvsALLになりましたね。実装も前回までの知識を活かしながら先生のヒントを使い、何とか終わらせることができました。どこかでか一度総復習したいと思います。
それではweek5も頑張っていきます!