[上級編]LLMへ至る道~画期的な機構!Attentionさん~[16日目]

2023.12.16

みなさんこんにちは!クルトンです。

前日は大規模言語モデルの元にもなっているTransformerモデルの概要についてご紹介してきました。

今回は、Transformerの中でもとても重要なAttentionについてのお話です。

Attentionってそもそも何?

もともとAttentionという概念は、Seq2Seqモデルのベクトルが固定である課題点を解消するために考案されたものです。

下記にある論文 "Neural Machine Translation by Jointly Learning to Align and Translate" では機械翻訳をするときに、元の文章と翻訳対象の言語での、単語と単語の関係性を学ぶ層としてAttentionが登場しています。(RNNのEncoderとDecoderを使っているモデルの中でAttentionが使われています。)

論文中では、Attentionを使う事で機械翻訳の精度を高めています。

Attentionの構造による違い

下記の図にあるように2つのAttentionの形式があります。

road-to-llm-advent-calendar-2023-16-01

queryとkeyとvalueで全て同じ入力データを使う場合をSelf Attentionと言います。keyとvalueのセットと、queryでデータが異なる場合はSource Target Attentionと言います。

なお、ここで書いているqueryとkeyとvalueについては、後ほど数式を説明する中でご説明しますのでもう少しお付き合いくださいますと幸いです。

Transformerで使われているAttentionについて

前日のブログで載せたTransformerモデルの全体の図の中で、Attentionに関係ないところを隠した図を下に掲載します。

road-to-llm-advent-calendar-2023-16-02

図をご覧いただくと分かる通り、TransformerモデルではMulti-head AttentionMasked Multi-head Attentionというものを使っています。

Encoder側のMulti-head Attentionでは、Self-Attention型のものを使用していますね。

次にDecoder側のMulti-head Attentionについてですが、Encoderで処理したものをkeyとvalueにいれ、queryは別のものを使用しているのでSource Target Attention型です。またMasked Multi-head Attentionについては、Self-Attention型です。

Multi-head Attentionって?

Multi-head Attentionは内部でScaled Dot Product Attentionという計算方式を使っているものを複数重ねたものです。したがって、Scaled Dot-Product Attentionについてまずは理解していきましょう!

Scaled Dot Product Attention

早速数式を書いてしまいます。

S c a l e d D o t P r o d u c t A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V

パッと見た感じだと意味が分からないかと思います。今日までのブログでご説明した内容ですと、softmaxと書かれている部分は理解できるかと思います。ですので残りの部分についてご説明します。

  • QとKとVはそれぞれベクトル(単語埋め込みした結果)を表しています。
  • Qはqueryで、Kはkey、Vはvalueの事です。
    • 何かを調べるときに例えていうと、queryは調べたい内容、keyは索引、vは検索結果のようになります。

イメージとしては下図のようなものです。

road-to-llm-advent-calendar-2023-16-03

上図では、KeyとValueの中に含まれている単語である「猫」というものを検索しています。ちなみに、上図はSelf-Attention型のもので、例えばQueryに「犬」など、KeyとValueの中には含まれない単語を使うと、Source Target Attentionになります。

次に数式の中身について確認していきましょう。 右辺の分子に注目してください。queryとkeyのベクトルを掛け算しています。

分母の√dはベクトルの大きさが大きいものだと掛け算の結果も大きくなってしまうので、補正する役割としてベクトルの大きさ分で割り算しています。

ベクトル同士の掛け算とベクトルの大きさで割るという内容で、何か思い出す事はないでしょうか?

そう、類似度を計算しているのです。

お忘れの方は以前類似度についてご紹介した12日目のブログを参考程度に見ていただけますと幸いです。

類似度の計算についてもう一つ思い出して欲しいのは、ベクトル同士が近しいほど1の値を、ベクトル同士が無関係なものは0の値を、ベクトル同士が遠い関係のものは-1の値を計算結果として返してくれます。

返された計算結果を使って、softmaxで0から1の範囲で確率として求めます。

そうして計算した結果とvalueを掛け算しているので、 queryに対して近しい関係の言葉ほど大きい値で返ってくる数式です。

つまり、 検索したい言葉に対して一番関係がありそう言葉を返してくれます。

