Transformer アーキテクチャは、self-attention を中心に設計されたニューラルネットワークです。主に順番どおりの段階的な処理に頼るのではなく、系列内の各トークンが、ほかの関連するトークンから情報を集められるようにします。

そのため、Transformer は言語やその他の系列タスクで高い性能を発揮します。ある単語が、ずっと離れた別の単語に依存している場合でも、attention はその間に直接の経路を与えます。

Transformer アーキテクチャとは何か

Transformer ブロックは単に 1 つの式を適用するだけではありませんが、中心となる考え方は self-attention です。self-attention では、各トークンが 3 つのベクトルを作ります。

  • query:そのトークンが何を探しているかを表す
  • key:そのトークンが照合のために何を提供するかを表す
  • value:実際に受け渡される情報を表す

トークン表現を行列 XX に並べると、1 つの attention head は通常、次のように作られます。

Q=XWQ,K=XWK,V=XWVQ = XW_Q, \qquad K = XW_K, \qquad V = XW_V

ここで、WQW_QWKW_KWVW_V は学習される行列です。

標準的な scaled dot-product attention の式は次です。

Attention(Q,K,V)=softmax ⁣(QKTdk)V\operatorname{Attention}(Q, K, V) = \operatorname{softmax}\!\left(\frac{QK^T}{\sqrt{d_k}}\right)V

ここで dkd_k は key の次元です。dk\sqrt{d_k} でスケーリングすることで、次元が大きくなるにつれて生の内積スコアが大きくなりすぎるのを防ぎます。

softmax は行ごとに適用されます。各行は、ある 1 つのトークンの問い「ほかのトークンにどれだけ attention を向けるべきか」に答えています。

self-attention の仕組みを平易に説明すると

self-attention は通常、1 つのトークンだけを選んで残りを無視するわけではありません。value ベクトルの重み付き平均を作ります。

あるトークンの query が別のトークンの key と強く一致すれば、そのトークンには大きな重みが付きます。一致が弱ければ、重みは小さくなります。したがって、1 つのトークンに対する出力は、系列全体の情報を反映した文脈依存の混合になります。

これは、主語と動詞の一致、代名詞の参照、そのほかの長距離の関係を扱うのに役立ちます。情報が利用可能になるまでに、多くの中間ステップを通って伝わる必要がありません。

self-attention の計算例

1 つの attention head で、1 つの query と 2 つの候補トークンを考えます。計算を簡単にするため、dk=1d_k = 1 とします。

現在のトークンの query が

q=[2]q = [2]

で、2 つの候補トークンが

k1=[2],k2=[1]k_1 = [2], \qquad k_2 = [1]

value が

v1=[10],v2=[4].v_1 = [10], \qquad v_2 = [4].

だとします。

生の attention スコアは内積です。

qk1T=4,qk2T=2.qk_1^T = 4, \qquad qk_2^T = 2.

dk=1d_k = 1 なので、スケーリング係数は 1=1\sqrt{1} = 1 です。したがって、スケーリング後のスコアもそのまま 4422 です。

次に、この 2 つのスコアに softmax を適用します。

α1=e4e4+e20.881,α2=e2e4+e20.119.\alpha_1 = \frac{e^4}{e^4 + e^2} \approx 0.881, \qquad \alpha_2 = \frac{e^2}{e^4 + e^2} \approx 0.119.

attention の出力は、重み付きの組み合わせです。

α1v1+α2v2=0.881(10)+0.119(4)9.29.\alpha_1 v_1 + \alpha_2 v_2 = 0.881(10) + 0.119(4) \approx 9.29.

重要な点は単純です。query は k2k_2 よりも k1k_1 に強く一致したので、出力は v1v_1 により近い値になります。

これは、はるかに大きなモデルの内部で起きている基本パターンです。実際の Transformer は、より高次元で、しかも多くのトークンに対して同時にこれを行いますが、計算の考え方は同じです。

Transformer ブロックには他に何が入っているか

Transformer は 1 つの attention の式だけでできているわけではありません。標準的なブロックには通常、次のものが含まれます。

  • multi-head attention:複数種類の関係を同時に学習できるようにする
  • 位置ごとのフィードフォワードネットワーク:attention の後で各トークン表現を変換する
  • 残差接続:層をまたいで情報を保ちつつ洗練するのに役立つ
  • layer normalization:学習を安定させるのに役立つ

系列変換タスクのための元の Transformer アーキテクチャでは、モデルは encoder のスタックと decoder のスタックを持っていました。

  • encoder は入力系列に対して self-attention を使います。
  • decoder は masked self-attention を使うため、ある位置は未来の出力トークンを見ることができません。
  • decoder は cross-attention も使えます。この場合、query は decoder から来て、key と value は encoder の出力から来ます。

現代の多くの言語モデルは decoder 側だけを使います。attention の中核的な考え方はそのままですが、全体のアーキテクチャは次トークン予測向けに特化されています。

Transformer に位置情報が必要な理由

attention だけでは、入力トークンに対して順序の入れ替えに対して等価です。平たく言えば、同じトークンベクトルの集合に位置情報を加えずに attention だけを適用しても、どのトークンが最初に来たかをモデルは本質的には知りません。

そのため Transformer では、学習可能な位置埋め込みや positional encoding のような位置情報を加えます。この追加の信号がなければ、言語のように順序に敏感なタスクを正しくモデル化するのはずっと難しくなります。

Transformer アーキテクチャについてのよくある誤解

attention が Transformer のすべてだと思うこと

attention は中心的な考え方ですが、アーキテクチャはフィードフォワード層、残差経路、正規化、位置情報にも依存しています。

self-attention と cross-attention を混同すること

self-attention では、QQKKVV は同じ系列から来ます。cross-attention では、それらはすべて同じ情報源から来るわけではありません。

masking の役割を忘れること

decoder-only の言語モデルでは、あるトークンが未来のトークンに attention できないように、学習時にも推論時にも causal masking が必要です。

attention の重みを完全な説明だとみなすこと

attention の重みは参考になりますが、それだけでモデルの推論を完全に証明するものではありません。最終的な振る舞いは、value ベクトル、後続の層、非線形変換にも依存します。

Transformer モデルはいつ使われるか

Transformer は、言語モデリング、翻訳、要約、コード生成、音声処理、多くの画像タスクで広く使われています。系列や集合の中の関係が、純粋に局所的なパターンより重要なときに、特にうまく機能します。

ただし、どんな状況でも万能というわけではありません。非常に小さなデータセット、厳しいリアルタイム制約、あるいは局所的な帰納構造が最も重要な問題では、別のアーキテクチャのほうが適していることもあります。

似た問題に挑戦してみよう

3 語からなる短いフレーズを 1 つ取り、1 つの単語に注目してください。ほかのどの単語に高い attention の重みが付くべきか、その理由は何かを考え、その直感に合う小さな query-key-value の例を描いてみましょう。

さらに一歩進めたいなら、小さな attention の出力を 1 つ手計算してみてください。それが「式は知っている」から「アーキテクチャが何をしているか分かる」へ進む最短ルートであることが多いです。

問題の解き方でお困りですか?

問題をアップロードすると、検証済みのステップバイステップ解答が数秒で届きます。

GPAI Solver を開く →