世界を動かす技術を、日本語で。

Q, K, V行列

概要

  • LLMのアテンション機構の中心 はQuery、Key、Valueの3つの行列
  • Q、K、V行列の役割 と構築方法を具体例とともに解説
  • TransformerがRNNと異なる点 やアテンションの直感的理解
  • Q、K、V行列の重み行列の意味 や次元選択の影響
  • 実際のアテンション計算の流れ とQKV行列の役割を整理

LLMのアテンション機構とQ、K、V行列の基礎

  • Query、Key、Value行列 は、Transformerが入力系列内の異なる単語間に注意を向けるための基盤
  • 人間が「The cat sat on the mat because it was comfortable.」の“it”が“the mat”を指すと理解するのと同様の 文脈把握機構
  • 従来のRNN はトークンを一つずつ処理し、隠れ状態で情報を伝搬
    • 例:「The」→h1、「cat」→h2(h1とcatの情報)、…と逐次処理
  • Transformer はアテンションにより、全単語を同時に処理し、各単語が他の単語すべてを直接参照可能
    • 例:「sat」は「cat」に60%の強い注意、「on」に15%の注意など、 並列的な関係把握
  • この仕組みにより、 学習効率向上と遠距離依存関係の捕捉 が可能

アテンションの直感とQ、K、Vの意味

  • アテンションは データベース検索 に例えられる
    • Query(Q): 何を探すか
    • Key(K): 何を持っているか
    • Value(V): 実際に保持する情報
  • 各入力位置ごとに「何に注意すべきか?」というクエリを作成し、全てのキーと比較、最適な値を取得

アテンション処理の全体フロー

  • 入力 → 線形変換 → Q、K、V生成 → アテンションスコア計算 → Softmax → 重み付き和 → 出力
  • これにより、各単語が系列内の重要な単語に動的に注意を向ける

Q、K、V行列の具体的な構築例

  • 例文:「Cat eats fish」

    • 各単語を4次元ベクトルで表現(実際は埋め込みベクトルを利用)
      • cat = [1.0, 0.0, 0.5, 0.2] など
    • 3単語をまとめて入力行列X(3, 4)を作成
  • Q、K、V行列の生成には重み行列Wq、Wk、Wv(各4×3)を使用

    • これらは学習により最適化されるパラメータ
    • Q = X @ Wq、K = X @ Wk、V = X @ Wv(各3×3行列)
  • 各行の意味

    • Qの各行:各単語が「何に注意すべきか?」というクエリ
    • Kの各行:各単語が「どんな情報を持っているか?」というキー
    • Vの各行:各単語が「実際に持つ情報」バリュー

コード例(擬似コード)

  • 入力ベクトルと重み行列からQ、K、Vを生成する関数
    • 入力:input_embeddings(seq_len, d_model)、d_k(出力次元)、seed
    • 出力:Q、K、V、重み行列
  • 例:「Cat eats fish」の3単語を使い、Q、K、Vを計算

Q、K、Vの重み行列を分ける理由

  • 各重み行列の役割が異なるため
    • Wq:クエリ(質問)生成
    • Wk:キー(検索インデックス)生成
    • Wv:バリュー(実際の内容)生成
  • もし同じ重みを使うと、 機能的な分離が損なわれ、最適な学習ができない
  • 検索エンジンの「検索ワード」「インデックス」「本文」の違いに相当

投影次元(d_k)の影響

  • d_kが小さい場合
    • 計算・メモリ効率が高い
    • 複雑な関係性の把握が難しい
    • シンプルなタスクやマルチヘッドアテンションの一部として有用
  • d_kが大きい場合
    • 複雑な関係性も捉えやすい
    • パラメータ数・計算コスト増加
    • 実運用モデル(BERT等)ではd_k=64×12ヘッド=768次元などを採用

アテンション計算におけるQ、K、Vの役割

  • アテンションスコアの計算
    • attention_scores = Q @ K^T / sqrt(d_k)
    • 各行:単語iが単語jにどれだけ注意を向けるかを示す
  • スコアをsoftmaxで正規化→Vの重み付き和を計算→出力ベクトルへ
  • Q、K、Vはアテンション処理の最初の一歩
    • 以降、スコア計算、softmax、重み付き和、出力投影と続く

まとめ:Q、K、V行列の意義

  • Query、Key、Value行列はTransformerの文脈理解の核
  • 入力埋め込みを3種の重みで別々に射影し、 検索・被検索・内容伝達の役割を分担
  • この設計により、モデルは入力内の関連部分に動的に注意を向け、 高度な言語理解を実現

Hackerたちの意見

これ、悪くはないけど(図があったらもっと良いかも!)、初めてこれを見た人がLLMのアテンションメカニズムを自分で学ぶのは難しいと思う。かなり難しいトピックだし、ちゃんと理解したいなら、少なくとも2、3章は必要だよ!この分野を本気で理解したい人には、セバスチャン・ラシュカの素晴らしい本『Build a Large Language Model (From Scratch)』を強くおすすめするよ。最近読み終わったばかりなんだけど、わかりやすくて詳細もちゃんとしてる。ところで、QKVの「データベースルックアップ」っていう動機付け、みんな混乱しない?(記事の中で、「クエリ(Q):何を探しているの?キー(K):何を持っているの?バリュー(V):実際にどんな情報を持っているの?」って書いてある)。正直、よくわからなくて、QKVをトークン埋め込みベクトルxの入力に対する一般的な線形代数の変換を構成する方法として考えるように切り替えたんだ。xに対して二次的で、すべてのトークンがNxNアテンションマトリックスで他のトークンと関連できるようにするためにね。実際、QKVの内容や「意味」はかなり不透明で、構成に使われる重みはトレーニング中に学習されるものだから。さらに、代数の中でQとKの間にはたくさんの対称性があって、それは因果マスクによってのみ壊れるんだ。みんなこの動機付けを深い意味で役立つと思ってるのかな?何か見落としてる?[編集: この最後の質問に関して、roadside_picnicが下に投稿した「Attention is just Kernel Smoothing」の記事が、これに対するクリーンで一般的な数学的アプローチを提供していて、手を振るような「データベースルックアップ」のクエリ/キー/バリューの解釈について少し疑問を持つのは間違ってないって確認してくれそうで、すごく興味深いよ。]