Scaled Dot-Product AttentionのDot-Productは内積で、内積とはベクトル同士の掛け算の事です。そしてベクトル同士の掛け算とは類似度を表しています。名前が数式の説明をしているのですね。

したがって、queryとkeyのデータをチェックして、どのvalueに該当しそうかを類似度から判定している式になります。

図にすると以下のイメージです。

まずQueryとKeyの掛け算です。単語で書いていますが、それぞれは単語埋め込みした分散表現(ベクトル)だと思ってください。合計で1になるように(100%になるように)確率を出します。

road-to-llm-advent-calendar-2023-16-04

次に出力した確率から、どの単語を確率が高いといっているのかを確認します。

road-to-llm-advent-calendar-2023-16-05

猫という単語をQueryした結果、KeyとValueの中にある同じ単語が出力されるのを確認しました!

いよいよMulti-head Attention!

次にMulti-head Attentionについて確認します。

以下の数式を見てください。

M u l t i H e a d A t t e n t i o n ( Q , K , V ) = C o n c a t ( h e a d 1 , h e a d 2 , , h e a d h ) W o   h e a d i = S c a l e d D o t P r o d u c t A t t e n t i o n ( Q W i Q , K W i K , V W i V )

まずConcatについてですが、ベクトル同士を繋げるという意味です。[1, 2, 3]のようなベクトルと[3, 4, 5]のようベクトルがあった時に、[1, 2, 3, 3, 4, 5]のように繋げるイメージです。要は計算結果をまとめています。

次にheadと書いている2つ目の式ですが、headというのはScaled Dot-Product Attention1つ分の事です。Scaled Dot-Product Attentionで複数回計算した結果をConcatしているのがMulti-head Attentionです。

この数式はMulti-head AttentionにQとKとVを入力すると、Scaled Dot-Product Attentionの計算をしているのですが先ほどご紹介したScaled Dot-Product Attentionの計算式と少し違うところがあります。 Wと書いているものを掛け算しています。

こちらのWもベクトル(より正確には行列)です。Multi-head AttentionでのQとKとVのそれぞれに掛けているWは、中身が違うものです。以下のような意味があります。

  • Qに掛けているW
    • 入力されたデータのどの部分を処理するかを決める(入力されたデータの処理対象を変更するためにQ用のWを掛け算)
  • Kに掛けているW
    • 入力されたデータの注目の仕方を決める(注目すべき単語がどれかを変えるためにK用のWを掛け算)
      • 注目対象をさまざまに変えることで、処理対象の入力データと近しいものがどれかを判定する
  • Vに掛けているW
    • 出力結果を調整する

つまり、入力データに対して自分が持っている辞書を使ってさまざまなトークンごとの関連度合いをチェックしつつ、一番関連していそうなものを出力する、というのがMulti-head Attentionのイメージです。

TransformerのEncoderとDecoderを使う場合において、Self-Attention型とSource Target Attention型の2種類でMulti-head Attentionを使っていますが、どちらにおいても上記のやり方は大きく変わりません。

Masked Multi-head Attention

Masked Multi-head Attentionは簡単にいうと、単語の一部をマスクしてMulti-head Attentionを使おう、というものです。 単語の一部をマスク、つまり隠して見えなくするというのは、イメージ的には下のようなものです。

road-to-llm-advent-calendar-2023-16-06

上の図だとマスクしないと答えが見えちゃいますよね。そういった注目している単語より後ろの単語の影響を無くすための仕組みがMasked Multi-head Attentionです。

実際には関連度合いを計算するときに、マスクしている単語にとても小さい値(-∞)を入れるようにします。

Attentionにおける注意点

Attentionでの計算は、単語をチェックするときに文脈を考慮していないです。したがって、EncoderやDecoderではそれぞれ文脈を考慮するように別の仕組みを入れています。

明日と明後日のブログにてこちらについては触れます。

終わりに

本日はTransformerモデルを理解する上で重要なAttentionについてご紹介してきました!Attentionは現在でも様々なモデルで使われている、機械学習モデルにおいて重要なものです。

明日は、TransformerモデルのEncoderについてご紹介したいと考えています。AttentionだけでなくEncoderでは全体として何をしているのか、お楽しみに!

本日はここまで。よければ明日もご覧ください!

参考文献

Transformerの論文です。