深層学習:多層ニューラルネットワーク Forward Propagation

入力層、出力層の間に、一つ以上の隠れ層を入れて構成されるニューラルネットワークを、深層ニューラルネットワークと呼ぶ。
 隠れ層を増やせば、複雑な多クラス分類問題も学習可能に思えるが、バックプロパゲーションで誤差を伝播させると、隠れ層数が増えるにつれ、誤差が紛れていく勾配消失が起こり、重みの更新に困難が生じる。これに対応したアルゴリズムが深層学習である。
 2値分類問題の場合、出力ユニットは$${0\ {\text or}\ 1}$$の一つで良いが、多クラス分類問題の場合は出力ユニットはクラス数と同じ出力ユニットが必要である。
 クラスを$${(0,1,2, \cdots)}$$と表せられる多クラスな場合、クラスはone-hot vectorで表現され、次のように出力する。
$${0=(1,0,\cdots, 0)^T}$$、$${1=(0,1,\cdots, 0)^T}$$、$${2=(0,0,1,\cdots, 0)^T \cdots}$$
 隠れ層のユニット数を$${d}$$とし、入力ユニットが$${m-1}$$の入力層と隠れ層をつなぐ重みを$${{\bf W}^{(h)}}$$と置くと、隠れ層ユニットの全ては入力ユニットにつながっているから、$${{\bf W}}$$は$${m\times d}$$の実行列となる。ここで、$${m-1+1}$$の$${1}$$はバイアスユニットである。
 活性化関数を二値問題でよく使われるジグモイド関数の
$${\displaystyle{\phi(z)=\frac{1}{1+e^{-z}}}}$$とする。

Forward propagation

訓練データから出力を生成する作業を順伝搬(Forward Propagation)と呼ぶ。
ある隠れ層へのユニットkへの入力を$${{\bm a}^{(in)}_k=(a_{1,k}^{(in)}, a_{2,k}^{(in)}\cdots, a_{m,k}^{(in)})^{T}}$$とする。このユニットでかける重みを$${{\bf w}^{(h)}_k=(w_{1,k}^{(h)}, w_{2,k}^{(h)},\cdots, w_{m,k}^{(h)})^{T}}$$とおけば、
$${z^{(h)}_k={\bf w}_k^{(h)T}{\bf a}_k^{(in)}}$$
であり、ユニット$${k}$$からの出力は、活性化関数を経て$${\phi(z^{(h)}_k)}$$で与えられる。
ループせずにそのまま次の層へと送られるfeed forwardを考えれば、ある訓練データ$${{\bf x}=(x_1, x_2,\cdots,x_{m-1})}$$はバイアスユニットを加えて、$${{\bf a}^{in}}$$の$${m}$$次元ベクトルとなり、隠れ層に渡される。隠れ層の数を$${d}$$とした場合、隠れ層全ての重みは、列が各隠れ層の重みである$${m\times d}$$の行列$${{\bf W}^{(h)}}$$で表現でき、隠れ層の挿入力は、
$${{\bf z}^{(h)}={\bf a}^{(in)}{\bf W^{h}}}$$
の$${d}$$次元ベクトルとなる。
これを総データ$${n}$$に拡張すると、入力は$${n\times m}$$行列の$${{\bf A}^{in}}$$で
$${{\bf Z}^{(h)}={\bf A}^{(in)}{\bf W^{h}}}$$の$${n\times d}$$行列となり、さらにこれを活性化関数に入れ、出力層への入力の$${n\times d}$$行列が与えられる。
$${{\bf A}^{h}=\phi({\bf Z}^{(h)})}$$
出力層では、出力ユニットを$${t}$$として、重み$${{\bf W}^{(out)}}$$の$${d\times t}$$行列をかけて、
$${{\bf Z}^{(out)}={\bf A}^{(out)}{\bf W^{out}}}$$の$${n\times t}$$行列を活性化関数に渡し、最終の$${n\times t}$$な出力行列が得られる。
$${{\bf A}^{out}=\phi({\bf Z}^{(out)})}$$



この記事が気に入ったらサポートをしてみませんか?