再帰型ニューラルネットワーク(RNN, Recurrent Neural Network)とは、隠れ層の一部にフィードバックループが存在する構造を持った人工ニューラルネットワークのことです。
このフィードバックループは、過去の情報を新しい情報にフィードバックし、人工ニューラルネットワークが過去の情報も考慮して学習することを実現します。
例えば、RNNに渡すデータが\(\boldsymbol{x}=(\boldsymbol{x}_1, \boldsymbol{x}_2, \cdots, \boldsymbol{x}_T)\)だったとします。ここで\(\boldsymbol{x}\)は時系列データや文章など過去の情報が意味を持つデータを想定しています。また、\(\boldsymbol{x}\)の各要素はn次元ベクトルで表現しており、これは複数の時系列データなどを合成したものを想定しています。一つの時系列データを入力する場合は、\(\boldsymbol{x}\)の各要素はスカラーになります。
そして、ネットワークの過去の情報を記憶する部分を\(\boldsymbol{h}=(\boldsymbol{h}_0, \boldsymbol{h}_1, \cdots, \boldsymbol{h}_T)\)としたとします。この\(\boldsymbol{h}\)を隠れ状態ベクトルと呼びます。なお、\(\boldsymbol{h}\)の要素の次元数と\(\boldsymbol{x}\)の要素の次元数は同じである必要はありません。
このとき、最も単純なRNNでは、任意の\(\boldsymbol{h}_t\)を以下のように更新します。
\[\boldsymbol{h}_t=f(W_h \boldsymbol{h}_{t-1}+W_x \boldsymbol{x}_t + \boldsymbol{b}_h)\]
・\(W_h\)は、\(\boldsymbol{h}_{t-1}\)に対する重みの行列です。\(\boldsymbol{h}_{t-1}\)が\(m\)次元の列ベクトルであれば、\(W_h\)は\(m\)行\(m\)列の正方行列です。
・\(W_x\)は、\(\boldsymbol{x}_t\)が\(n\)次元の列ベクトルであれば、\(m\)行\(n\)列の行列です。
・\(f()\)は、活性化関数です。
・\(\boldsymbol{b}_h\)は、活性化関数が活性化し始める閾値を調整するバイアスベクトルです。これは、\(m\)次元の列ベクトルです。
\(\boldsymbol{h}_t\)は、以下のように順番に更新していきます。
\[\boldsymbol{h}_1=f(W_h \boldsymbol{h}_{0}+W_x \boldsymbol{x}_1 + \boldsymbol{b}_h)\]
\[\boldsymbol{h}_2=f(W_h \boldsymbol{h}_{1}+W_x \boldsymbol{x}_2 + \boldsymbol{b}_h)\]
\[\boldsymbol{h}_3=f(W_h \boldsymbol{h}_{2}+W_x \boldsymbol{x}_3 + \boldsymbol{b}_h)\]
そして、\(\boldsymbol{h}_1 \sim \boldsymbol{h}_T\)を後段のネットワークに渡します。
このようにして、RNNは、時系列データなど過去の情報が意味を持つデータの特徴を後段のネットワークに渡します。
なお、RNNに渡すデータは、通常、分割して渡します。例えば、音楽であれば、1曲をある時間間隔で分割して、データセットを作ります。そして、\(\boldsymbol{h}_T\)を次の分割のRNNにおける\(\boldsymbol{h}_0\)に代入することで時間的な繋がりをキープします。