Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Self-Attention(+MultiHead)を図・ベクトル(行列)の両方で整理してみた。

はじめに

Source Target Attentionを前回整理したので、これを前提に次はSelf-Attentionを整理してみます。前回分はこちらです↓ので、見ていただけると嬉しいです。
「Attentionを理解するためにRNN、Word2Vec、LSTM、Seq2Seq、Attentionの順に整理してみた」https://qiita.com/ta2bonn/items/c645ecbcf9dabd0c4778

参考元

Self-Attentionを整理するに当たり、こちらのサイトを参考にさせていただきました。
https://towardsdatascience.com/illustrated-self-attention-2d627e33b20a

Self-Attentionとは

まずそもそも何者?から入ります。Source Target Attentionはエンコーダーとデコーダー(inputとmemory)を使用していましたが、Self-Attentionでは自Layer内で全てを完結することで計算を高速化するというものです(input=memory)。また、並列計算によって出力をより複雑に表現できます。文章だと本当に意味が分からないですよね。これをがんばって整理してみます。

Source Target Attention との比較

Source Target AttentionとSelf-Attentionを超ざっくり比較すると↓のとおりです。Source Targetではinputとmemoryを使っていましたが、selfではinputだけです。
またkey、valueはmemoryの代わりにinput全ての単語を使用します。
image.png

Self-Attentionのレイヤ

全体レイヤ

