いものやま。

雑多な知識の寄せ集め

ニューラルネットワークについて学んでみた。(その3)

昨日は活性化関数について説明した。

今日は、ニューラルネットワークの学習に関して。

多層ネットワークの関数としての表現

以下では、ニューラルネットワークについて学んでみた。(その1) - いものやま。 で書いた、多層ネットワークについて考えていく。

多層ネットワークの出力  \boldsymbol{y} \in \mathbb{R}^{J_L} は、引数が入力  \boldsymbol{x} \in \mathbb{R}^{J_1} で、パラメータ  \boldsymbol{w}^{(2)}_1, b^{(2)}_1, \cdots , \boldsymbol{w}^{(2)}_{J_2}, b^{(2)}_{J_2}, \cdots \cdots , \boldsymbol{w}^{(L)}_1, b^{(L)}_1, \cdots, \boldsymbol{w}^{(L)}_{J_L}, b^{(L)}_{J_L} をもった関数とみることが出来るので、次のように書くことが出来る。

 {\displaystyle
\boldsymbol{y} = \boldsymbol{y} ( \boldsymbol{x} ; \boldsymbol{w}^{(2)}_1, b^{(2)}_1, \cdots , \boldsymbol{w}^{(2)}_{J_2}, b^{(2)}_{J_2}, \cdots \cdots , \boldsymbol{w}^{(L)}_1, b^{(L)}_1, \cdots, \boldsymbol{w}^{(L)}_{J_L}, b^{(L)}_{J_L} )
}

すべてのパラメータをベクトル  \boldsymbol{w} で表すことにすると、次のように書くことも出来る。

 {\displaystyle
\boldsymbol{y} = \boldsymbol{y} ( \boldsymbol{x} ; \boldsymbol{w} )
}

多層ネットワークでは、このパラメータ  \boldsymbol{w} を学習していくことになる。

訓練データと誤差関数

入力  \boldsymbol{x} に対する望ましい出力を  \boldsymbol{d} \in \mathbb{R}^{J_L} としたとき、このペア  (\boldsymbol{x}, \boldsymbol{d}) を訓練サンプルと呼ぶ。
また、その集合  \left\{ (\boldsymbol{x}_1, \boldsymbol{d}_1), \cdots, (\boldsymbol{x}_N, \boldsymbol{d}_N) \right\} を訓練データと呼ぶ。

多層ネットワークでは、入力  \boldsymbol{x} に対する出力  \boldsymbol{y} と、望ましい出力  \boldsymbol{d} との誤差が出来るだけ小さくなるように、パラメータ  \boldsymbol{w} を更新していく。

誤差を考えるうえで必要となってくるのが、誤差関数。

よく使われるのが、次の二乗和誤差  E ( \boldsymbol{w} )

 {\displaystyle
\begin{align}
E_n ( \boldsymbol{w} ) &= \frac12 \left\| \boldsymbol{d}_n - \boldsymbol{y} ( \boldsymbol{x}_n ; \boldsymbol{w} ) \right\|^2 \\
E ( \boldsymbol{w} ) &= \sum_{n = 1}^N E_n ( \boldsymbol{w} ) \\
&= \frac12 \sum_{n = 1}^N \left\| \boldsymbol{d}_n - \boldsymbol{y} ( \boldsymbol{x}_n ; \boldsymbol{w} ) \right\|^2
\end{align}
}

なお、他の誤差関数を使う場合もある。

最急降下法

誤差関数の値を小さくさせる方法として、最急降下法がある。

誤差関数  E ( \boldsymbol{w} ) の勾配  \nabla E = \frac{ \partial E }{ \partial \boldsymbol{w} } を使って、十分に小さい学習係数  \varepsilon > 0 でパラメータ  \boldsymbol{w}

 {\displaystyle
\boldsymbol{w} \leftarrow \boldsymbol{w} - \varepsilon \nabla E ( \boldsymbol{w} )
}

と更新する。

学習係数  \varepsilon が十分に小さければ、誤差関数  E (\boldsymbol{w}) の値は確実に減少していく。

なお、誤差関数は凸関数になっていないので、必ずしも最適解に収束するとは限らず、局所解に収束する場合もある。

確率的勾配降下法

最急降下法では、勾配  \nabla E を使ってパラメータ  \boldsymbol{w} を更新するが、このような方法をバッチ学習と呼ぶ。
(訓練データすべての誤差  E ( \boldsymbol{w} ) に対して、その値が小さくなるように一括で更新を行うから)

一方、個々の訓練サンプルに対する誤差  E_n ( \boldsymbol{w} ) に対して、それぞれ学習を行っていく方法も考えられる。
この場合、個々のサンプルに対する誤差の勾配  \nabla E_n を使って、次のようにパラメータを更新する:

 {\displaystyle
\boldsymbol{w} \leftarrow \boldsymbol{w} - \varepsilon \nabla E_n ( \boldsymbol{w} )
}

この方法を、確率的勾配降下法と呼ぶ。
確率的勾配降下法では、パラメータを更新するたびに別の訓練サンプルを使っていくことになる。

確率的勾配降下法は、バッチ学習に比べて、以下のようなメリットがある:

  • 訓練データに冗長性があっても影響を受けない。
    (バッチ学習だと、訓練データが増えれば増えるほど、1回の学習が大変になる)
  • 局所解にはまってしまう確率が下がる。
    (個別の訓練サンプルに対して誤差を改善するので、全体の誤差は一時的に悪くなることもあるけど、その分、探索の範囲は広くなるため)
  • パラメータの更新が小刻みに行われるので、途中経過を細かく監視できる。
  • 学習しながら訓練サンプルの追加などが出来る。

ただし、上にもちょっと書いたとおり、個別の訓練サンプルに対する誤差を改善した結果、全体の誤差が悪くなることもあるので、学習係数を十分に小さくしないと、学習が安定しなくなる危険性もある。
(かといって、小さくしすぎると収束まで時間がかかるのも、難しいところ)

ミニバッチを使った方法

バッチ学習と確率的勾配降下法の中間の方法として、ミニバッチを使った方法がある。
これは、訓練データをミニバッチと呼ばれるある程度のサイズの集合に分けて、ミニバッチごとにパラメータの更新を行う方法。
更新を行うたびに、別のミニバッチを使っていくことになる。

複数の訓練サンプルに対して誤差を小さくしようとするので、確率的勾配降下法よりも学習が安定しやすく、学習係数を確率的勾配降下法よりも大きくしやすい。
一方で、バッチ学習よりも訓練データのサイズは小さくなるので、1回の学習のコストはバッチ学習よりも低くなる。

勾配計算については、また明日。

今日はここまで!

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)