RNN#

シンプルなRNN#

時点tの予測値ytを、その時点までに入手可能な特徴量xtで予測する関数yt=f(xt)を求めたい。 (添字は同じtだが、xtytより古い時点のデータとなることに注意)

特徴量だけでなく、1時点前の目的変数yt1を利用すれば、より精度は良くなると考えられる

yt=f(xt,yt1)

最もシンプルなモデルは行列Wx,Wyを用いて

yt=Wxxt+Wyyt1

と記述し、重みパラメータWx,Wyを求める方法が考えられる。

ディープラーニングとして扱う場合、活性化関数h()を通したzt=h(at)を考えて次のように書き換える形が考えられる

yt=Wzzt

ここで

at=Wzx+W~zzt1

である。 またa=(a1,,aK),h(a)=(1,h(a1),,h(aK))である。

活性化関数にはシグモイド関数やReLU関数でもよいが、RNNの場合は双曲線正接(tanh)関数

ftanh(x)=exexex+ex

を用いることが多い。tanhはシグモイド関数と形状が似ているが、値域が[1,1]と負の値を許しており、また二次微分の減衰がゆっくりとゼロになるため勾配消失が起きにくいという特性がある。

定数項を書く場合#

中間層

ht=f(W(in)xt+W(hidden)ht1+bf)

出力層

yt=g(W(out)ht+bg)

行列じゃない表記にすると、j番目のユニットは

hj(t)=f(i=1N(in)wij(in)xj+i=1N(hidden)wij(hidden)hj(t1)+bj(f))yj(t)=g(i=1N(out)wij(out)hj(t)+bj(g))

と思われる

実装(Keras)#

kerasだとSimpleRNNというクラスがあり、上記のようなRNNを呼び出すことができる

tf.keras.layers.SimpleRNN  |  TensorFlow v2.12.0

実装(Pytorch)#

実装(Python)#