ChatGPTの仕組みから学ぶG検定対策講座③

Transformerは文章のどこに注目するのか?Self-AttentionとQ・K・V【第3回】

こんにちは。ゆうせいです。

前回は、入力された文章がトークンに分割され、それぞれが数値ベクトルへ変換されるまでを説明しました。

ただし、トークンを数値に変換しただけでは、文章の意味を十分に理解できません。

例えば、次の文章を考えてみましょう。

この山は高い。

この商品は高い。

どちらにも「高い」という言葉が使われていますが、一つ目は高さを、二つ目は価格を表しています。

「高い」の意味を判断するには、周囲にある「山」や「商品」との関係を調べる必要があります。

Transformerで、トークン同士の関係を調べる中心的な仕組みが、Self-Attentionです。

今回は、Transformer Explainerを操作しながら、Self-Attentionと、そこで使われるQuery、Key、Valueの役割を説明します。

Transformer Blockを開く

Transformer Explainerを開き、画面を「Transformer Block」までスクロールしてください。

Transformer Blockには、主に次の二つの処理があります。

  • Multi-Head Self-Attention
  • MLP(Multi-Layer Perceptron)

Self-Attentionは、トークン同士で情報をやり取りする役割を持ちます。

一方のMLPは、Self-Attentionによって更新された各トークンの情報を、さらに変換する役割を持ちます。

Transformer Explainerで使用されているGPT-2 smallでは、このTransformer Blockが12個積み重ねられています。トークンの表現は、Blockを通過するたびに更新されていきます。

Attentionとは何か

Attentionは、日本語では「注意機構」と訳されます。

人間が文章を読むときも、すべての単語を同じ重要度で見ているわけではありません。

例えば、次の文章を考えてみましょう。

太郎は新しいパソコンを購入した。それを仕事で使う予定だ。

「それ」という言葉の意味を考えるとき、特に注目すべきなのは「新しいパソコン」です。

「太郎」や「仕事」も文章の理解には必要ですが、「それ」が何を指しているのかを判断するうえでは、「パソコン」との関係が強くなります。

Attentionは、あるトークンを処理するときに、ほかのトークンをどの程度重視するかを数値として計算します。

なぜSelf-Attentionと呼ぶのか

Self-Attentionの「Self」は、同じ文章の中にあるトークン同士でAttentionを計算することを表しています。

例えば、次の文章が入力されているとします。

Data visualization empowers users to

この文章が6個のトークンに分割された場合、それぞれのトークンが、同じ文章中のほかのトークンとの関係を調べます。

「Data」は、ほかのどのトークンと関係が強いのか。

「visualization」は、どのトークンを重視すべきなのか。

「users」は、それ以前のどの情報を取り込むべきなのか。

このように、自分と同じ入力列の中にあるトークンを参照するため、Self-Attentionと呼ばれます。

【G検定対策コラム①:Self-Attention(自己注意機構)】

Self-Attention(自己注意機構)は、同じ入力系列内のトークン同士の関係を計算する仕組みで、Transformerの核心です。G検定では「自己注意機構」という日本語名でも問われます。本文の「この山は高い/この商品は高い」の例が示すとおり、同じトークンでも周囲のトークンとの関係から意味が定まる点が重要です。RNNが直前の情報を順番に伝播させるのに対し、Self-Attentionは系列内の全トークンの関係を一度に計算できるため、長距離依存(離れた語同士の関係)を捉えやすく、並列計算も可能になります。この「並列化できる」点が、RNN比でのTransformerの学習速度上の優位につながることも押さえましょう。

Self-Attentionでは三つのベクトルを作る

Self-Attentionでは、各トークンの埋め込みベクトルから、次の三つのベクトルを作ります。

  • Query(Q)
  • Key(K)
  • Value(V)

日本語では、それぞれ次のように訳せます。

名称日本語のイメージ主な役割
Query問い合わせどの情報を探しているかを表す
Key検索用の手掛かりQueryとの関連度を調べる
Value実際の内容関連度に応じて取り込まれる情報

この三つは、Self-Attentionを理解するうえで重要な概念です。

検索エンジンに例えて考える

Transformer Explainerでは、Query、Key、Valueを検索エンジンに例えて説明しています。

検索エンジンで「新人エンジニア Java 研修」と検索した場合を考えてみましょう。

Queryは検索キーワード

Queryは、検索欄に入力する言葉に相当します。

新人エンジニア Java 研修

つまり、Queryは「どのような情報を探しているのか」を表します。

Keyは検索結果のタイトル

