GRUとは
Gated Recurrent Unit
LSTMを簡略化し、更新ゲートとリセットゲートの2つで情報の保持・忘却を制御するRNNのユニット構造
ひとことで言うと
概要
GRU(Gated Recurrent Unit)とは、LSTMが持つ入力・出力・忘却の3つのゲートとセル状態を、更新ゲート(update gate)とリセットゲート(reset gate)の2つのゲートに簡略化した、RNNのユニット構造。 更新ゲートが過去の情報をどれだけ引き継ぐかを、リセットゲートが過去の情報をどれだけ無視するかを制御することで、LSTMと同様に長期的な依存関係を学習しやすくしつつ、パラメータ数を抑えている。 LSTMと比べて構造が単純で計算量が少ないため、学習・推論を高速化したい場合や、データ量が比較的少ないタスクで選ばれることがある。
背景
LSTMは長期依存関係の学習に有効だったが、3つのゲートとセル状態を持つ分パラメータ数が多く、計算コストも大きいという課題があった。 GRUは、LSTMの性能をできるだけ保ちながら、ゲート構造を簡略化することで計算量とパラメータ数を削減するために考案された。
歴史
2014年: Choらが機械翻訳向けのRNN Encoder-Decoderモデルの一部としてGRUを提案。 LSTMより単純な構造でありながら同等の性能を示すタスクが多く報告され、以降RNN系列モデルの代表的な選択肢の1つとして定着した。
アーキテクチャ
各タイムステップで、リセットゲートが過去の隠れ状態をどれだけ無視して新しい候補状態を計算するかを決め、更新ゲートが過去の隠れ状態と新しい候補状態をどの割合で混ぜ合わせるかを決める。 LSTMのセル状態に相当する独立した記憶セルを持たず、隠れ状態そのものが長期的な情報を保持する役割を兼ねる点が構造上の簡略化になっている。
ワークフロー
系列データを1タイムステップずつ入力 → リセットゲートで過去の隠れ状態の影響度を調整し候補状態を計算 → 更新ゲートで過去の隠れ状態と候補状態を混合し新しい隠れ状態を得る → 次のタイムステップへ伝播 → BPTTで誤差を逆伝播し重みを更新する。
コード例
PyTorchでの基本的なGRU層
import torch.nn as nn
gru = nn.GRU(input_size=10, hidden_size=20, batch_first=True)
output, hidden = gru(input_sequence)利点
欠点
- タスクによってはLSTMより表現力が劣り、精度で下回る場合がある
- Transformerの登場以降、長い系列を扱うタスクでは自己注意機構を用いる手法に主流が移っている
- LSTM同様、逐次処理のためTransformerほど学習を並列化できない
比較
関連用語
よくある質問
GRUとLSTM、どちらを選ぶべき?
明確にどちらが優れるという結論はなく、タスクごとに両方を試して検証データでの性能を比較するのが一般的。計算資源やデータ量が限られる場合はGRUが選ばれやすい。