GRU じーあーるゆー
GRUGated Recurrent UnitLSTMRNNゲート機構系列モデル
GRUについて教えて
簡単に言うとこんな感じ!
GRUは「LSTMの軽量版」だよ!LSTMが3つのゲートとセル状態で複雑なのに対し、GRUはゲートを2つにまとめてシンプルにしたんだ。多くのタスクでLSTMと同等の精度が出るのに計算が速いから、「とりあえずLSTMとGRUを試して精度と速度を比べよう」がよくあるアプローチだよ!
GRUとは
GRU(Gated Recurrent Unit:ゲート付き再帰ユニット) は、2014年にChoらが提案したLSTMを簡略化したRNNのバリアントです。LSTMの「忘却ゲート・入力ゲート・出力ゲート」とセル状態の4つの構造を、「リセットゲート・更新ゲート」の2つのゲートと隠れ状態のみに簡略化しました。
GRUがLSTMより優れている点はパラメータ数が少なく学習が速いことです。一方でLSTMが優れている点はより長い依存関係の保持能力と表現力です。実際のベンチマークでは多くのタスクでGRUとLSTMの精度差が小さく、計算コストを重視するならGRUが有利な場面が多いです。
GRUのゲート機構
| ゲート | 計算式 | 役割 |
|---|---|---|
| リセットゲート(r_t) | r_t = σ(W_r × [h_{t-1}, x_t]) | 過去の記憶をどのくらい「リセット」するか |
| 更新ゲート(z_t) | z_t = σ(W_z × [h_{t-1}, x_t]) | 過去と新しい情報をどのくらいブレンドするか |
| 候補隠れ状態 | h̃_t = tanh(W × [r_t × h_{t-1}, x_t]) | 新しい情報を表現 |
| 隠れ状態の更新 | h_t = (1−z_t) × h_{t-1} + z_t × h̃_t | 最終的な隠れ状態 |
import torch.nn as nn
# PyTorchでのGRU
gru = nn.GRU(
input_size=128,
hidden_size=256,
num_layers=2,
batch_first=True,
dropout=0.3,
bidirectional=False # Trueで双方向GRUに
)
output, h_n = gru(x) # LSTMと違いセル状態がない
歴史と背景
- 2014年:Choらが機械翻訳のSea2Seq論文でGRUを提案
- 2014〜2015年:GRUはLSTMと精度を比較する論文が多数発表。多くのタスクで同等と確認
- 2017年以降:Transformerが台頭するが、GRUは軽量な用途で引き続き使用
- 現在:エッジデバイス・組み込み・時系列データの処理で利用が継続
LSTM vs GRU の比較
| 項目 | LSTM | GRU |
|---|---|---|
| ゲート数 | 3つ(Forget, Input, Output) | 2つ(Reset, Update) |
| 隠れ状態 | h_t + セル状態 c_t | h_t のみ |
| パラメータ数 | 多い | 少ない(LSTMの約75%) |
| 計算コスト | 高め | 低め |
| 長期依存関係 | 高い | やや低い |
| 実用精度 | タスク依存 | 多くの場合LSTM同等 |