前回: 雑記 - クッキーの日記
- From GRU to Transformer - Sewade Ogun's Website : GRU を徐々に Self-Attention に近づけていくブログ記事。
- RNN — PyTorch 2.9 documentation
- GRU — PyTorch 2.9 documentation
[1] では GRU のキーアイデアを「隠れ状態の加算的更新」だとしていますね。以下の式が示され、
は「現在のコンテクスト」、
は「アップデートゲート」とのことです (ところで、
は 0 のときに隠れ状態をコンテクストに刷新し、1 のときに前回の隠れ状態を完全に維持するので、どちらかというと「アップデートしないゲート」であるように思えるのですが、なぜこれが「アップデートゲート」なのでしょうか) 。
さておき、上式の
は「前の特徴を維持する度合い」で、これが状況によって調整できるのがミソでしょうね。言われてみれば、きちんと訓練できるかはさておき、GRU の方が Vanilla RNN よりも「これまでの特徴と現在の観測を踏まえて現在の特徴を出力する」汎用的な構造であるように思います (無論、Vanilla RNN 登場時の想定用途や計算リソース上は Vanilla RNN が適していたのだと思いますが)。Vanilla RNN のように「前の時刻の特徴
に
によらず常に
を乗じる」のでは、「ある時刻の特徴を徐々に忘れていく」といったメカニズムしか表現できないはずです。これでは勾配が消失しやすいとかいう以前に、メカニズムへの仮定が強すぎるように感じます。
GRU が理論上 Vanilla RNN をカバーするのは確かだね。GRU [3] でリセットゲートのバイアスを大きい値に固定して、アップデートゲートの重みとバイアスを 0 に固定したら Vanilla RNN [2] に他ならないよ。