Attentionとは?Q・K・Vで情報を取り込む仕組み

30秒でわかる答え

Attentionは、参照先ごとの重みを計算し、その割合で情報を集める仕組みです。TransformerではQとKから配分を決め、Vにその重みを掛けて足します。最も重みが大きい言葉を一つ選ぶだけの計算ではありません。

「夜空の星を観察する」と「評価に星を付ける」。同じ「星」でも、周りの言葉を読むと違いが分かります。AIの内部では、このような周囲の情報をどう取り込むのでしょうか。

Attentionとは、参照先ごとの配分を決めて情報を取り込む仕組み

Attention(アテンション)は、参照先ごとの重みを計算し、その割合で情報を集める仕組みです。 Transformerでは、トークンの数値表現からQuery・Key・Valueを作り、QueryとKeyの照合で決めた重みをValueに掛けて足します。

「どの言葉に注目するか」と説明されることもあります。ただ、最も重みが大きい言葉を一つ選んで終わる計算ではありません。複数の位置から情報を受け取り、一つの表現にまとめます。

ここではTransformerで使われる代表的な方式、Scaled Dot-Product Attentionの一回の計算を追います。人間と同じ意味理解を再現した模型ではありません。言葉を数値で表す段階が気になる場合は、埋め込みベクトルの仕組みから読めます。

Query・Key・Valueは、それぞれ何を担当する?

三つとも数値の並びですが、計算での仕事が違います。一つの位置が情報を受け取る場面に絞ると、次のように整理できます。

表現この計算での役割
Query(Q)情報を受け取る側から作る、照合用の表現
Key(K)参照先から作り、Qと照合する表現
Value(V)決まった配分で、実際に取り込む表現

Queryは質問文そのもの、Keyは暗号の鍵、Valueはその言葉の重要度、という意味ではありません。QとKは配分を決める計算に使い、Vはその配分で足す中身です。

基本的なTransformerでは、入力の表現に学習済みの変換を適用してQ・K・Vを作ります。変換に使うパラメータと、その場のQ・Kから計算されるAttentionの重みは区別してください。同じ変換規則を使っていても、入力が変われば配分は変わります。

ユイ

重みがいちばん大きい札を選ぶ、ということではないんですね

ピコ

うん。半分もらう札と、4分の1もらう札があっていい。どんな数が集まるか、足してみよう

重みを掛けて足すと、どんな情報が集まる?

三つの参照先A・B・Cに、それぞれVを置きます。ここでは数値を二つずつにして、計算を見える大きさにしました。重みがAは0.5、BとCは0.25ずつになったとします。

三つのVから、一つの出力を作る
数値は説明用です。言葉を学習したモデルの実測値ではありません。

KとVは固定したまま、Qだけを変えます。KはAが約0.693(正確にはln 2)、BとCが0です。

参照先V重み重み × V
A[2, 0]0.5[1, 0]
B[0, 4]0.25[0, 1]
C[0, 0]0.25[0, 0]

Q = 1:出力は [1, 1]。AとBから異なる成分を受け取ります。

表は小数第3位まで表示。計算には丸める前の値を使い、重みの合計は1です。Cは重みがあっても、Vが [0, 0] なので出力に足す値は0です。

Qを変えたときの答えを読む

Q = 0なら、重みはA・B・Cともに1/3。出力は [2/3, 4/3](約 [0.667, 1.333])です。Q = −1なら、重みは0.2・0.4・0.4になり、出力は [0.4, 1.6] になります。

同じVを置いていても、QとKから決まる配分が変われば、集まる情報の組合せも変わります。

Aからは [2, 0] × 0.5 = [1, 0]、Bからは [0, 4] × 0.25 = [0, 1] を受け取ります。Cから足す値は [0, 0]。二つの成分をそれぞれ足すと、出力は [1, 1] です。

Aだけを選んだなら [2, 0] のままです。重みを掛けて足す計算では、AとBの両方が結果に残りました。この足し方を重み付き和と呼びます。

この例ではCにも重みがありますが、Vがゼロなので出力に足す値はゼロです。重みの大きさだけで、受け渡した情報の中身まで決まるわけではありません。

集め方は追えました。では、最初に置いた0.5や0.25は、どこから出てくるのでしょうか。

