アテンションを直感で理解する ― 数式の前に『注目』のイメージをつかむ

「アテンション(Attention)が大事なのはわかるけど、Query・Key・Valueとか出てきた瞬間に頭が真っ白になる」——そんな人は多いはずです。実際、世の中のアテンション解説はいきなり数式から入るものが多く、「なぜそんな計算をするのか」という直感が置き去りになりがちです。

この記事は、数式の前に『イメージ』をつかむことだけを目的にしています。結論を先に言うと、アテンションがやっているのは、

関連するものに注目して、その情報を集める

これだけです。難しい記号は後回しにして、まずこの「注目」のイメージを、身近なアナロジーと実際に計算した図でじっくり育てていきましょう。読み終わるころには、アテンションがたった3ステップの素直な仕組みだとわかるはずです。

アテンションがわかると、こんな世界が開けます。

  • TransformerやChatGPTの心臓部がわかる — 現代のAIの大半はアテンションでできています
  • 論文やコードが読めるattentionsoftmax(QK^T) を見ても怖くなくなります

本記事の内容

  • アテンションの正体(関連するものに注目して情報を集める)
  • 検索のアナロジーで理解するQuery・Key・Value
  • たった3ステップ(似てる度を測る→配分に変える→中身を混ぜる)
  • self-attention・RNNとの違い・multi-head まで

前提知識

特別な前提は要りません。ベクトルの内積(2つの向きがどれくらい似ているかの目安)をなんとなく知っていると、より深く理解できます。

アテンションの正体 ― 「注目」して情報を集める

私たちは文章を読むとき、無意識に「関連する言葉」に注目しています。たとえば「私は犬を見た」という文の「犬」を理解するとき、頭の中では「誰が?→私」「どうした?→見た」と、関連する言葉に視線を行き来させているはずです。アテンションは、この「関連するものに注目する」動きを、そのまま計算にしたものです。

アテンション:関連するものに注目して情報を集める

この図は、「犬」という単語が文中のどの単語に注目するかを、実際に計算して線の太さで表したものです。「犬」は「私」に最も強く注目しています(同じ名詞で関連が強いため)。アテンションは、こうして各単語が「自分に関係の深い単語」を見つけ、その情報を取り込んで自分の理解を深める仕組みなのです。

もっと身近な例で言えば、「その動物は疲れていたので、道を渡れなかった」という文の「その動物」が何を指すかを、私たちは前後の文脈から自然に判断します。コンピュータも同じことをするには、「その動物」という言葉が文中の関連語に注目して情報を集める必要があります。これがアテンションの出番です。人間が無意識にやっている「関連する言葉に目を向ける」を、機械にやらせるための仕組み——そう思ってもらえれば十分です。

「注目して情報を集める」——この動き、実は私たちがよく使うあるものにそっくりです。検索です。

検索のアナロジー ― Query・Key・Value

アテンションを理解する一番の近道は、検索(や辞書引き)に例えることです。何かを調べるとき、私たちは「探したいこと」を入力し、各情報の「見出し」と照らし合わせ、一致したものの「中身」を取り出します。アテンションもまったく同じ3点セットで動きます。

アテンションは検索に似ている

この3つに名前がついているだけです。身構える必要はありません。

QueryKeyValueの3つの役割

  • Query(クエリ)=「私は何を知りたい?」という問い合わせ。注目する側が出す検索ワードのようなもの
  • Key(キー)=各単語の見出し・名札。「私はこういう情報ですよ」という自己紹介
  • Value(バリュー)=実際に取り出される中身の情報

ポイントは、同じ単語から、役割の違う3つの表現を作ること(それぞれ別の重み行列をかけて変換します)。「探す用の顔(Q)」「照合される用の顔(K)」「中身を渡す用の顔(V)」を1つの単語が持っている、とイメージしてください。

道具がそろったので、いよいよアテンションの動きを3ステップに分解します。

ステップ1 ― 似てる度(一致度)を測る

まず、注目する側の Query と、各単語の Keyどれくらい一致しているかを測ります。一致度の計算には内積を使います。内積は「2つのベクトルの向きがどれくらい近いか」の目安で、向きが近い=関連が強いほど大きな値になります。

ステップ1:内積で類似度を測る

左の図のように、クエリと向きの近いキー(犬)は一致度が高く、向きが違うキー(は)は低くなります。右は「犬」のクエリと各単語の一致度スコアです。同じ名詞である「私」「犬」とのスコアが高く出ています。「似ているほど高いスコア」——これがステップ1の成果物です。

ただ、このスコアはバラバラの大きさで、そのままでは「どれくらい注目すべきか」の割合になっていません。そこでステップ2です。

ステップ2 ― 配分に変える(softmax)

生のスコアを、「注目の配分」に変換します。使うのが softmax という関数で、難しく考える必要はありません。やることは「全部足したら1になるように、大きいものはより大きく、小さいものはより小さく整える」だけです。

ステップ2:softmaxで注目の配分に変換

左の素のスコアが、右では合計1の配分に変わっています。これで「全体の注目のうち、この単語に何割向けるか」がはっきりします。たとえば「私に5割、犬に4割、残りはほんの少し」といった具合です。注目を100%として、それを各単語に配分する——これがsoftmaxの役割です。

配分が決まれば、あとはその割合で情報を混ぜるだけ。最後のステップです。

