Transformerの説明で、Self-Attention・クエリ・キー・バリュー・Multi-Head Attention・位置エンコーディングが全部出てくる
1つずつ何をしてるのか整理したい
【疑問】TransformerのSelf-Attention、Q・K・Vとマルチヘッドと位置エンコーディングをまとめて整理したい【G検定】
前提のおさらい。Seq2SeqのAttentionは、訳文の1語を作るたびに、入力の文の各語にどれだけ注目するかの重みをつけて混ぜる。ただしエンコーダもデコーダもRNNやから、1語ずつ順番にしか計算できん
>>1
Transformerは、ヴァスワニらの2017年の論文「Attention Is All You Need」で出たモデル。RNNを使わず、Attentionと全結合層だけで系列を扱う
全部の語を一度に計算できるから、GPUで並列に学習しやすい
>>3
Self-Attentionは、同じ文の中の語どうしで注目しあう
「彼はその本を買った。それは高かった」の「それ」が「本」を指す、みたいな文の中の関係をとらえる
Source-Target Attentionが入力の文と出力の文のあいだなのに対して、Self-Attentionは1つの文の中
>>4
クエリ・キー・バリューって何なん?
>>5
各語のベクトルから、3種類のベクトルを作る
クエリ :自分は何を探してるか
キー :自分はどんな情報を持ってるか(探される側の見出し)
バリュー :実際に渡す中身
クエリとキーの内積で相性を測って、その重みでバリューを混ぜる
>>6
式で書くと
はキーの次元。2語だけで、クエリと各キーの内積が4と0、 なら
で割って 2 と 0、ソフトマックスで約 0.88 と 0.12。1語目のバリューを88%、2語目を12%混ぜる
>>7
なんで で割るん?
>>8
次元が大きいと、内積の値が大きくなりやすい。値が大きいとソフトマックスがほぼ0か1に偏って、勾配がほとんど流れんくなる
で割って、値の大きさを次元によらずそろえてる
Multi-Head Attentionは、Attentionを何組も並べて同時に計算するもの
論文の設定では、512次元を8つの頭(ヘッド)に分けて、1つあたり 次元で計算し、最後につなげる
ある頭は文法の関係、別の頭は指している先の関係、みたいに、違う種類の関係を別々にとらえられる
>>10
8つに分けたら、1つあたりの表現力が落ちるんちゃうの?
>>11
1つの頭は64次元に減るけど、全体の計算量は512次元で1つやるのとほぼ同じ。1つの大きい重みで全部の関係を平均してしまうより、分けたほうが違う関係を同時に拾える、というのが論文の考え方
>>4
Self-Attentionは全部の語を一度に見るやろ。それやと語の順番が分からんのちゃう?
>>13
分からん。「犬が猫を追う」と「猫が犬を追う」が、順番の情報なしでは同じ語の集まりになる
そこで、各語のベクトルに位置を表すベクトルを足す。これが位置エンコーディング。論文では sin と cos を使った
位置1の最初の2つの成分は と 。次元が後ろになるほどゆっくり変わる波を使う
Transformer全体は、エンコーダとデコーダを何層も重ねた形
各層の中は Attention と全結合層で、それぞれにスキップ結合とレイヤー正規化がつく
デコーダには、まだ作ってない先の語を見ないように隠す(マスクする)Self-Attentionと、エンコーダを見るSource-Target Attentionがある
>>15
弱点もある。全部の語のペアで相性を計算するから、文の長さが2倍になると計算量はおよそ4倍。長い文書ほど重くなる
>>16
それでも並列に学習できる強みが大きくて、BERTや大規模言語モデル、画像のVision Transformerまで、今の多くのモデルの土台になってるのはこの形
管理人のひとこと
- Transformer(ヴァスワニら、2017年の論文)はRNNを使わずAttentionと全結合層で系列を扱い、並列に計算できる。
- Self-Attentionは同じ文の中の語どうしの注目。クエリとキーの内積で相性を測り、バリューを混ぜる。式は で、内積4と0・ なら重み約0.88と0.12。
- で割るのはソフトマックスの偏りを防ぐため。Multi-Head Attentionは512次元を8つ(各64次元)に分けて違う関係を同時にとらえる。
- 位置エンコーディングで語順の情報を足す(sin・cos)。各層にスキップ結合とレイヤー正規化がつき、デコーダはマスクつきSelf-AttentionとSource-Target Attentionを持つ。長さが2倍で計算量は約4倍。