【ニューラルネット】多層パーセプトロン(MLP)の原理・計算式

このサイトでは、ニューラルネットワーク(多層パーセプトロン・MLP)や特徴や原理、その計算方法についてまとめました。

多層パーセプトロン(MLP)とは

多層パーセプトロン(MLP)とは、下図のように(単純)パーセプトロンを複数繋いで多層構造にしたニューラルネットです。

左から入力層、中間層(隠れ層)、出力層と呼ばれます。
この場合は3層構造なので「3層パーセプトロン」とも呼ばれます。
ユニット数や層数は決まっているわけではありません。
そのため、例えば入力層のユニット数を3以上に増やしたり、中間層の階層数を2つにして4層構造にすることも可能です。
作成するモデルによってユニット数や階層数を調整します。

(単純)パーセプトロンの基礎はこちら
関連記事 【ニューラルネット】基本原理と単純パーセプトロン

確率的勾配降下法

多層パーセプトロンでは、「確率的勾配降下法」で重みを更新します。

(1) \begin{eqnarray*} w_{ji, t+1}^{(l+1)}=w_{ji, t}^{(l)}-\epsilon \frac{\partial E_n}{\partial w_{ji, t}^{(l)}} \end{eqnarray*}

パラメータ 説明
w_{ji, t+1}^{(l)} l-1層目のi番目のユニットからl層目の j 番目のユニットへの重み(更新前の古い値)
w_{ji, t}^{(l)} l層目のi番目のユニットからl層目の j 番目のユニットへの重み(更新後の新しい値)
目的関数E_n 2乗誤差。目的関数が最小になるときの重みを求める。
\epsilon 学習率(重みの学習速度を決定するパラメータ)

誤差逆伝播により、\cfrac{\partial E_n}{\partial w_{ji}^{(l)}}を計算できます。

出力層の重み更新

2乗誤差E_nを出力層の重みw_{ji}^{(l)} で偏微分すると次のようになります。

(2) \begin{eqnarray*} \frac{\partial E_n}{\partial w_{ji}^{(l)}} &=& \frac{\partial}{\partial w_{ji}^{(l)}}\cfrac{1}{2}(t_j - g(u_{j}^{(l)}))^{2} \\ &=& (t_j - g(u_{j}^{(l)}))\cdot \frac{\partial}{\partial w_{ji}^{(l)}}(t_j - g(u_{j}^{(l)})) \\ &=& (t_j - g(u_{j}^{(l)}))\cdot \frac{\partial}{\partial u_{j}^{(l)}}(t_j - g(u_{j}^{(l)}))\cdot \frac{\partial u_{j}^{(l)}}{\partial w_{ji}^{(l)}} \\ \\ &=& (g(u_{j}^{(l)}) - t_j)\cdot g'(u_{j}^{(l)})\cdot g(u_{i}^{(l-1)}) \\ \\ &=& (g(u_{j}^{(l)}) - t_j)g(u_{j}^{(l)})(1 - g(u_{j}^{(l)}))g(u_{i}^{(l-1)}) \end{eqnarray*}

パラメータ 説明
t_j 教師データ。
活性化関数g(x)(シグモイド) g(x) = \cfrac{1}{1 + \exp(-x)}
活性化関数の微分 g'(x)=g(x)(1 - g(x))

中間層の重み更新

2乗誤差 E_nを中間層の重み w_{ji}^{(l)}で偏微分すると次のようになります。

(3) \begin{eqnarray*} \frac{\partial E_n}{\partial w_{ji}^{(l)}} &=& \frac{\partial E_n}{\partial u_{j}^{(l)}}\frac{\partial u_{j}^{(l)}}{\partial w_{ji}^{(l)}} = \delta_{j}^{(l)}\frac{\partial u_{j}^{(l)}}{\partial w_{ji}^{(l)}} \end{eqnarray*}

右辺第1項は次のようになります。

(4) \begin{eqnarray*} \delta_{j}^{(l)} &=& \frac{\partial E_n}{\partial u_{j}^{(l)}} = \sum_{k}\frac{\partial E_n}{\partial u_{k}^{(l+1)}}\frac{\partial u_{k}^{(l+1)}}{\partial u_{j}^{(l)}} = \sum_{k}\delta_{k}^{(l+1)}w_{kj}^{(l+1)}g'(u_{j}^{(l)}) \\ &=& \Bigl(\sum_{k}\delta_{k}^{(l+1)}w_{kj}^{(l+1)}\Bigr)g(u_{j}^{(l)})(1 - g(u_{j}^{(l)})) \end{eqnarray*}

右辺第2項は次のようになります。

(5) \begin{eqnarray*} \frac{\partial u_{j}^{(l)}}{\partial w_{ji}^{(l)}} = g(u_{i}^{(l-1)}) \end{eqnarray*}

よって

(6) \begin{eqnarray*} \frac{\partial E_n}{\partial w_{ji}^{(l)}} = \delta_{j}^{(l)}\frac{\partial u_{j}^{(l)}}{\partial w_{ji}^{(l)}} = \Bigl(\sum_{k}\delta_{k}^{(l+1)}w_{kj}^{(l+1)}\Bigr)g(u_{j}^{(l)})(1 - g(u_{j}^{(l)}))g(u_{i}^{(l-1)}) \end{eqnarray*}

中間層lの重みを更新するときは、その次の層l+1\delta_{k}^{(l+1)}が必要となります.
出力層での\deltaは、出力値と教師の差から求まります。
これを出力層から入力層の方向に順番に伝播させることで中間層の重みを更新します。

関連ページ
参考 pythonでニューラルネットワーク実装
関連 【機械学習入門】アルゴリズム&プログラミング
関連記事

コメント

  1. donaldkaoki より:

    ①確率的勾配降下法は自らの重みを変えることであり次の層の重みを変えるものではありません。
    ②パラメタの説明のuは上式には関係ありません。

    • 管理人 より:

      ※donaldkaoki様
      コメントありがとうございます。
      該当箇所を修正致しました。
      「確率的勾配降下法」において完全に勘違いしており、大変勉強になりました。