image.png
もう絵を見ても何のことやら分からないと思うのですが、順番に整理します。
まずインプット文章を「I am man」とします。「何だその文章?」と思われるかもしれませんが、3単語が絵にする限界だったので適当に文章を作っています。ご容赦いただければ幸いです。また、one-hotから分散表現の獲得までは省略します(気になる方は前回投稿を参照くださいhttps://qiita.com/ta2bonn/items/c645ecbcf9dabd0c4778 )。
Self-Attentionのレイヤを見ると、それぞれの単語から「query、key、value」が作成されていますので、説明はココから始めるとして、以降「I」の単語を使って説明します。

最初の単語「I」に絞ったレイヤ

「I」に絞ると↓のようなイメージです。ポイントは「I」から出てるqueryが全ての単語につながっている箇所です。詳細は後で説明します。
image.png

Self-Attentionの処理順序

参考元から拝借させていただきました。が、この手順を眺めてもまだ良く分からないと思うので、順番に説明します。参考元と紐づけできるように英語をそのまま書いてますが、日本語「()」の方を見ていただければOKです。
1.Prepare inputs(インプット前処理)
2.Initialise weights(query、key、valueの重み設定)
3.Derive key, query and value(query、key、valueの導出)
4.Calculate attention scores for Input 1(scoreの導出)
5.Calculate softmax(scoreベクトルをsoftmaxで処理)
6.Multiply scores with values(scoreとvalueを分ける)
7.Sum weighted values to get Output 1(計算したベクトルを全部足す)
8.Repeat steps 4-7 for Input 2 & Input 3(全てのインプットに適用)

Self-Attentionの処理

1.Prepare inputs(インプット前処理)

ここは先ほど説明を省略するといったone-hotから分散表現の獲得までの処理です。詳細は割愛しますが、↓のとおりになります。
image.png

2.Initialise weights(query、key、valueの重み設定)

いよいよSelf-Attentionレイヤの説明に入ります。まず、「query」「key」「value」が何者なのか記載しておきます。
image.png
やりたい事は「重み設定」ですので、それぞれに重みwを設けます。重みの数値は適当で列数は自由に設定可能です(ここでは3列)。
image.png
<ポイント>
源泉となるデータは同一のinputですが、重み(w)はそれぞれで用意する所です。

3.Derive key, query and value(query、key、valueの導出)

keyの導出

それぞれの単語に重みを掛けて、keyベクトル(行列)を作成します。以降の処理で全ての単語ベクトル(key1,key2,key3)を使用します。
image.png

queryの導出

keyと同様に計算します。ですが、今は「I」の処理なので、queryは「I」の部分(query1)しか使いません。
image.png

valueの導出

keyと同様、以降の処理で全ての単語ベクトル(value1,value2,value3)を使用します。
image.png

4.Calculate attention scores for Input 1(scoreの導出)

これがAttention_Weightになる元のベクトルです。queryとkeyから「I」と「全単語」の関係性を取得します。実際の次元数は√dになりますが、一旦無視します。
image.png

5.Calculate softmax(scoreベクトルをsoftmaxで処理=Attention_Weightの生成)

ここは単純にscoreベクトルをsoftmaxで計算しただけです。これがAttention_Weightです。
image.png

6.Multiply scores with values(scoreとvalueを分ける)

上記5でAttention_Weightを取得したので、valueから単語を抽出します。
image.png

7.Sum weighted values to get Output 1(計算したベクトルを全部足す)

valueから単語情報を抜き出したら、全てのベクトルを足します。これがoutputで、「I」が他のどの単語と関係が深いのかが分かります。
image.png
ただ、今回の例では非常に分かりにくいので、論文「Attention Is All You Need」=Transformer から絵を拝借させていただきます。
image.png
上の絵は上段がqueryです。queryである「its」が Law, application という
valueから情報を引いていることを示しています。

8.Repeat steps 4-7 for Input 2 & Input 3(全てのインプットに適用)

上記4~7を他の単語にも適用すると以下のとおりになります。が、今回の例では良く分からない数字(値)になってますね。すみません。
image.png
<参考:「am」のイメージ>
image.png
<参考:「man」のイメージ>
image.png

Self-Attentionをベクトル(行列)で整理

ここまで考え方・理屈を中心に整理しましたが、実際にベクトル(行列)で整理すると理解が深まるので、ベクトル(行列)で整理してみました。↓は「I」の処理です。
image.png
<補足>
score計算に内積を計算する必要があるため、 queryとkeyの次元数は常に同じでないとダメです。一方、valueの次元数はquery、keyと合わせる必要がなく、outputの次元数になるので、outputを意識した次元数にする必要がある(↑ではquery、keyに合わせているように見えてしまってます。すみません)。つまり「query、key」とvalueでは同じ単語でも異なるベクトル(行列)で表現することが可能です。

MultiHead

MultiHeadとは

話を冒頭の「Self-Attentionとは」に戻します。Self-Attentionのメリットとして「並列計算によって、出力をより複雑に表現できる」と書きました。これを実現するのが「MultiHead」です。MultiHeadは一言で言うと「Self-Attentionをいっぱい作って、より複雑に表現しよう」というものです。

そもそも何故こんな事が必要かというと、自然言語処理(NLP)には厄介な問題があって、その一つが「単語間の関係性が複数ある」ことです。

例えば「青が一番好き」と「その服に一番合う色は青」では「一番」と「青」の関係性が異なります。これを同じAttention_Weightで表現すると事実と異なる解釈をしてしまいます。よって、Self-Attentionを複数用意(MultiHeadに)することにより複数の単語関係を理解させます。

MultiHeadのレイヤ

全体レイヤのイメージは↓のとおりです。今回は3Headにしました。Self-Attention1が今まで説明してきたSelf-Attentionだと理解してください。そうすると2,3が追加されていますよね。これは「単語の関連を今まで1種類で表現していたが、3種類で表現している」ことになります。
image.png

MultiHeadのoutput算出方法

それぞれのSelf-Attentionからoutputを得ます。くどいようですが、今まで説明してきたSelf-AttentionはSelf-Attention1です。よってアウトプットは「output1-1」「output2-1」「output3-1」になります。
image.png

各Self-Attention(各head)のoutputが出そろったら、concatenateします。これにアウトプット用の重みw(o)を掛け合わせて、出力を得ます。
image.png
やっぱり3次元程度だと見た目からでは意味が分からないですが、Attentionは概ね理解できました。

次回に向けて

次は論文「Attention Is All You Need」=Transformer を整理します。

「Attention Is All You Need = Transformer をざっくり理解してみる。」
https://qiita.com/ta2bonn/items/4ec687bc136a41c364ae

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away