AI系のプロジェクトに入るので、ニュートラルネットワークくらいは勉強する。
まずは、ゼロから作るDeep Learning
の勉強から始める。
今日の話はパーセプロトンとニュートラルネットワーク。
パーセプロトン
複数の信号を入力として受け取り、一つの信号を出力する。
\begin{equation}
y= \left \{
\begin{array}{l}
0 (w_1x_1 + w_2x_2 \leq θ) \\
1 (w_1x_1 + w_2x_2 \gt θ)
\end{array}
\right.
\end{equation}
で表現される。θは限界値の閾値と呼ばれる。
(w1, w2, θ)の組み合わせを下記とすると、それぞれの論理演算を表現できる。
AND : (0.5, 0.5, 0.7)
NAND : (-0.5, -0.5, -0.7)
OR : (0.5, 0.5, 0.2)
※ 表現は無限に存在することに注意する。
上記を組み合わせれば、XORも表現できる。
ちなみにXOR = AND(NAND, OR)で表現できる。
パーセプロトンの強みは、「複雑な関数であっても、それを表現できるだけの可能性がある」ことである。
しかし、「重み」を決める作業は「人間」であるということはAIとしてかなり弱みになる。
ここで出てきたのが、ニュートラルネットワークである。
ニュートラルネットワークはパーセプトロンの課題を解決することを目指す。
具体的には、「適切な重みパラメータ」をデータから自動で学習できるということを目指す。
共通点
ニューロンのつながり方に関しては、パーせプロトンとニュートラルネットワークは同じである。
違いは、この後説明する「活性化関数」の選択肢である。
パーセプロトン:ステップ関数を選択
ニュートラルネットワーク:その他の関数を選択 (ex : シグモイド関数、ReLU関数)
この活性化関数がパーセプトロンとニュートラルネットワークの架け橋となる。
活性化関数とは
入力信号の総和を出力信号に変換する関数(h(x)のことを指す)
$$
y = h(b + w_1x_1 + w_2x_2)\label{a}\tag{1}
$$
\begin{equation} \label{b}\tag{2}
h(x)= \left \{
\begin{array}{l}
0 (x \leq 0のとき) \\
1 (x \gt 0のとき)
\end{array}
\right.
\end{equation}
上記 (式 2) で表される活性化関数は、閾値を境にして出力が切り替わる関数である。
それは「ステップ関数」や「段階関数」と呼ばれる。
そのため、「パーせプロトンでは、活性化関数にステップ関数を利用している」と言える。
つまり、活性化関数の候補としてたくさんある関数の中で、パーせプロトンは「ステップ関数」を採用している。
ニュートラルネットワークはこの活性化関数において、別の関数を利用する。
シグモイド関数
ニュートラルネットワークでよく用いられる活性化関数の一つは**シグモイド関数(sigmoid function)**である。
h(x) = \frac{1}{1 + e^{-x}}
シグモイド関数は活性化関数として古くから利用されていた。
最近は次に紹介するReLU (Rectified Linear Unit)という関数が利用される。
ReLU関数
\begin{equation} \label{c}\tag{3}
h(x)= \left \{
\begin{array}{l}
x (x \gt 0のとき) \\
0 (x \leq 0のとき)
\end{array}
\right.
\end{equation}
この関数を使ったものもニュートラルネットワークの一部である。
この関数の重みを変えながら、多重層にして出力を出していくのが次のステップである。
まずは、「パーセプトロンからニュートラルネットワーク」をまとめた。
次の記事では、ニュートラルネットワークをどう実装していくかを見ていくことにする。