2026-01-15 / Tech
<感想や思ったこと>
現在のテキスト生成AI(GPT系・LLaMA系など)が大量のVRAMを消費する最大要因の一つは、Attention機構が要求するメモリ量が大きいから?って思いました。
また、大規模言語モデル並みの精度はTransformerモデルの登場前でも理論上可能だったけど、並列処理ができない順次処理だったので、計算時間や推論時間が現実的でなかったので実現でいなかったのを、VRAMを消費することで実現したってこと?
<用語解説>
Sequence Transduction model (和訳:系列変換モデル)
概要
ある順序を持つデータ列(入力系列)を、別の順序を持つデータの列(出力系列)に変換する機械学習モデルのこと。特徴としては入力と出力の長さが異なっていても処理できること。特に自然言語処理(NLP)の分野で中心的な役割を果たす。
主な用途
- 系列変換(Sequence-to-Sequence/Seq2Seq): ある一連のデータ(系列:Sequence)を入力として受け取り、別の系列を出力するニューラルネットワークのアーキテクチャ(構造)モデルとして活用。
代表的な用途
- 機械翻訳:英語の文章を日本語に
- 文章要約:長い文章を短い要約に
- 音声認識:音声データの文字起こし
- 対話型チャットボット:質問(入力)に対して回答(出力)を生成
長さの柔軟性
「10単語の文章を5単語で要約する」といった、長さが異なる場合にも処理可能。
代表的なアーキテクチャ
- RNN/LSTM/GRU (Gated Recurrent Unit)ベース 古くからある手法。データを順番に前から処理するために並列計算が難しく、長文の処理に時間がかかった。
- Transformer(Attention)ベース 現在の主流。すべての単語を同時に並列処理できるため、高速かつ高精度。そのため、”大規模”言語モデルが可能になった。
仕組みの概要(Encoder-Decoder)
多くのSequence transductionモデルは、エンコーダ(Encoder)とデコーダ(Decoder)当2つのニューラルネットワークで構成されている。
- エンコーダ:入力されたデータ(主に自然言語)を圧縮し、特徴的な情報(文脈情報)を抽出する。
- デコーダー:エンコーダから受け取った特徴的な情報をもとに、出力データを一つずつ生成する。
つまり、Transformerモデルもニューラルネットワークの一種。
残差接続とは?
残差接続(Residual Connection)とは、深層ニューラルネットワーク(DNN)において、ある層の入力データを、その層を通過した後の出力に直接「ショートカット」して加算する構造で、「スキップ接続」とも呼ばれ、勾配消失問題を緩和し、非常に深いネットワークでも学習を可能にする技術です。これにより、ネットワークは「入力そのもの」ではなく「入力と出力の差分(残差)」だけを学習すればよくなり、学習が効率化され、より深いモデルの性能向上に貢献します。
仕組みと効果
- 入力の直接加算: 通常の層($F(x)$)の出力に、その層への入力($x$)を足し合わせます($G(x)=F(x)+x$)。
- 勾配消失問題の緩和: 逆伝播の際、この「$x$」がそのまま勾配に加わるため、勾配が減衰せず(1を足すような効果)、深い層まで伝わりやすくなります。
- 学習の効率化: ネットワークは「本来の出力 $H(x)$」ではなく、「目標出力 $H(x)$ から入力 $x$ を引いた差分 $H(x)-x$(残差)」を学習するようになります。これは、わずかな変化だけを学習するのと同じで、より簡単です。
- 劣化問題の克服: 層を深くしても性能が低下する「劣化問題」を解消し、100層を超えるような超深層モデル(ResNetなど)の実現を可能にしました。
※つまり、入力データをどう変化させたらよいのかっていう情報だけを学習したらよくなるので、入力データに変化1を加えたデータ、変化1が加えられた入力データに変化2を加えたデータ、入力データに変化3を加えたデータっていう感じで、計算量が爆発するのを防ぎつつ、情報が揮発しない設計になっている。
Attention機構とは?
人工ニューラルネットワークにおいて、認知的な注意を模倣するように設計された手法。
入力データのある部分に対する重要度を強化して、他の部分を弱化する効果がある。
Attention機構のないSequence Transduction modelでは、入力データのすべての部分に対して情報圧縮を行っていました。つまり、Attention機構のないモデルでは、入力データ(例えば、文章など)に対して、「100ページの小説を1行のあらすじに無理やりまとめた結果、伏線が全部消えた」状態になってしまう問題がありました。
しかし、Attention機構は以下の方法で解決しました。
- 情報の保持:すべての塊(例えば、単語)ごとのエンコーダ情報を保存し、必要に応じてアクセス可能にする。
- 動的な注意配分:各出力単語を生成する際に、関連性の高い入力単語に注目する。
- 文脈の理解:単語単位でなく、単語同士の関係性を理解することで、入力文章の文脈を考慮した翻訳などが可能になる。つまり、この塊(単語)の場合には、塊AとBに40%と13%の注目をすればよいっていうことがモデルが理解可能になった。
Attention機構を導入した場合には、単語ごとに情報圧縮が行われ、また、この単語はここと関係しているっていう情報をもとに何が重要なのかっていうのを機械が判断できるようになった。また、それぞれの塊ごとに情報圧縮が行われ、情報が保存された結果、検索と再利用とどれに注目するのかっていうのが可能になった。
従来のRNNは、読んだ本の感想を「一言(固定長ベクトル)」でしか伝えられないシステムでした。 一方、Attention機構は、「辞書引きシステム」です。 出力を作るとき、「今必要な情報は何か(Query)」を投げかけ、入力データの「見出し(Key)」と照らし合わせ、合致度(Attention Weight)が高い箇所の「内容(Value)」を動的に引っ張ってくる仕組みです。これにより、長い文章でも情報の取りこぼしがなくなりました。
Attention機構の2つの主要タイプ
① Source-Target Attention
- 特徴:
- エンコーダ(入力)とデコーダ(出力)の間の注意
- 入力データと出力データの関係性を学習
② Self-Attention -> Transformerの中核技術
- 特徴:
- 一つの系列内で、自身の他の部分に注意を向ける。
具体例:「この魚は新鮮です」
- 「魚」
- 「この」:修飾関係なので 10%
- 「魚」:自己参照なので 50%
- 「は」:助詞なので 5%
- 「新鮮」:主要な意味なので 30%
- 「です」:語尾なので 5%
Multi-Head Attention:複数の視点からの理解
これは、人間が物事を多角的に理解するプロセスを模倣したものです。
- Head 1(演技重視)
- 「素晴らしい」→「演技」に80%の注意
- 作品の演技面を重点的に分析
- Head 2(技術重視)
- 「美しい」→「映像」に85%の注意
- 映像技術面を重点的に分析
- Head 3(感情重視)
- 「感動的」→「作品」に75%の注意
- 作品全体の感情的価値を分析
※アテンション機構の理論は複雑に見えますが、本質は「重要なものに注目する」という人間にとって自然な概念
Transformerモデルとは
Transformerモデルとは、再帰を回避し、代わりに入力と出力間の広域的な依存関係を書くためにアテンション機能のみに依存するモデルアーキテクチャ。
特徴としてはこれまでの再帰型のモデル子とは異なり、並列処理が可能となり処理効率が激増したこと。
Transformerモデルでは、それまでのモデルでは入力と出力の関係性を学習するには2点の距離に応じて線形もしくは対数的に増大してしまう計算を、定数回の計算で可能にした。つまり、大幅な計算回数の削減を実現した。
正確には: * 計算ステップ数(depth)は定数 * 計算量(FLOPs)は O(n²)(Self-Attention)
しかし、Attentionによる重み付き一の平均化によって有効解像度が低下するという代償が伴う。この影響は、Multi-Head Attentionによって対策を行っている。
「有効解像度が低下する」の意味
- Attention(特に加重平均をとる操作)は情報を平均化してしまう側面があります。これを補うのがMulti-Head Attentionであるという理解で正しいですが、より厳密には「単一のAttentionヘッドでは、異なる位置にある情報を混ぜ合わせる際に、位置ごとの鋭い区別が平均化されてぼやけるが、Multi-Headにすることで、あるヘッドはAに、別のヘッドはBにと、鋭い焦点を維持したまま情報を統合できる」というイメージです。
- 単一のHeadでAttentionを行うと、平均化(Averaging)によって、異なる部分空間(Subspace)にある情報が混ざってしまいます。「誰が(主語)」、「何を(目的語)」、「どうした(動詞)」という異なる文法要素を、たった一つの注目ベクトルで表現するのは無理があるのです。 Multi-Headにすることで、Head1は「主語と動詞の関係」、Head2は「形容詞と名詞の関係」といった具合に、異なる表現部分空間(Representation Subspaces)を独立して学習できる。
Self-atteintion、あるいはIntra-attentionは、単一の配列の表現を計算するために、その配列の異なる位置を関連付けるAttention機構。Self-Attentionは、読解(Reading comprehension)、生成的要約( Abstractive summarizetion)、テキスト含意(Textual entailment)、および、タスク非依存の文章表現などの様々なタスクで効果があることが確認されていた。
End-to-Endメモリネットワークは、配列に整列した際器でなく、再帰的なAttention機能(つまり、再利用可能にした。)に基づいていて、単純な単語の質疑応答や言語モデリングタスクで良好なパフォーマンスを示す。
Transformer モデル データフロー記述
0. 入力データの準備 (Inputs & Outputs)
- エンコーダ側(左側): 翻訳元の文(例:「Hello world」)が入力されます。
- デコーダ側(右側): 翻訳生成中の文(「Outputs (shifted right)」)が入力されます。これは、ある時点での予測を行うために、それ以前に生成された単語列(例:「Hallo」)を入力とするものです。
1. 埋め込みと位置情報の付加 (Input Embedding & Positional Encoding)
入力されたトークン(単語や部分語)は、まず「Input Embedding」層によってベクトル表現に変換されます。Transformerは再帰構造を持たないため、単語の語順を認識させるために「Positional Encoding(位置エンコーディング)」というベクトルを埋め込みベクトルに加算します。これにより、各単語が文のどこにあるかという情報が付与されます。
2. エンコーダスタックへの突入 (Encoder Stack)
処理された入力ベクトルは、エンコーダ(図の左側のブロック)に入ります。ここは $N=6$ 個の同一の層が積み重なっています。データは以下の順で処理されます。
- Multi-Head Attention: 入力文の中での単語間の関係性(自己注意)を計算します。
- Add & Norm: アテンションの結果と元の入力を足し合わせ(残差接続)、正規化します。
- Feed Forward: 各位置ごとに独立した全結合ネットワークを通ります。
- Add & Norm: 再び残差接続と正規化を行います。
このプロセスを6層分繰り返し、最終的に入力文の意味内容を凝縮した「エンコーダ出力(メモリ)」が生成されます。この出力は、キー(K)とバリュー(V)としてデコーダに渡されます。
3. デコーダスタックでの処理 (Decoder Stack)
デコーダ側(図の右側のブロック)の入力(シフトされた出力文)も、埋め込みと位置エンコーディングを経て、デコーダスタック($N=6$層)に入ります。
- Masked Multi-Head Attention: まず、デコーダ入力自身の自己注意を行いますが、ここでは「未来の単語」を見ないようにマスク処理(Masking)が施されます。
- Add & Norm: 残差接続と正規化を行います。
- Multi-Head Attention (Encoder-Decoder Attention): ここが重要です。デコーダからのクエリ(Q)と、手順2で生成されたエンコーダ出力のキー(K)とバリュー(V)を使ってアテンションを行います。これにより、翻訳先の単語を予測する際に、翻訳元の文のどの部分に注目すべきかを決定します。
- Add & Norm: 残差接続と正規化を行います。
- Feed Forward: 全結合ネットワークを通ります。
- Add & Norm: 最後の残差接続と正規化を行います。
このプロセスを6層分繰り返します。
4. 最終出力の生成 (Linear & Softmax)
デコーダスタックの最終出力ベクトルは、「Linear(線形変換)」層を通って、ターゲット言語の語彙サイズ(数万語)の次元に拡張されます。
5. 確率への変換 (Output Probabilities)
最後に「Softmax」関数を通すことで、各単語のスコアが確率に変換されます。最も確率が高い単語が、次の翻訳語として選択されます。
これがTransformerにおけるデータの入力から出力までの完全なフローです。
GPT (Decoder-only) のからくり
「Encoder(入力の理解)」と「Decoder(出力の生成)」という役割分担がTransformerの基本形(Figure 1)ですが、なぜGPTのようなモデルは「Decoder(右側のブロック)」だけで、入力の理解も生成もできてしまうのか。
1. 「翻訳」と「続きを書く」というタスクの違い
- 翻訳(Encoder-Decoder): 「英語の文章(入力)」をすべて読んで理解してから、別の「ドイツ語の文章(出力)」を作る。入力と出力は別物です。
- 言語モデリング(Decoder-only): 「ある文章の続き」を作ることです。ここでは「入力(プロンプト)」と「出力(生成文)」に明確な境界線はなく、一本の長い系列として扱われます。
2. Masked Self-Attention がすべてを担う
Encoder-Decoderモデルでは、Decoderは「Encoderが作った情報(K, V)」をカンニング(Cross-Attention)しながら出力を決めていました。 しかし、Decoder-onlyモデルでは、この「Encoderを見る機能」を削除し、代わりに自分自身の過去(Masked Self-Attention)だけを見ます。
辞書引きアナロジーでの説明
- 入力(プロンプト)の扱い: GPTでは、ユーザーが入力した質問文なども、すべて「すでに生成された過去の単語」としてDecoderに入力されます。
- Query(Q): 「次にくる単語は何か?」という現在の問い合わせ。
- Key(K)とValue(V): これまでに入力されたプロンプトや、自分が生成した単語のすべて。
つまり、DecoderのSelf-Attention機構が、プロンプト(過去の系列)に対して「辞書引き」を行うことで、Encoderが行っていた「文脈の理解」を同時にやってのけているのです。
3. 具体的な処理の流れ
- 入力: プロンプト「昔々、あるところに」が入る。
- Self-Attention: 「あるところに」という単語(Q)が、「昔々」(K, V)に注目(Attention)し、「昔話の文脈だ」と理解する。
- 生成: その文脈情報を元に、確率的に「おじいさんが」を出力する。
- 再帰: 今度は「昔々、あるところに、おじいさんが」全体を入力(過去)として扱い、次の単語を予測する。
結論
Decoderだけで成立する理由は、「入力文(プロンプト)」を「生成済みの過去の文章」と見なすことで、Decoderが持つSelf-Attention機能だけで文脈理解(Encoderの役割)を代用できるからです。
Encoder-Decoderモデルが「他人の話(Encoder出力)を聞いて話す」モデルだとすれば、Decoder-onlyモデルは「自分の記憶(過去の系列)を頼りに独り言を話し続ける」モデルだと言えます。
情報工学的な視点:Encoder vs Decoder
「文章の意味を正確にベクトル化する(Embedding)」というタスクにおいて、純粋なDecoder-onlyモデル(GPT系)は、Encoderを持つモデル(BERTなど)に比べて構造的な不利(ハンデ)があります。
1. 「カンニング禁止」が理解の邪魔をする
Decoderは生成を行うために、「未来の単語を見ない(Masking)」という制約が強く課されています。
- 例文: 「昨日の晩、ご飯を食べた。」
Encoderモデル(BERTなど)の場合
- 仕組み: マスクがないので、文章全体を一度に見ます(双方向:Bidirectional)。
- 「晩」の理解: 前の「昨日の」と、後ろの「ご飯」の両方を見て、「あ、これは夜のことだな」と完璧に文脈を理解して埋め込みます。
Decoderモデル(GPT系)の場合
- 仕組み: 未来を隠すマスクがあります(片方向:Unidirectional)。
- 「晩」の理解: 前にある「昨日の」しか見えません。後ろに「ご飯」が続くのか、「晩餐会」なのか、「晩年」なのか分からない状態で、「晩」という単語をベクトル化しなければなりません。
つまり、Decoder-onlyモデルは「後ろの文脈を使ったカンニング」ができないため、文章全体の深い意味理解(Embedding)においては、Encoderモデルよりも精度が出にくいのです。
2. 適材適所:BERT vs GPT
- Encoder-only (BERT等):
- 得意: 埋め込み (Embedding)、分類、検索。
- 理由: 文章全体を双方向から見て、意味を密に圧縮できるから。
- Decoder-only (GPT等):
- 得意: 生成 (Generation)。
- 理由: 「次に来る単語」を予測することに特化しているから。
数式で理解する Transformer
位置エンコーディング (Positional Encoding)
Transformerには再帰も畳み込みも含まれていません。順序情報を利用できるようにするには、相対的または絶対的な位置に関する情報を明示的に注入する必要があります。
PE (Positional Encoding) * 意味: 位置エンコーディングベクトル。単語の埋め込みベクトルに足し合わせることで、Transformerに「単語の順序」を教えるための値。 * pos (Position): 単語の文中での位置(インデックス)。 * i: ベクトルの次元のインデックス。 * d_{model}: モデルの次元数(埋め込みベクトルのサイズ)。
この数式で、「相対的な位置関係」をモデルが学習しやすい理由は、「-1~1の間で周期的に振動し、その周期が次元ごとに異なるため、すべての位置をユニークな波の組み合わせとして表現できるから」です。
Query, Key, Valueの数式
$$ Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V $$
- Q (Query): クエリ(検索したい情報)。「今、この単語について知りたい」という問い合わせベクトル。
- K (Key): キー(検索対象の見出し)。入力データの各単語が持つインデックスのようなベクトル。
- V (Value): バリュー(情報の中身)。その単語が持っている本来の意味内容を表すベクトル。
- d_k: キー(Key)ベクトルの次元数。$d_k$ で割っている(スケーリング)理由は、内積の値が大きくなりすぎて勾配消失するのを防ぐため。
- softmax: ソフトマックス関数。入力された数値を、合計が1.0になるような確率に変換する関数。「どの単語にどれくらい注目すべきか」の割合(Attention Weight)が決まる。
「なぜ割らないと勾配が消失するのか?」 $\sqrt{d_k}$ が大きくなると、内積 $QK^T$ の値が極端に大きくなりうる。そうなるとSoftmax関数の出力が0か1に張り付き、その微分値(勾配)がほぼ0になってしまうからです。