Keyは、検索結果に表示されるページタイトルのようなものです。

  • 新人向けJava研修カリキュラム
  • Java開発環境の構築方法
  • 管理職向けリーダーシップ研修

検索エンジンは、検索キーワードと各ページのタイトルや特徴を比較し、関連度を判断します。

「新人エンジニア Java 研修」というQueryに対しては、「新人向けJava研修カリキュラム」というKeyの関連度が高くなるでしょう。

Valueはページの実際の内容

Valueは、検索結果を開いた先にある実際の情報です。

関連度の高いページが見つかったら、そのページに含まれるカリキュラム、説明、演習内容などを取得します。

Self-Attentionでも、QueryとKeyを比較して関連度を求め、その関連度に応じてValueの情報を取り込みます。

Q・K・Vを図書館に例える

別の例として、図書館で本を探す場面を考えてみましょう。

要素図書館での例
Query「Transformerの入門書を読みたい」という目的
Key本のタイトル、分類番号、キーワード
Value本の中に書かれている実際の内容

QueryとKeyがよく一致する本ほど、目的に合った情報を持っている可能性が高くなります。

そして、その本のValueである本文の情報を利用します。

ただし、検索エンジンや図書館の例は、Q・K・Vの直感的な役割を理解するためのものです。

実際のTransformerでは、Q・K・Vはすべて多数の数値が並んだベクトルとして計算されます。

【G検定対策コラム②:Query・Key・Value(Q・K・V)】

Self-Attentionでは、各トークンの埋め込みベクトルから重み行列を掛けてQuery(問い合わせ)・Key(手掛かり)・Value(実際の内容)の3つのベクトルを作ります。G検定でも頻出の用語です。本文の検索エンジンの例えが直感的です。Queryは検索キーワード、Keyは検索結果のタイトル、Valueはページの中身に相当します。3つとも同じ埋め込みから作られますが、掛ける重みが異なるため別々の値になります。この重みは人手で設定するものではなく、学習によって獲得される点も重要です。

埋め込みベクトルからQ・K・Vを作る

前回説明したように、GPT-2 smallでは、一つのトークンが768次元のベクトルで表されています。

Self-Attentionでは、この埋め込みベクトルに、それぞれ異なる重みを掛けて、Query、Key、Valueを作ります。

Query = 埋め込みベクトル × Query用の重み

Key = 埋め込みベクトル × Key用の重み

Value = 埋め込みベクトル × Value用の重み

同じ埋め込みベクトルを出発点にしていますが、掛ける重みが異なるため、Q、K、Vはそれぞれ異なる数値になります。

Q、K、Vの重みは、人間が手作業で設定するものではありません。

大量の文章を使った学習によって、次のトークンを適切に予測できるように調整されます。

Q・K・Vを一度に計算する

Transformer Explainerでは、入力された埋め込み行列に、大きなQKV用の重み行列を掛けています。

GPT-2 smallの埋め込み次元は768です。

Query、Key、Valueをそれぞれ768次元としてまとめて計算するため、出力側の大きさは次のようになります。

768 × 3 = 2304

そのため、QKVをまとめた重み行列の形は、おおよそ次のように表せます。

768 × 2304

入力文が6トークンの場合、入力埋め込みの行列は次の形です。

6 × 768

これにQKV用の重み行列を掛けると、次の形になります。

6 × 2304

この2304次元の結果を三つに分けると、Query、Key、Valueが得られます。

Query:6 × 768

Key:6 × 768

Value:6 × 768

Transformer Explainerでは、各トークンの埋め込みがQKV用の重みと掛け合わされ、Q、K、Vへ変換される様子を視覚的に確認できます。

QueryとKeyを比較して関連度を求める

Queryは「何を探しているか」を表し、Keyは「どのような情報を持っているかを判断する手掛かり」を表します。

そこで、あるトークンのQueryと、各トークンのKeyを比較します。

この比較には、内積という計算が使われます。

簡単な3次元ベクトルで考えてみましょう。

Query = [1, 2, 1]

Key   = [2, 1, 0]

内積は、同じ位置の数値を掛けて足し合わせます。

1 × 2 + 2 × 1 + 1 × 0
= 2 + 2 + 0
= 4

一般には、QueryとKeyの向きや特徴が近いほど、内積が大きくなる傾向があります。

Transformerでは、この内積を、トークン同士の関連度を表す点数として利用します。

この点数を、Attention Scoreと呼びます。

【G検定対策コラム③:内積とAttention Score】

