GRU


数式

GRUとは、Gated Recurrent Unitの略で、RNNの一種。 通常の単純なRNNは入力x(t)x^{(t)}と前の時刻の隠れ層h(t1)h^{(t-1)}を入力として、次の時刻の隠れ層h(t)h^{(t)}を出力する。

h(t)=ftanh(x(t),h(t1))h^{(t)} = f^{\tanh}(x^{(t)},h^{(t-1)})

ここで、ftanhf^{\tanh}は時刻ttの入力と前の時刻の隠れ層を重み付き和で結合し、活性化関数にtanhを用いたものである。

GRUの数式は以下の通り。

z(t)=fzσ(x(t),h(t1))r(t)=frσ(x(t),h(t1))h~(t)=fhtanh(x(t),r(t)h(t1))h(t)=(1z(t))h(t1)+z(t)h~(t)\begin{align} z^{(t)} &= f_z^{\sigma}(x^{(t)},h^{(t-1)}) \\ r^{(t)} &= f_r^{\sigma}(x^{(t)},h^{(t-1)}) \\ \tilde{h}^{(t)} &= f_h^{\tanh}(x^{(t)},r^{(t)} \odot h^{(t-1)}) \\ h^{(t)} &= (1-z^{(t)}) \odot h^{(t-1)} + z^{(t)} \odot \tilde{h}^{(t)} \end{align}

突然複雑になった。

説明

GRUは、通常のRNNの隠れ層を、リセットゲートと更新ゲートに分けたもの。リセットゲートは、前の時刻の隠れ層をどれだけ無視するかを決める。更新ゲートは、前の時刻の隠れ層と現在の入力をどれだけ重視するかを決める。

(4)式を見ると、 一つ前の隠れ層h(t1)h^{(t-1)}と調整された隠れ層h~(t)\tilde{h}^{(t)}の重み付き和を取っていることがわかる。その重み付き和のパラメータがz(t)z^{(t)}になっている。すなわちz(t)z^{(t)}は、一つ前の隠れ層h(t1)h^{(t-1)}をどれだけ重視するか(hhをどの程度更新するか)を決めるパラメータである。そのz(t)z^{(t)}は入力x(t)x^{(t)}と前の時刻の隠れ層h(t1)h^{(t-1)}から決まる。

(3)式を単純なRNNの式と比較すると、h~(t)\tilde{h}^{(t)}は、前の隠れ層をrr倍していることがわかる。これにより、以前の情報をどれだけ弱めるかを決めている。そのためrrはリセットゲートと呼ばれる。rrzzと同様に入力x(t)x^{(t)}と前の時刻の隠れ層h(t1)h^{(t-1)}から決まる。

GRUは通常の単純なRNNにrrzzという調整パラメータを追加したものと考えることができる。リセットゲートrrが大きくなれば以前の情報が強く反映され、更新ゲートzzが大きくなれば現在の情報が強く反映される。

参考

【深層学習】GRU - RNN に記憶をもたせる試みその1【ディープラーニングの世界 vol. 10 】