工学系大学院生のブログ

2人の大学院生による雑記ブログ

第1-1回 数学から見るニューラルネットワーク [python]




 機械学習でよく聞くニューラルネットワークについて数学的にどうやって計算しているのか基本的な部分を紹介していきます.


 ゴールは、「ライブラリを使わずニューラルネットワークのプログラミングができるようになること」とします.


 そのため、実装方法や使用方法にのみ興味がある方は別のホームページをご覧ください.



 また,ニューラルネットワークの内容としては,出力が「 0 か 1 」という分類について掘り下げていきます.気が向いたら回帰もするかもしれません.


1 ニューラルネットワークの概要


まず、ニューラルネットワークの模式図は下記の通りです.

 

 ユニット1が入力\((x_1, x_2, x_3)\)を受け取り、総入力\(u\)を計算し、出力\(z\)を得ます.ここで、\(w\)は重み、\(b\)はバイアス、\(f\)は活性化関数と呼ばれます.

\begin{align}
u &= w_1 x_1 + w_2 x_2 + w_3 x_3 + b \\
z &= f(u)
\end{align}


 簡単な例を示します.

 二つの数字\(x_1,x_2\)の大きさを比べ、\(x_1\)が大きければ\(1\)、\(x_2\)が大きければ\(0\)を返すように学習させたとします.その場合、ニューラルネットワークとしてそれぞれの値は次の通りになるはずです.

\begin{align}
u &= x_1 – x_2 \\
w_1 &= 1 \\
w_2 &= -1 \\
b &= 0
\end{align}

\begin{align}
z &= f(u)
\end{align}

\begin{align}
f(u) = \left\{
\begin{array}{l}
1 \ ; \ if \ \ u \geq 0 \\
0 \ ; \ if \ \ u < 0
\end{array} \right.
\end{align}

 まどろっこしい書き方になりますが、一つの解としてこのような結果が考えられます.


 ここで求めなければいけないものは重み\(w\)、バイアス\(b\)です.また、活性化関数\(f\)を事前に決める必要があります.


 複数の結果を出力する際は、次のように行列で書くことができます.

\begin{align}
u_1 &= w_{11} x_1 + w_{12} x_2 + w_{13} x_3 + b_1 \\
u_2 &= w_{21} x_1 + w_{22} x_2 + w_{23} x_3 + b_2 \\
u_3 &= w_{31} x_1 + w_{32} x_2 + w_{33} x_3 + b_3
\end{align}

\begin{align}
\textbf{u} &= \textbf{w} \textbf{x} + \textbf{b}
\end{align}

\begin{align}
\textbf{u} = \left[
\begin{array}{l}
u_1 \\
u_2 \\
u_3
\end{array} \right],
\textbf{x} = \left[
\begin{array}{l}
x_1 \\
x_2 \\
x_3
\end{array} \right],
\textbf{b} = \left[
\begin{array}{l}
b_1 \\
b_2 \\
b_3
\end{array} \right],
\end{align}

\begin{align}
\textbf{w} = \left[
\begin{array}{ccc}
w_{11} & w_{12} & w_{13} \\
w_{21} & w_{22} & w_{23} \\
w_{31} & w_{32} & w_{33}
\end{array} \right]
\end{align}

\begin{align}
\textbf{z} = \textbf{f}( \textbf{u} ) = \left[
\begin{array}{l}
f(u_1) \\
f(u_2) \\
f(u_3)
\end{array} \right]
\end{align}

 また、ややこしいですが、複数の層がある多層ネットワークでは、1層目の出力を用いて2層目の計算を行います.そして、2層目の結果を用いて3層目を計算します.肩文字を総数としてそれぞれの層における値は次のようになります.

\begin{align}
\textbf{u}^{(1)} &= \textbf{w}^{(1)} \textbf{x} + \textbf{b}^{(1)} \\
\textbf{z}^{(1)} &= \textbf{f}^{(1)}(\textbf{u}^{(1)}) \\
\textbf{u}^{(2)} &= \textbf{w}^{(2)} \textbf{z}^{(1)} + \textbf{b}^{(2)} \\
\textbf{z}^{(2)} &= \textbf{f}^{(2)}(\textbf{u}^{(2)}) \\
\textbf{u}^{(3)} &= \textbf{w}^{(3)} \textbf{z}^{(2)} + \textbf{b}^{(3(}
\end{align}

 ここで、求める値はそれぞれの層における重み\(\textbf{w}^{(l)}\)とバイアス\(\textbf{b}^{(l)}\)です.


 決める値は、各層における活性化関数\(\textbf{f}^{(l)}\)です.


2 活性化関数


活性化関数\(f\)の具体例を挙げます.

・\((0,1)\)を値域とするロジスティクス関数

\begin{align}
f(u) = \frac{1}{1+exp(-u)}
\end{align}


・\((-1,1)\)を値域とする双曲線正接関数

\begin{align}
f(u) = tanh(u) = \frac{exp(u) – exp(-u)}{exp(u) + exp(-u)}
\end{align}


・単純で計算量が少ない正規化線形関数
\begin{align}
f(u) = max(u, 0)
\end{align}

・線形写像
\begin{align}
f(u) = u
\end{align}

 このような関数が目的に応じて使用されます.他にも活性化関数はあるため、今後の解説で出てくるたびに紹介します.

 次回は\(\textbf{w}\)、\(\textbf{b}\)といったパラメータを求める計算式、求め方をやっていきます.


hide

このエントリーをはてなブックマークに追加

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です