Reformer: メモリ効率の高いトランスフォーマーで言語モデリングの限界に挑む
Overview
Reformer モデルは、長いシーケンスを処理する際の標準的なトランスフォーマーのメモリボトルネックに対処します。自己アテンション、フィードフォワード層、残差接続、および位置エンコーディングを再設計することで、8 GB 未満の RAM で最大 500 000 トークンまでのトレーニングを可能にし、BERT などのモデルの 512 トークン制限をはるかに超えます。
Reformer Self-Attention Layer
Reformer は、グローバルセルフアテンションを2つのメモリ効率の高い代替手段、ローカルセルフアテンションと LSH セルフアテンションに置き換えます。
ローカルセルフアテンション
ローカルセルフアテンションは、入力を config.local_chunk_length の長さのチャンクに分割し、各チャンク内でグローバルセルフアテンションを適用します。オーバーラップ (config.local_num_chunks_before と config.local_num_chunks_after) を追加することで、各トークンは近隣のチャンクの限定的なコンテキストに注意を向けることができ、二次的なメモリコストを O(n × chunk_length) に削減します。ただし、これだけでは長距離依存関係が必要なタスクには不十分です。
LSH セルフアテンション
LSH セルフアテンションは、局所性敏感ハッシュを使用してクエリ(およびキー)ベクトルをバケットにハッシュすることで、グローバルアテンションを近似します。同じバケットにハッシュされるベクトルは類似しているとみなされ、そのためセルフアテンションは各バケット内でのみ計算されます。その後、順列変更された入力は(オーバーラップを伴って)チャンクに分割され、注意が向けられ、これにより遠距離トークンからの情報が混ざりながら、メモリ使用量を O(n × hashes × chunk_length) に抑えます。複数のハッシュラウンド (config.num_hashes) を組み合わせることで精度を向上させることができます。
ベンチマーク
google/reformer-enwik8 モデルのベンチマークでは、メモリ節約が示されています:
- グローバルセルフアテンション(チャンク長を 8192 に設定)では、モデルは約 16K トークンで GPU メモリを超過します。
- デフォルトのローカル+LSH セルフアテンションを使用すると、同じモデルは 11 GB GPU でメモリ不足になるまで約 16K トークンまで実行でき、これによりシーケンス長に対するメモリ消費の増加が抑えられることが示されます。
チャンク化されたフィードフォワード層
幅広いトランスフォーマーでは、大きなフィードフォワード中間行列がメモリを支配します。Reformer は、サイズ config.chunk_size_feed_forward の小さなチャンクで線形層を処理するチャンク化されたフィードフォワード層を導入します。これにより、フルの中間テンソルを保存する必要がなくなり、追加の計算と引き換えにメモリ使用量を削減します。
ベンチマーク
フィードフォワードサイズが拡大(たとえば 16384)され、注意ヘッドが削減されたとき、チャンク化を有効にする (chunk_size_feed_forward=1) と、バッチサイズ 8、シーケンス長 4096 の条件でピークメモリが約 9 GB から約 6 GB に低下し、フィードフォワード層がボトルネックとなるモデルでの効果が確認されます。
可逆残差層
標準的なトランスフォーマーのトレーニングでは、すべての中間活性化が保存され、深さに対して線形にメモリが増加します。Reformer は可逆残差層を使用し、これにより活性化は保存される代わりにバックワードパス中に再計算されます。最終層の出力のみを保持すればよく、これにより層ごとのメモリオーバーヘッドが数百メガバイトから 100 MB 未満に削減されます。
ベンチマーク
シーケンス長 512、バッチサイズ 8 で層数を増やした (4、8、12) BERT と Reformer を比較すると:
- BERT‑12‑Layers: 約 7.4 GB
- Reformer‑12‑Layers: 約 5.4 GB したがって、Reformer は層ごとに追加されるメモリがはるかに少なく、同じハードウェア制約内でより深いモデルを可能にします。
軸方向位置エンコーディング
標準的な位置エンベディングは最大シーケンス長に対して線形に増加し、非常に長い入力(たとえば 0.5M トークンでは約 2 GB が必要)では禁止的になります。軸方向位置エンコーディングは、位置空間を 2 つの小さな次元 (config.axial_pos_shape) に因数分解し、隠れサイズ (config.axial_pos_embds_dim) を分割します。その結果得られるエンベディングテーブルのサイズは max_len×hidden_size の代わりに shape[0]×dim[0] + shape[1]×dim[1] になります。
ベンチマーク
google/reformer-crime-and-punishment モデル(0.5M トークンまで対応、隠れサイズ 256)では:
- デフォルトの位置エンベディング:524 288 × 256 パラメータ(約 1.36 億)。
- シェイプ (512, 1024)、ディム (64, 192) の軸方向位置エンベディング:約 260 万パラメータ。 バッチサイズ 8、シーケンス長 512 の推論時において、メモリは約 959 MB から約 447 MB に低下し、この大幅な削減を示しています。
含意
これらの4つのメカニズムを組み合わせることで、Reformer は専用ハードウェアを必要とせず、フルブックやコードベースなどの非常に長いドキュメントでの言語モデルのトレーニングを可能にします。これにより、フルコンテキスト理解がもたらす利益を得られる NLP タスクの範囲が拡大し、長距離要約、大規模コーパスにおける質問応答、そして数十万トークンにわたる依存関係があるシーケンシャルデータのモデリングが含まれます。