深層学習day3 Section1:再帰型ニューラルネットワークの概念

要点まとめ

RNNの概要

再帰ニューラルネットワーク (RNN=Recurrent Neural Network)とは、時系列データのように時間的な繋がりを持つデータを扱うためのネットワーク。

時系列データの代表例としては、音声データ・テキストデータ等がある。

通常のNNでは入力→中間層→出力という構成だが、中間層への入力に対して一つ前の時系列データの中間層からを入力とすることで、時間軸の繋がりを持つ構成にしたものをRNNという。

RNNの数学的な記述


\displaystyle
u^{t} = \boldsymbol{W}_{(in)}\boldsymbol{x}^{t} + \boldsymbol{W}\boldsymbol{z}^{t-1} + b


\displaystyle
z^{t} = f(\boldsymbol{W}_{(in)}\boldsymbol{x}^{t} + \boldsymbol{W}\boldsymbol{z}^{t-1} + b)


\displaystyle
v^{t} = \boldsymbol{W}_{(out)}\boldsymbol{z}^{t} + c


\displaystyle
y^{t} = g(\boldsymbol{W}_{(out)}\boldsymbol{z}^{t}+c)

u^{t}は活性化関数を通す前、活性化関数を通したものをz^{t} という中間層となる。

出力側も同様に、活性化関数を通す前をv^{t}、活性化関数を通した後の出力をy^{t}としている。

誤差逆伝播の記述

BPTT(Back Propergation Through Time)の式は前記のRNNの式を微分を用いるが、かなり複雑。

 
\newcommand{\partialdiff}[2] {\frac{\partial {#1}}{\partial{#2}}}
\displaystyle
\partialdiff{\boldsymbol{E}}{\boldsymbol{W}_{(in)}} = \partialdiff{\boldsymbol{E}}{u^{t}}[\partialdiff{u^{t}}{\boldsymbol{W}_{(in)}}]^T = \delta^{t}[x^{t}]^T \\
\displaystyle
\partialdiff{\boldsymbol{E}}{\boldsymbol{W}_{(out)}} = \partialdiff{\boldsymbol{E}}{v^{t}}[\partialdiff{v^{t}}{\boldsymbol{W}_{(out)}}]^T = \delta^{out,t}[z^{t}]^T \\
\displaystyle
\partialdiff{\boldsymbol{E}}{\boldsymbol{W}} = \partialdiff{\boldsymbol{E}}{u^{t}}[\partialdiff{u^{t}}{\boldsymbol{W}}]^T = \delta^{t}[z^{t-1}]^T \\
\displaystyle
\partialdiff{\boldsymbol{E}}{b} = \partialdiff{\boldsymbol{E}}{u^{t}}\partialdiff{u^{t}}{b} = \delta^{t} \\
\displaystyle
\partialdiff{\boldsymbol{E}}{c} = \partialdiff{\boldsymbol{E}}{v^{t}}\partialdiff{v^{t}}{c} = \delta^{out,t}

パラメータの更新式は

 \displaystyle{
\boldsymbol{W}^{t+1}_{(in)} = \boldsymbol{W}^{t}_{(in)} - \epsilon \partialdiff{\boldsymbol{E}}{\boldsymbol{W}_{(in)}} =  \boldsymbol{W}^{t}_{(in)} - \epsilon \sum^{T_{t}}_{z=0} {\delta}^{t-z}[\boldsymbol{x}^{t-z}]^{T} \\
\boldsymbol{W}^{t+1}_{(out)} = \boldsymbol{W}^{t}_{(out)} - \epsilon \partialdiff{\boldsymbol{E}}{\boldsymbol{W}_{(out)}} =  \boldsymbol{W}^{t}_{(out)} - \epsilon {\delta}^{out,t}[\boldsymbol{z}^{t}]^{T} \\
\boldsymbol{W}^{t+1} = \boldsymbol{W}^{t} - \epsilon \partialdiff{\boldsymbol{E}}{\boldsymbol{W}} =  \boldsymbol{W}^{t} - \epsilon \sum^{T_{t}}_{z=0} {\delta}^{t-z}[\boldsymbol{z}^{t-z-1}]^{T} \\
b^{t+1} = b^{t} - \epsilon \partialdiff{\boldsymbol{E}}{b} = b^{t} - \epsilon \sum^{T_{t}}_{z=0} \delta^{t-z} \\
c^{t+1} = c^{t} - \epsilon \partialdiff{\boldsymbol{E}}{c} = c^{t} - \epsilon \delta^{out,t}
}

実装演習

バイナリ加算についてのRNNの結果を確認。

f:id:yui-gen-ron:20211227023511p:plain
バイナリ加算
f:id:yui-gen-ron:20211227023531p:plain
lossの変化

確認テスト等考察

現在の中間層への、前の中間層からの入力にも重みがあるのがRNNの特徴である。