Gated Recurrent Unit (GRU)
ゲート付き回帰ユニット(GRU)は、更新ゲートとリセットゲートによって記憶する情報を制御する回帰セルです。計算式、GRUとLSTMの比較、コードについて解説します。
ゲート付きリカレントユニット(GRU)は、系列を1ステップずつ処理するリカレントニューラルネットワーク(RNN)のセルです。更新ゲートとリセットゲートという2つの学習可能なゲートを使い、各ステップで記憶のどの部分を保持し、どの部分を上書きするかを決定します。Kyunghyun Cho氏らは2014年に、機械翻訳のためのRNNエンコーダー・デコーダーでGRUを提案しました。ゲートによって多数の時間ステップにわたって勾配が伝わるため、勾配消失が起きる単純なRNNよりも長距離の依存関係を学習できます。GRUは長短期記憶ネットワーク(LSTM)を簡略化したもので、隠れ状態は2つではなく1つ、重みブロックは4つではなく3つです。時系列分析、音声、その他の系列データに使用されます。
GRUの仕組み#
各時刻tで、GRUは現在の入力xₜと直前の隠れ状態hₜ₋₁を組み合わせます。2つのゲートはシグモイド関数を使い、状態の各要素について0から1までの値を出力します。
- リセットゲート: rₜ = σ(Wᵣxₜ + Uᵣhₜ₋₁ + bᵣ)は、新しい内容を提案する際に直前の状態をどれだけ使うかを決定します。値が0に近いと、セルは過去の情報を無視できます。これは、新しいフレーズの始まりなどの境界で役立ちます。
- 更新ゲート: zₜ = σ(W_z xₜ + U_z hₜ₋₁ + b_z)は、直前の状態をどれだけ保持するかを決定します。値が1に近いと、古い状態をほぼそのまま引き継ぎ、情報を長い範囲にわたって保持できます。
- 候補状態: h̃ₜ = tanh(Wxₜ + U(rₜ ⊙ hₜ₋₁) + b)は、入力とリセットゲートでスケーリングした履歴から新しい内容を提案します。tanhを使い、値を−1から1の範囲に保ちます。
- 新しい状態: hₜ = (1 − zₜ) ⊙ h̃ₜ + zₜ ⊙ hₜ₋₁は、候補状態と古い状態を要素ごとにブレンドします。
更新ゲートが1に近い値を保つと、新しい状態は古い状態のほぼコピーとなり、そのコピーを通じて勾配が逆向きに伝わり、減衰はごくわずかです。この加算経路は、LSTMのセル状態と同じ役割を果たします。上記の式は元の論文に従っており、zₜが古い状態に重みを付けます。文献によってはzₜと1 − zₜの役割を入れ替えていますが、同じセルを表します。PyTorchのnn.GRUも同じブレンドを使いますが、行列乗算の後にリセットゲートを適用し、rₜ ⊙ (Uhₜ₋₁ + b)とします。これは候補状態の広く使われる変形です。
PyTorchでのGRU#
次のコードは、特徴ベクトルの系列(動画のフレームごとの特徴量など)にGRUを適用し、同じ幅のLSTMとモデルサイズを比較します。
import torch
from torch import nn
# A sequence of 64-dim features from 5 video frames: (batch, time, features)
frames = torch.randn(1, 5, 64)
# A GRU with a 128-dim hidden state, and an LSTM of the same size for comparison
gru = nn.GRU(input_size=64, hidden_size=128, batch_first=True)
lstm = nn.LSTM(input_size=64, hidden_size=128, batch_first=True)
# outputs holds the hidden state at every step; h_n is the final state
outputs, h_n = gru(frames)
print(f"Outputs: {tuple(outputs.shape)}, final state: {tuple(h_n.shape)}")
# GRU weights cover 3 blocks (reset, update, candidate); LSTM weights cover 4
gru_params = sum(p.numel() for p in gru.parameters())
lstm_params = sum(p.numel() for p in lstm.parameters())
print(f"GRU: {gru_params:,} parameters, LSTM: {lstm_params:,} parameters")Outputs: (1, 5, 128), final state: (1, 1, 128)とGRU: 74,496 parameters, LSTM: 99,328 parametersが出力されます。GRUはフレームごとに128次元の状態と最終状態を返します。最終状態は系列全体を要約し、後段の分類器で利用できます。また、必要なパラメーター数はLSTMのちょうど4分の3です。
GRU、LSTM、Transformerの比較#
- LSTM: 隠れ状態に加えて独立したセル状態を保持し、入力、忘却、出力の3つのゲートを使います。GRUは2つの状態を統合し、出力ゲートを省くため、パラメーター数が少なく、1ステップあたりの学習が速くなります。Junyoung Chung氏らが2014年に行った実証比較では、多声音楽や音声信号のモデル化でGRUはLSTMと同等でした。実際には、タスクを問わず一方が常に優れているわけではありません。
- 単純なRNN: ゲートを使わず、各ステップで状態全体を上書きします。そのため、長い系列では勾配が消失または爆発し、長い間隔で隔てられたイベントを関連付けるのが困難です。
- Transformer: アテンションを使い、系列のすべての位置を並列に処理します。GPUでの学習がはるかに速く、長距離のコンテキストもより適切に扱えるため、ほとんどの言語タスクでリカレントネットワークに取って代わりました。GRUは系列の長さによらず状態サイズが一定で、1ステップあたりの計算コストも一定です。そのため、ストリーミング音声、センサーデータ、小型デバイスに適しています。
用途#
- オプティカルフロー: ECCV 2020の最優秀論文賞を受賞したRAFTは、畳み込みGRUを使い、多数の反復を通じてフロー推定を改良します。畳み込みGRUは、行列乗算を畳み込みに置き換えたGRUであり、状態は特徴マップになります。
- 予知保全と予測: GRUは振動、温度、需要のデータストリームを読み込み、故障や将来の値を予測します。小型モデルが重要となる組み込みハードウェアで使われることもよくあります。
- 音声: デバイス上で動作する音声モデルは、少量の固定メモリで音声をフレームごとに処理できるため、GRUを使用します。ノイズ抑制器のRNNoiseは、一般的なCPU上でGRUレイヤーをリアルタイムに実行します。
- 行動認識: GRUはフレームごとの特徴量またはキーポイントの系列を読み取り、動画クリップの行動ラベルを出力します。トラッキングモードのYOLO26は、フレームをまたいで人物ごとに一貫したIDを割り当てます。これによって得られる人物ごとのバウンディングボックス系列やポーズキーポイント系列を、GRUで分類できます。