QueryとKeyの関連度は、内積という計算で求めます。内積は同じ位置の数値を掛けて足し合わせる演算で、ベクトルの向きや特徴が近いほど値が大きくなる傾向があります。この関連度の点数をAttention Scoreと呼びます。G検定の数理分野では内積・行列積といった線形代数が前提知識となります。なお、実際のTransformerでは内積の値をKeyの次元数の平方根で割る「スケーリング」を行うため、正式にはScaled Dot-Product Attention(スケール化内積注意)と呼ばれます。この「√dで割る」処理が余談として問われることもあるので、余裕があれば押さえましょう。

すべてのトークンの組み合わせを調べる

入力文に6個のトークンがある場合、それぞれのQueryと、それぞれのKeyを比較します。

つまり、次のような組み合わせを計算します。

  • 1番目のQueryと、1~6番目のKey
  • 2番目のQueryと、1~6番目のKey
  • 3番目のQueryと、1~6番目のKey
  • 4番目のQueryと、1~6番目のKey
  • 5番目のQueryと、1~6番目のKey
  • 6番目のQueryと、1~6番目のKey

その結果、Attention Scoreは次のような6行6列の正方行列になります。

6 × 6
トークン1トークン2トークン3トークン4トークン5トークン6
トークン1関連度関連度関連度関連度関連度関連度
トークン2関連度関連度関連度関連度関連度関連度
トークン3関連度関連度関連度関連度関連度関連度
トークン4関連度関連度関連度関連度関連度関連度
トークン5関連度関連度関連度関連度関連度関連度
トークン6関連度関連度関連度関連度関連度関連度

Transformer ExplainerでAttentionの部分にマウスポインターを合わせると、どのQueryとどのKeyを比較しているのかを確認できます。

なぜMulti-Headなのか

Transformerでは、Attentionを一つだけ計算するのではありません。

複数のAttentionを並行して計算します。

これが、Multi-Head Self-Attentionです。

Headは、文章を見る視点のようなものだと考えられます。

文章中には、さまざまな関係があります。

  • 主語と述語の関係
  • 動詞と目的語の関係
  • 代名詞と、それが指す名詞の関係
  • 近くにあるトークン同士の関係
  • 離れた場所にあるトークン同士の関係
  • 意味的に関連するトークン同士の関係

一つのAttentionだけですべての関係を捉えようとするよりも、複数のHeadで異なる関係を並行して調べたほうが、文章を多面的に処理できます。

Transformer ExplainerのGPT-2 smallでは、12個のAttention Headが使われています。各Headは、トークン間の関係をそれぞれ異なる視点から学習できます。

【G検定対策コラム④:Multi-Head Attention(多頭注意機構)】

Attentionを1つだけでなく複数並行して計算する仕組みがMulti-Head Attention(多頭注意機構)で、G検定の重要用語です。各Head(ヘッド)は文章を見る「視点」に相当し、主語と述語の関係、代名詞と指示対象の関係、近い語同士・遠い語同士の関係など、異なる種類の関係を並行して学習できます。本文の「複数の専門家が同じ文章を異なる観点から読む」という例えが理解の助けになります。GPT-2 smallでは768次元を12個のHeadに分割し、1Headあたり64次元を扱います(768÷12=64)。各Headの出力は最後に結合され、再び768次元にまとめられる点も押さえましょう。

768次元を12個のHeadに分ける

GPT-2 smallでは、768次元のQ、K、Vを12個のHeadに分割します。

768 ÷ 12 = 64

そのため、一つのHeadが扱うQ、K、Vは、それぞれ64次元になります。

項目次元数
分割前のQuery768次元
Headの数12
1 Head当たりのQuery64次元

KeyとValueについても同様です。

12個のHeadが、それぞれ64次元の空間でAttentionを計算します。

各Headの出力は最後に結合され、再び768次元の表現としてまとめられます。

複数の専門家が文章を読むイメージ

Multi-Head Self-Attentionは、複数の専門家が同じ文章を異なる観点から読む様子に例えられます。

例えば、次の文章を複数の専門家が読むとします。

新人社員は講師からJavaの課題を受け取り、それを翌日までに提出した。

それぞれの専門家は、次のような観点に注目するかもしれません。

専門家注目する関係
専門家A「新人社員」と「提出した」の主語・述語関係
専門家B「それ」が「Javaの課題」を指す関係
専門家C「翌日までに」という期限の情報
専門家D「講師から」と「受け取り」の関係

実際のAttention Headに、このような明確な担当名が付いているわけではありません。

しかし、複数のHeadを用意することで、異なる種類の関係を並行して学習できる点が重要です。

Valueはどこで使われるのか

QueryとKeyは、トークン同士の関連度を計算するために使われます。