その本、理解するために何か技術的な前提が必要なの?

確か、QとKの対称性はソフトマックスの方向によっても壊れるんじゃなかったっけ?行ごとと列ごとの適用で解釈が違うよね。

QKVのプロジェクションについての考え方: Qはトークンiの特徴が他のトークンとの類似性を計算する際の感度を定義する。Kはトークンjの特徴が他のトークンに選ばれたときの可視性を定義する。Vは全トークンの加重和を計算する際に重要な特徴を定義する。

俺もすごく混乱してる。アナロジーは、Q[K] = Vみたいな感じを示唆してるよね。一つには、これがアテンションスコアを計算する数学的操作、ソフトマックスを適用してからV行列とのドット積を取ることにどう関係しているのか全くわからない。二つ目は、概念的に「単語が他の単語にどれだけ関連しているかを調べる」っていうのがどう関係しているのか理解できない。例えば「猫がスープを食べる」という文で、「彼の」は猫に対してどれだけ重要かを問いかけてる。だから、Vはその重要性の数値的な結果、例えば0.99みたいなものなの?俺はそんなにバカじゃないと思うけど、これを何度も見ているうちに、誰かがこの概念を本当に理解しているのか疑問に思い始めてる。

自分はあんまり理解できてなくて、QKVをトークン埋め込みベクトルxの一般的な線形代数変換の系列を構築する方法として考えるように切り替えたんだ。それはxに対して二次的で、すべてのトークンがNxNの注意行列で他のトークンと関係できることを保証する。ここで言ってることは正しい理解だと思う。ルックアップの話はナンセンスだよ。「クエリ」と「バリュー」という用語は実際にはほとんど任意で意味がない。PyTorchでこれを実装する方法を見れば、これらはただの重み行列で、ある種の射影を実装しているだけだとわかるし、自己注意は常に自己注意(x, x, x)か、場合によっては自己注意(x, x, y)(例えばクロスアテンション)で、xとyは前の層からの出力なんだ。さらに、マージドアテンションのような異なる形式の注意や、注意メカニズムが実際にどのように機能しているのかの研究が進む中で、「彼らはキー・バリュー・ストアに動機付けられている」という考え方は本当に怪しく見えてくる。実際には、注意層は相関や類似性、または次元削減された表現の間の乗法的相互作用をモデル化することを可能にしている。編集:あるいは、あなたが言うように、カーネルスムージングと見なすこともできる。

自分もデータベースのルックアップの類推は好きじゃないな。注意を教えるときに好む類推は天体力学だよ。トークンは(潜在的な)空間の惑星みたいなもので、注意メカニズムは一種の「重力」のようなもので、各トークンが互いに影響を与え合い、(潜在的な)空間で意味を洗練させるために押し合ったり引き合ったりしている。だけど「距離」や「質量」の代わりに、この重力は意味的な相互関連性に比例していて、物理的な空間の代わりに潜在空間で起こっているんだ。 https://www.youtube.com/watch?v=ZuiJjkbX0Og&t=3569s

「Attention is a reinvention of Kernel Smoothing」っていうのを広めるために、しつこく言い続けるよ。今はコスマ・シャリジの素晴らしいウェブサイトがダウンしてるみたいだから、彼のこのトピックに関する重要な読み物へのアーカイブリンクを貼っておくね。[0] 機械学習に少しでも興味があって、カーネル法についてあまり詳しくないなら、ぜひ深く掘り下げてみてほしい。機械学習の多くはカーネル法の視点から考えられるし、ガウス過程みたいなものもずっと理解しやすくなるよ。0. https://web.archive.org/web/20250820184917/http://bactra.org...

これ、ほんとに役立つね、ありがとう。他の(トップレベルの)コメントでも、アテンションの説明でQ、K、Vの行列がいつも手を振るような比喩的な方法で出てくることに対する漠然とした不満を言ったんだけど、カーネル法の扱いはもっと数学的に一般的でクリーンに見えるね。ただ、そのせいで数学のバックグラウンドがないとちょっと取っ付きにくいかも。でも、応用数学をやってた身としては、「これが一般的な形だ、さあ具体的にするための明確な仮定をしよう」っていうのが、「人間の注意やデータベースに対する曖昧なアナロジーで特定の方法で組み合わせる必要があるランダムな行列を見せる」よりもずっと好きだな。カーネルについてもっと読むようにメモしておくよ。他におすすめの読み物ある?

ガウス過程に関する最先端の機械学習研究が、深層学習を通じてカーネルを推定することにもっと注目されていないのが全く理解できない。これは、現代のAIのあらゆる側面を支配している原始的で硬直したドット積アテンションよりも、ずっと柔軟なように思える。

おお、これに対して一つ以上のアップボートをあげたいくらいだ!

上のアーカイブリンクは壊れてるね。これがそのページの以前のアーカイブコピーで、内容はそのまま残ってるよ。

Hacker Newsで議論の続きを見る