ステップ3 ― 中身を混ぜる(重み付き和)

決めた配分に従って、各単語の Value(中身) を混ぜ合わせます。注目度の高い単語の中身ほど濃く、低い単語は薄く反映されます。これが重み付き和で、アテンションの出力になります。

ステップ3:注目の配分でValueを混ぜる

式で書けば「出力=配分₁×中身₁+配分₂×中身₂+…」というだけです。こうして得られる出力は、自分に関連の深い単語の情報を取り込んだ、新しい表現になります。「犬」という単語が、「私」の情報を少し混ぜ込んで「(私が見た)犬」というように文脈を帯びていく、というイメージです。

たった3ステップ——①似てる度を測る → ②配分に変える → ③中身を混ぜる。アテンションの本体はこれで全部です。実際に文全体で計算すると、何が起きるか見てみましょう。

実際に計算してみる ― アテンション重み行列

「私 は 犬 を 見た」という文の全単語について、各単語がどこに注目するかを実際に計算すると、次のような表(アテンション重み行列)になります。

アテンション重み行列(実計算)

行が「注目する単語」、列が「注目先」、マスの濃さが注目度です。きれいなパターンが見えます。「私」と「犬」(どちらも名詞)は互いに強く注目し合い「は」と「を」(どちらも助詞)も互いに注目し合っています。「見た」(述語)は自分自身に強く注目しています。つまりアテンションは、教えなくても「意味の近い単語どうしを結びつける」ことを自分で見つけているのです。これが、アテンションが文の構造や関係を捉えられる理由です。

この「各単語が他の全単語を見る」やり方には、名前がついています。

Self-Attention ― みんなが互いに見る

いま計算したように、文中のすべての単語が、すべての単語に対してアテンションをかけることを Self-Attention(自己注意) と呼びます。「自己」というのは、外部の何かではなく同じ文の中の単語どうしで注目し合うからです。

Self-Attention:全単語が全単語に注目し合う

各単語が自分のクエリを使って他の全単語を見渡し、関連の強いものから情報を集める。これを全単語が同時に行うことで、文全体の関係性が一気に捉えられます。Transformerの強さの源は、このself-attentionにあります。

なぜこれがそんなにすごいのか。昔ながらのRNNと比べると、ありがたみがはっきりします。

なぜ強いのか ― RNNとの違い

アテンション以前の主役だったRNN(再帰型ニューラルネット)は、単語を端から順番に処理して情報を伝えていました。この方式には2つの弱点があります。

RNNとの対比:遠い関係も一発で結べる

第一に、遠く離れた単語どうしの関係が薄れてしまうこと。文の最初と最後をつなぐには、間のすべての単語を経由しなければならず、情報が伝言ゲームのように劣化します。第二に、順番に処理するので並列計算ができず遅いこと。

アテンションはこれを一掃します。どんなに離れた単語どうしでも一発で直接結びつけられるし、全単語の計算を同時に(並列に)行えます。先ほどの「その動物は疲れていたので、道を渡れなかった」のように、関連する語が文中で離れていても、アテンションなら1ステップで結べます。さらに並列計算できるので、GPUを使った大規模な学習に向いています。「遠い関係を直接・高速に捉える」——この2点が、アテンションがRNNを置き換え、ChatGPTのような巨大モデルを可能にした理由です。

最後に、もう一段だけ。実際のTransformerが使う「複数の観点」の話です。

Multi-Head ― 複数の観点で同時に注目

ここまでは1種類の注目の仕方を見てきましたが、実際のTransformerは複数のアテンションを並列に走らせます。これを Multi-Head Attention(マルチヘッド) と呼びます。

Multi-Head:複数の観点で同時に注目

直感は「いろんな観点で同時に文を見る」ことです。あるヘッドは主語と述語の関係に注目し、別のヘッドは助詞の対応に、また別のヘッドは名詞どうしの関係に——というように、それぞれ違う種類の関係を担当します。人間も文章を読むとき、文法・意味・話の流れを同時に追っていますよね。それを複数のヘッドで実現しているわけです。

なぜ1つのアテンションで全部やらないのでしょうか。1つの注目の仕方だけだと、ある関係を捉えるために別の関係を犠牲にしがちだからです。観点を分けて専門化させれば、それぞれが得意な関係に集中でき、全体として多面的に文を理解できます。最後に各ヘッドの結果を束ねて1つにまとめ、豊かな表現を作ります。これが、実際のTransformerが必ずマルチヘッドを使う理由です。

まとめ

アテンションは、難しそうに見えて、本質はたった3ステップです。

アテンションは3ステップ

  • アテンションの正体は「関連するものに注目して情報を集める」
  • 検索のアナロジーで、Query(探したいこと)・Key(見出し)・Value(中身)を理解する
  • 動きは3ステップ:①内積で似てる度を測る → ②softmaxで配分に変える → ③配分でValueを混ぜる
  • 全単語が互いに見る self-attention が文全体の関係を捉え、RNNと違って遠い関係も一発・並列で扱える
  • multi-head は複数の観点で同時に注目する

「Query・Key・Value」も「softmax(QK^T)」も、もう怖くないはずです。それは「探す・見出しと照合・中身を混ぜる」を式にしただけ。この直感を持ったうえで、次は数式や実装に踏み込むと、すっと頭に入ってきます。

次のステップ(数式・実装で深める)として、以下の記事へどうぞ。