一方、Valueは、実際に取り込む情報として使われます。

処理の流れを整理すると、次のようになります。

  1. あるトークンのQueryを用意する
  2. 各トークンのKeyと比較する
  3. 関連度を表すAttention Scoreを求める
  4. 関連度に応じて、各トークンのValueを取り込む

例えば、あるトークンが別のトークンと強く関連していれば、そのトークンのValueを大きく取り込みます。

関連が弱ければ、Valueから取り込む情報も小さくなります。

つまり、QueryとKeyは「どの情報をどの程度重視するか」を決め、Valueは「実際に受け渡す情報」を担当します。

Self-Attentionによってトークンの表現が変化する

Embeddingの直後では、各トークンは主に次の情報を持っています。

  • そのトークン自体の基本的な意味
  • 文章中の位置

Self-Attentionを通過すると、ほかのトークンの情報が取り込まれます。

例えば、「高い」というトークンの最初の表現は、「高さがある」「価格が高い」など複数の可能性を含んでいます。

「山」というトークンから情報を取り込めば、高さを表す意味が強くなります。

「商品」というトークンから情報を取り込めば、価格を表す意味が強くなります。

Self-Attentionによって、トークンは単独の意味だけでなく、文章の文脈を反映した表現へ変化します。

【G検定対策コラム⑤:文脈依存の表現(Contextualized Embedding)】

Self-Attentionを通過すると、各トークンは自分単独の意味だけでなく、周囲のトークンの情報を取り込んだ表現へと変化します。本文の「高い」が「山」から情報を得れば高さ、「商品」から得れば価格の意味を強める、という例がこれにあたります。このように文脈に応じて変わる表現を文脈依存の表現(Contextualized Embedding)と呼びます。G検定では、Word2Vecのように1単語1ベクトルで固定される静的な分散表現と対比して問われることがあります。多義語を文脈で区別できる点が、Transformer系モデル(BERT・GPTなど)が高い性能を発揮する理由の一つです。

Transformer Explainerで確認するポイント

Transformer Explainerの「Multi-Head Self-Attention」を開き、次の点を確認してください。

  1. 各トークンの埋め込みからQ、K、Vが作られる
  2. QKVをまとめた出力が2304次元になっている
  3. Q、K、Vがそれぞれ768次元に分けられる
  4. 768次元が12個のHeadに分割される
  5. 一つのHeadでは64次元のQ、K、Vを扱う
  6. QueryとKeyの組み合わせから正方形のAttention行列が作られる
  7. トークンにマウスポインターを合わせると、対応する計算が強調表示される

Transformer Explainerでは、入力文を変更すると、Q、K、VやAttentionの数値もその場で更新されます。Attention Mapを操作すると、各トークンがどのトークンに注目しているのかを視覚的に確認できます。

【G検定対策コラム⑥:Transformer Blockの積層とMLP】

Transformer Blockは、Multi-Head Self-AttentionとMLP(多層パーセプトロン)の2つの処理から構成され、GPT-2 smallではこれが12層積み重なっています。Attentionがトークン間で情報をやり取りする役割を持つのに対し、MLPは各トークンの情報をさらに変換し複雑な特徴を表現する役割を担います。G検定では、ブロックを深く積み重ねる(層を深くする)ことで複雑なパターンを学習できる一方、勾配消失などの学習の難しさが生じる点や、これを緩和する残差接続(Residual Connection/Skip Connection)や層正規化(Layer Normalization)も関連キーワードとして押さえておくとよいでしょう。

今回のまとめ

  • Self-Attentionは、文章中のトークン同士の関係を計算する仕組みである
  • Selfは、同じ入力列の中でAttentionを計算することを表す
  • 各トークンの埋め込みからQuery、Key、Valueを作る
  • Queryは探している情報、Keyは関連度を調べる手掛かり、Valueは実際に取り込む情報に相当する
  • QueryとKeyの内積からAttention Scoreを計算する
  • トークンが6個なら、Attention Scoreは6行6列の行列になる
  • Multi-Head Self-Attentionでは、複数の視点からトークン間の関係を調べる
  • GPT-2 smallでは、768次元を12個のHeadに分ける
  • 一つのHeadが扱うQ、K、Vは、それぞれ64次元になる
  • Self-Attentionによって、各トークンの表現に文脈が取り込まれる

次回は、QueryとKeyから求めたAttention Scoreに対して、なぜマスクを掛ける必要があるのかを説明します。

Transformer ExplainerのAttention行列を操作しながら、未来のトークンを見せないCausal Mask、Softmaxによる確率化、Valueの重み付き平均までを解説します。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。