Toshusai blog

知識の保管庫

Deep Learning入門概略

はじめに

オライリー・ジャパンのゼロから作るDeep Learning」を読んで忘れないうちに備忘録的にディープラーニングの教師ありの分類問題についてまとめていきます。 隠れ層が1層の2層ニューラルネットワークを数値微分を使って勾配を求めて学習する部分までまとめます。

パーセプトロン

パーセプトロンとはニューラルネットワークディープラーニング)の起源となるアルゴリズム。 複数の入力を受け、1つの出力をする。 出力は0か1だけ、例えば、二つの入力の合計がθ(閾値)以下なら0、それ以外なら1を返す関数。


\begin{cases}
    y = 0 (x_1 + x_2 \leq \theta)\\
    y = 1 (x_1 + x_2 > \theta)
\end{cases}

ニューラルネットワーク

ニューラルネットワークでは複数の入力にそれぞれ重みをかけて、その上にバイアスを足して、活性化関数によって変換したものを出力します。 文字にすると分かりにくいので数式で表すと。


y = h(w_1x_1 + w_2x_2 + b)\\
h(x) =
\begin{cases}
0 \, (x \leq 0)\\
1 \, (x > 0)
\end{cases}
w1, w2は重み、bがバイアス、hが活性化関数です。

これを層にすることでニューラルネットワークを構築します。 入力層、中間層、出力層に分けられて、それぞれにいくつものノードが存在します。上記の入力、出力を繰り返して信号を伝達していきます。

分類問題を学習するには、入力と出力のデータ(教師データ)を用意します。 ニューラルネットワークに入力し、その出力と教師データの正解との誤差を求め、重み、バイアスを調整して、ニューラルネットワークの出力を正解に近づける。 これを繰り返して、分類問題を学習します。

行列

ニューラルネットワークの計算は行列を使ってまとめて行うことができます。


\mathbb{Y} = \mathbb{X}\mathbb{W} + \mathbb{B}
内積の計算を行うので、重みWの行数は入力Xの列数である必要があり、バイアスBは重みの列数と同じ次元である必要があります。

活性化関数

活性化関数が実際にどういった関数か、今回使う活性化関数を紹介します。

シグモイド関数

h(x) = \frac{1}{1 + e^{-x}}
グラフと書くと分かりますが、0から1の実数を出力する単調増加関数です。

ソフトマックス関数

y_k = \frac{e^{a_k}}{\sum_{i=1}^n e^{a_i}}

シグモイド関数と同様に、0から1の実数を出力します。この値は確率として解釈でき、多クラス分類に使うことができます。 例えば出力が(0.1, 0.1, 0.2, 0.6)であれば4番目のクラスy4の確率は60%と言えます。

損失関数

損失関数とは簡単に言えば誤差を求める関数です。 yはニューラルネットワークの出力、tは教師データとします。
2乗和誤差

E=\frac{1}{2}\sum {(y_k-t_k)}^2

交差エントロピー誤差

E=-\sum t_k\log{y_k}

勾配

勾配とは、ある関数のすべての変数の偏微分をベクトルとしてまとめたものです。 関数f(x, y)なら勾配は


(\frac{\partial f}{\partial x},
\frac{\partial f}{\partial y})

です。 損失関数の勾配を求めれば、勾配はその点において、最も変化量の多い方向を指します。 これを用いて、誤差が最も少なくなる方向に重み、バイアスを変更します。 ※勾配はあくまでその点において、極小値、鞍点を探すだけで、必ずその関数の最小値を指すわけではない。

数値微分

勾配を求めるために偏微分を使いたいが、微分はxの小さい変化(限りなく0に近い)によって関数f(x)がどれだけ変化するというものです。 プログラムでは限りなく0に近い値は表せないので、実際に0近い値だけxを変化させて微分を求めることを数値微分と言います。 丸め誤差で省略されない程度に、例えば変化量を0.0001として

\frac{f(x + 0.0001) - f(x)}{0.0001}
のように求めます。