大規模言語モデルのAttentionの仕組みを理解しよう【初級 深層学習講座】
大規模言語モデル(LLM)の核心にあるのが「Attention(注意機構)」という仕組みです。この記事では、数式の流れを追いながら、それぞれの計算が持つ幾何学的な意味(直感的なイメージ)にフォーカスして分かりやすく解説します。今回は、特にTransformerで広く使われている「Multi-Head Self-Attention(マルチヘッド・セルフアテンション)」を対象とします。
Attentionとは
Attention(注意機構)を一言で表現すると、「文脈における重要度に応じて、引き出す情報の割合を動的に変える仕組み」です。
人間が文章を読むとき、すべての単語を均等な強さで意識しているわけではありません。
例えば、
「はしを使ってご飯を食べた」
という文を読むとき、
私たちは「はし」を「橋」や「端」ではなく、「箸」として自然に解釈します。これは、「ご飯を食べた」という周囲の文脈に注意(Attention)を向けているからです。
逆に、
「川にかかるはしを渡った」
という文では、「はし」は「橋」と解釈されます。
同じ「はし」という言葉でも、前後の文脈によって意味が変わるのです。
また、
「太郎は花子に本を渡した。彼女はとても喜んだ。」
という文章の場合、人間は「彼女」が誰を指すのか考える際、「花子」との関連を強く見ます。一方で、「本」という単語との関連はあまり重視しません。
つまり、人間は文章を理解する際に、文脈に応じて重要な単語へ注意を集中させます。
深層学習におけるAttentionも同様です。入力されたテキストの各単語に対して、「どの単語が、他のどの単語と強く関係しているか」を計算し、関連度の高い単語ほど大きな重みを付けて情報を取り込みます。その結果、単語の意味や文脈を考慮した高度な表現を生成できるようになります。
Attentionの計算の流れ(マルチヘッド)
Attentionには、翻訳タスクなどで異なる2つの文章を結びつける仕組み(Cross-Attention)など、いくつかのバリエーションが存在します。
本記事では、現在のLLMの基盤となっている「Self-Attention(自己注意機構)」に特化して解説します。Self-Attentionとは、その名の通り「1つの入力文の内部だけで、単語どうしの関係性を計算する」仕組みです。
以下では、具体的な計算の流れと、それぞれの幾何学的な意味について考えていきます。Attentionについては、計算式より、「幾何学的な意味」を知ることが重要ですので、そちらを理解するようにしてください。
入力ベクトル
まず、モデルに入力されるテキストデータを数値の行列に変換します。
入力ベクトルを $x$ とします。入力サイズは$(n, d)$です。
$$X \in \mathbb{R}^{n \times d}$$
- $n$:トークン数(文の長さ)
- $d$:意味ベクトルの次元数(1つの単語を何次元の数値で表現するか)
Q, K, Vの計算
入力行列 $X$ に対して、3つの異なる重み行列 $W_q, W_k, W_v$ を乗算し、Query(Q), Key(K), Value(V) という3つの行列を作ります。
重み行列のサイズはすべて $(d, d)$ です。$$W_q, W_k, W_v \in \mathbb{R}^{d \times d}$$
これらを $X$ に掛け合わせることで、それぞれの行列を計算します。
$$Q = XW_q \quad (n \times d)$$
$$K = XW_k \quad (n \times d)$$
$$V = XW_v \quad (n \times d)$$
行列のサイズ変化は $(n, d) \times (d, d) \rightarrow (n, d)$ となり、元のサイズが維持されます。
幾何学的な意味
行列 $W$ を掛けるという操作は、幾何学的には空間を「拡縮」や「回転」させることに相当します。これにより、入力ベクトルを特定の特徴を軸にした別のベクトル空間(特徴空間)へと射影しています。 イメージとしては、主成分分析(PCA)のように「データの分散や特徴が際立つような最適な角度からデータを覗き込んでいる」状態です。Q、K、Vそれぞれで異なる重みを与えている点もポイントです。
スライスに分離
マルチヘッドアテンションでは、先ほど求めた Q, K, V をいくつかのグループ(ヘッド)に分割して並列処理を行います。ヘッドの数を $h$ とします。
Q, K, V の各行列の列方向(次元 $d$)を、 $d_k = d/h$ ずつに分割します。 $i$ 番目のヘッド($i = 0, 1, \dots, h-1$)におけるそれぞれの行列は以下のようになります。
$$Q_i = Q[:, \, i \cdot \frac{d}{h} : (i+1) \cdot \frac{d}{h}]$$
$$K_i = K[:, \, i \cdot \frac{d}{h} : (i+1) \cdot \frac{d}{h}]$$
$$V_i = V[:, \, i \cdot \frac{d}{h} : (i+1) \cdot \frac{d}{h}]$$
幾何学的な意味
最初の $W$ の計算では、複数の異なる特徴量の抽出をまとめて行っていました。ここでは、それらを特徴量のグループごとに細かく小分けにしています。 高次元空間($d$次元)を、扱いやすい低次元空間($d/h$次元)へと部分的に圧縮し、それぞれのヘッドに「個別の視点」を割り当てているイメージです。
個別に出力を計算
各ヘッドごとに、独立してAttentionの出力を計算します。数式は以下の通りです。
$$Y_i = \text{softmax}\left( \frac{Q_i K_i^T}{\sqrt{d/h}} \right) V_i$$
計算をステップごとに分解してみましょう。
- スコアの計算(内積):
$$Q_i K_i^T \quad (n \times d/h) \times (d/h \times n) \rightarrow (n \times n)$$
各トークンが、他のすべてのトークンとどれだけ関連しているかを示す「関連度マップ」が作られます。 - スケーリング: 次元数 $d/h$ が大きくなると内積の値が大きくなりすぎてしまい、softmaxの勾配が消滅する問題が発生します。それを防ぐために $\sqrt{d/h}$ で割って数値を安定させます。
- 確率分布への変換: $\text{softmax}$ を適用することで、各行の合計が1(100%)の重み(Attention Weight)に変換されます。
- Value(価値)の加重平均: 得られた重みを使って $V_i$ を足し合わせます。
$$(n \times n) \times (n \times d/h) \rightarrow (n \times d/h)$$
幾何学的な意味
$Q_i K_i^T$ の計算は、2つのベクトルの内積(コサイン類似度に近いもの)を取る操作です。つまり、「私の持っている問い(Query)」と「相手の持っている鍵(Key)」の近さを計算しています。 そして、その近さ(関連度)の割合に応じて、実際の情報が詰まっている「価値(Value)」を引き出し、混ぜ合わせています(加重加算)。これにより、文脈を考慮した新しいベクトル $Y_i$ が作られます。
出力をつなげる(concat)
各ヘッドでバラバラに計算された出力 $Y_i$ を、元の1つの行列に結合(concat)します。
$$Y = \text{concat}(Y_0, Y_1, \dots, Y_{h-1})$$
サイズの変化は以下のようになります。
$$\text{concat}\left( (n \times d/h), \, (n \times d/h), \, \dots \right) \rightarrow (n \times d)$$
幾何学的な意味
これは単純な結合処理です。それぞれのヘッド(視点)がバラバラの低次元空間で計算してきた部分的な文脈情報を、再び1つの大きな情報空間($d$次元)へと集約し、元の行列と同じ形に戻しています。
Woを掛ける
結合した行列 $Y$ に、出力用の重み行列 $W_o \in \mathbb{R}^{d \times d}$ を掛けます。
$$Y’ = YW_o \quad (n \times d)$$
幾何学的な意味
各ヘッドの情報をガッチャンコしただけの空間から、元の入力 $X$ が存在していた座標空間へと引き戻す(逆投影する)ための幾何学変換です。異なる視点で集めてきた情報を、元の文脈の文脈に綺麗に統合・整理し直す役割を持っています。
入力と足し込む
最後に、Attentionの出力 $Y’$ を、最初の入力 $X$ と足し合わせます。
$$O = X + Y’$$
幾何学的な意味
$Y’$ は $W_o$ によって $X$ と同じ座標空間に戻されているため、この加算が正しく機能します。 幾何学的には、入力ベクトル $X$ が持つ元の情報(ベースの文脈)を破壊することなく、Attentionによって計算された「差分(修正量)」だけを各軸に上乗せする処理になります。
※ これにより、層が深くなっても元の情報を失わずに学習を進めることができます。
結局何をしている?
一連の複雑な行列計算を直感的にまとめると、Attentionとは「単語同士の情報のバケツリレー」です。
- 単語ごとに「私はこういう情報(Q)を探していて、こういう特徴(K)を持っていて、中身(V)はこれです」という役割を決める。
- 全単語間で「QとKの相性」をチェックし、相性の良い単語から情報を引っ張ってくる(加重平均)。
- それを単語ごとに元の情報に足し算してアップデートする。
マルチヘッドにしているのは、「文法的な関係を見るヘッド」「主語と述語の関係を見るヘッド」「代名詞(これ、それ)の指す先を見るヘッド」というように、複数の視点から同時に見るためです。
幾何学的な意味を同時に見ていきましたが、流れとしては、
- 重み$W_q, W_k, W_v$の乗算により一旦、取り出したい特徴空間に射影し
- それを特徴グループごとに分離し計算
- これを結合し入力と同じ空間に戻して入力と足し合わせる
という処理になっており、意味ベクトルの空間の意味として、最終的には辻褄が合っていることがわかるかと思います。

なんとなく分かりにくいですが、結局「特徴を幾何変換で抽出」、それを加工した後に「元の空間に戻して加算」しているだけです。
まとめ
Attentionの計算は一見複雑ですが、次元の動きと幾何学的な意図を整理すると、非常に理にかなった構造をしていることが分かります。
- Q, K, Vへの変換:異なる視点への射影
- 内積とSoftmax:単語間の関連度の算出
- 残差接続(足し込み):元データを壊さない情報のアップデート
この強力な文脈ブレンド機構があるからこそ、LLMは人間のように自然な文章の繋がりや文脈を理解できているのです。