Attentionの重みは、QとKからどう決まる?

この方式では、まずQと各Kの内積を計算します。同じ位置の数値同士を掛け、その結果を足す計算です。それをQ・Kの次元数の平方根で割り、参照先ごとのスコアにします。

次に、スコアを**softmax(ソフトマックス)**で重みに変換します。各スコアに指数関数を適用し、その合計で割る処理です。一つのQについて、参照先への配分の合計が1になります。これは答えが正しい確率ではありません。

前の教材はQ・Kを1次元にし、Qを1、KをAだけ ln 2、BとCを0にしました。ln 2は、指数関数に入れると2になる数です。この条件では、softmaxの途中の値が 2:1:1 となり、合計4で割ると0.5・0.25・0.25が得られます。

式と、Qを変えた計算を確かめる

一つの参照先へのスコアは Q・K / √dₖ。dₖ はQとKの次元数です。この教材では1なので、割る数も1です。一般には、次元が増えると内積の値が大きくなりやすいことを調整するために、この割り算を入れます。

重みは exp(そのスコア) / exp(各スコア)の合計。Q = 0なら途中の値は1:1:1で等分。Q = −1なら0.5:1:1となり、合計2.5で割って0.2・0.4・0.4になります。

Qだけを変えると、KとVを固定したままでも出力が変わりました。実際のモデルでは、文脈を反映して変わる表現からQ・K・Vを作り、各位置についてこのような計算を行います。ここまでの例は一つの出力を作る部分だけで、層全体や学習を再現したものではありません。

もう一つ、配分より前に決めることがあります。そもそも、どの位置から情報を受け取れるのでしょうか。

Self-AttentionとCross-Attentionは、参照元が違う

Self-Attentionは、同じ列の表現からQ・K・Vを作ります。文章なら、同じトークン列の位置同士で情報を取り込みます。「Self」は自分一個だけを見るという意味ではありません。

Cross-Attentionでは、Qを作る列と、K・Vを作る列が異なります。元のTransformerの翻訳モデルでは、訳文側からQを作り、原文を処理した表現からK・Vを作っていました。訳文を作る途中で、原文側の情報を参照する形です。

参照元と、参照してよい範囲は別の話です。文章を左から生成するモデルでは、学習時にも後の位置を先取りしないよう、未来の位置を因果マスクで除外します。長さをそろえるために付けた余分なトークンを除くマスクもあります。除外した位置は、softmax後の重みが0になるよう処理します。

Self-Attentionだから必ず前しか見ない、Cross-Attentionだからマスクを使わない、と一律には決まりません。どの列を参照するかと、どの位置を除くかを分けると整理できます。

ここまでは一組のQ・K・Vでした。一つの配分だけでは、取り込み方も一つに限られます。

Multi-Head Attentionは、複数の取り込み方を組み合わせる

Multi-Head Attentionでは、異なる学習済みの変換でQ・K・Vを作り、それぞれのheadで計算します。複数の結果をつなぎ、さらに変換して次へ渡します。

ただし、人が「このheadは主語専用」「こちらは感情専用」と必ず担当を決めておくわけではありません。頭の数だけ人間の視点が入っている、という説明とも違います。

どこへの重みが大きかったかを見ると、計算の一部を観察できます。それでも、重みの図だけから「AIがこの理由で答えた」と言い切ることはできません。Attentionの重みと予測の説明が一致しない場合も研究されています。受け取るVや、その後の処理まで結果に関わるためです。

取り込んだ情報を、その後の層はどう変える?

Attentionの一回の計算は、QとKから配分を決め、Vを重み付きで足す流れでした。「最も目立つ言葉を一つ選ぶ」とは違い、複数の情報から新しい表現を作ります。

でも、情報を集めただけで文章が完成するわけではありません。集めた表現は、その後どう加工されるのでしょうか。Transformerの記事の「フィードフォワード層で何を変える?」から、各位置の変換、層の繰り返し、次のトークンを生成するまでを追えます。

この記事について

LAB WHITEBOARD

自分の言葉で説明してみよう

「QとKで配分を決め、Vを重み付きで足す計算を追い、参照範囲と回答理由を区別できる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。