Attention と Transformer:注目のしくみが世界を変えた
今の大規模な言語モデルの土台になった、注目のしくみを学びます。基礎層では、関連する部分に注目する Attention と、それだけで作った Transformer のしくみをつかみます。深掘り層では、Seq2Seq の限界、クエリ・キー・バリューによる Attention の計算、Self-Attention と Source-Target Attention、Multi-Head Attention、位置エンコーディング、Transformer の全体像までを数式も交えて説明できるようになります。
ねらい
このレッスンでは、今の大規模な言語モデルの土台になった、注目のしくみを学びます。
基礎
関連する部分に注目する Attention(アテンション)と、それだけで作られた Transformer(トランスフォーマー)のしくみをつかみます。
1. Attention は、関係する部分に注目するしくみです
Attention とは、たくさんの情報の中から、今の処理に関係する部分を選んで、そこに重く注目するしくみです。日本語では注意機構とも呼ばれます。
翻訳を思いうかべてください。「今」訳している語を作るとき、原文のすべての語を同じ重さで使うのではありません。関係の深い語ほど重く、関係の薄い語ほど軽く使います。この「どこにどれだけ注目するか」をその都度計算するのが Attention です。RNN のように流れを1本の記憶に押しこめるのではなく、必要な相手に直接目を向けるので、遠く離れた語どうしの関係もとらえられます。
2. Transformer は、Attention だけで作った強力なモデルです
Attention の力を最大限に使うために作られたのが Transformer です。Transformer は、RNN の回帰結合を使わず、Attention を主役にして組み立てたモデルです。
RNN は前から順に処理するため、1語ずつ順番待ちが必要で、時間がかかりました。Transformer は、文の全部の語を同時に見て、語どうしの注目を一度に計算します。順番待ちがないため、大量のデータで速く学習でき、とても大きなモデルを作れるようになりました。今の大規模な言語モデルの多くは、この Transformer を土台にしています。
ポイント
Attention は、関係する部分に注目するしくみです。Transformer は、その Attention を主役にして RNN を使わずに組み立てたモデルで、今の大規模な言語モデルの土台になっています。
ここまでの要点
- Attention は、関係する部分を選んで重く注目するしくみです。
- 遠く離れた語どうしの関係も、直接注目することでとらえられます。
- Transformer は、Attention を主役にしたモデルで、今の大規模な言語モデルの土台です。
まずは全体像をつかめれば十分という人は、ここで区切って大丈夫です。「関係する部分に注目する。それを主役にしたのが Transformer」と押さえられていれば、この先の深掘りに進む土台はできています。
発展
ここからは、Attention が生まれた背景の Seq2Seq から始め、クエリ・キー・バリューによる計算のしくみ、Transformer の全体像までを数式も交えて順に組み立てます。前提となる用語は、その都度説明します。
3. Attention が生まれた背景:Seq2Seq とそのボトルネック
Attention は、機械翻訳のために作られた Seq2Seq というしくみの課題から生まれました。Seq2Seq は、シーケンス・トゥ・シーケンスと読み、英語では sequence to sequence(シーケンス・トゥ・シーケンス)と表記します。系列を受け取って、別の系列を返すという意味です。
Seq2Seq は、2つの RNN を組み合わせます。前半のエンコーダ(encoder)が、入力の文を順に読み、その意味を1つの決まった長さのベクトルにまとめます。後半のデコーダ(decoder)が、そのベクトルをもとに、出力の文を1語ずつ作ります。エンコーダは「読み手」、デコーダは「書き手」だと考えてください。
ここに、大きな課題がありました。入力の文がどれだけ長くても、その意味をたった1つの決まった長さのベクトルに押しこめなければならないことです。長い文の情報が1つのベクトルに入りきらず、あふれてしまいます。この、情報の通り道が細くなって詰まる問題をボトルネックといいます。
この課題を解くために考えられたのが Attention でした。デコーダが1語を作るたびに、1つに押しこめたベクトルだけに頼るのではなく、エンコーダが読んだ入力の各語をもう一度すべて見わたし、今の出力に関係する語へ注目する。こうすれば、長い文でも情報のあふれを防げます。Attention は、Seq2Seq のボトルネックを解くしくみとして登場したのです。
理解の確認
Seq2Seq は、エンコーダで入力を1つのベクトルにまとめ、デコーダで出力を作るしくみです。入力が長いと、1つのベクトルに情報が入りきらないボトルネックが起きます。Attention は、出力を作るたびに入力の各語を見わたして注目することで、この課題を解くために生まれました。
4. Attention の中身:クエリ・キー・バリュー
Attention の計算は、3つの役割で組み立てられます。クエリ、キー、バリューです。この3つは、図書館での本の探し方にたとえると分かりやすくなります。
- クエリ(query)は、探したいことを表す問い合わせです。「今ほしいのはこういう情報だ」という手がかりにあたります。
- キー(key)は、それぞれの情報につけられた見出しです。本の背表紙のラベルにあたります。
- バリュー(value)は、それぞれの情報の中身そのものです。本の本文にあたります。
Attention は、まずクエリと、各情報のキーを照らし合わせ、どのキーがクエリに合うかを測ります。合う度合いが高いキーほど、そのバリューを重く取り出します。つまり、問い合わせに合う見出しを探し、見つかった見出しに対応する中身を合う度合いに応じて混ぜ合わせて受け取る、というしくみです。
もう少し正確に、順を追います。
1つ目に、クエリと各キーの合う度合いを計算します。これには、2つのベクトルの向きの近さを測るために、内積(ないせき)を使います。内積とは、2つのベクトルの成分どうしをかけて足し合わせた数で、向きが近いほど大きくなります。クエリと各キーの内積をとると、キーごとの合う度合いを表す数(スコア)が得られます。
2つ目に、このスコアを合計が1になる割合に変換します。この変換にはソフトマックス関数を使います。ソフトマックス関数は、活性化関数のレッスンで学んだとおり、複数の数を合計が1になる割合へならす関数です。こうして、各キーへの注目の重み(どこにどれだけ注目するか)が決まります。
3つ目に、各バリューをその注目の重みで混ぜ合わせて足します。注目の重みが大きいバリューほど、強く反映されます。この混ぜ合わせた結果が、Attention の出力です。
式のかたちで表すと、次のように書けます。クエリを Q、キーを K、バリューを V として、
Attention(Q, K, V)= softmax( QとKの内積 ÷ √(キーの長さ) )で V を重みづけして混ぜ合わせたもの
と表せます。ここで √(キーの長さ)は、キーを表すベクトルの成分の数の、平方根を意味します。言葉で読み下すと、次のようになります。まず、クエリ Q と各キー K の内積をとって、合う度合いを求めます。それをキーの長さの平方根で割ります。この割り算は、キーの成分が多いほど内積が大きくなりすぎるのを防ぎ、値をほどよい大きさに保つための調整です。次に、その結果をソフトマックス関数で注目の割合に変え、最後に、その割合でバリュー V を混ぜ合わせて足します。
ポイント
Attention は、クエリと各キーの合う度合いを内積で測り、ソフトマックスで注目の割合に変え、その割合でバリューを混ぜ合わせます。問い合わせに合う見出しを探し、対応する中身を取り出す、という流れです。
動かして確かめる
3冊の本(見出し=キー)へのスコアと、キーの次元数を動かすと、√(キーの長さ)で割る調整・ソフトマックスによる注目の割合・バリューを混ぜ合わせた出力が、その都度どう変わるか確かめられます。
問い合わせに合う見出しほど、中身を重く取り出す。
3冊の本(見出し)へのスコアと、キーの次元数を動かすと、注目の割合と混ぜ合わせた出力がどう変わるか確かめてください。
クエリ(問い合わせ)と、3冊の本の見出し(キー)との「合う度合い」がスコアです。
理解の確認
Attention は、クエリ(問い合わせ)と各キー(見出し)の合う度合いを内積で測り、ソフトマックスで注目の割合に変え、その割合でバリュー(中身)を混ぜ合わせます。式では、クエリとキーの内積を平方根で割り、ソフトマックスをかけ、バリューを掛け合わせる形になります。
5. Self-Attention と Source-Target Attention
Attention は、クエリとキー・バリューがどこから来るかによって、2つに分けられます。
Self-Attention は、セルフアテンションと読み、日本語では自己注意とも呼ばれます。これは、クエリもキーもバリューも、すべて同じ1つの系列から作る Attention です。1つの文の中で、語どうしがたがいに注目し合います。たとえば「それ」という語が、同じ文の中のどの名詞を指すのかを文の中だけで結びつけられます。Transformer の中心となるしくみが、この Self-Attention です。文の全部の語が、同じ文の全部の語に一度に注目できるため、遠く離れた語どうしの関係を順番待ちなしにとらえられます。
Source-Target Attention は、ソース・ターゲット・アテンションと読みます。Encoder-Decoder Attention(エンコーダ・デコーダ・アテンション)とも呼ばれます。これは、クエリを出力側(ターゲット)から作り、キーとバリューを入力側(ソース)から作る Attention です。出力の語を作るときに、入力の文のどこに注目するかを決めます。先ほどの機械翻訳で、訳している語が原文のどこと結びつくかを見るのが、これにあたります。
2つの違いは、注目する相手が同じ系列の中なのか、別の系列なのか、という点です。Self-Attention は文の内側で、Source-Target Attention は入力と出力の間で、注目を計算します。
理解の確認
Self-Attention は、クエリ・キー・バリューを同じ系列から作り、文の中で語どうしが注目し合います。Source-Target Attention は、クエリを出力側から、キーとバリューを入力側から作り、出力を作るときに入力のどこに注目するかを決めます。
6. Multi-Head Attention:いくつもの視点で同時に注目する
Attention を1回だけ計算すると、注目のとらえ方が1通りに限られます。しかし、語どうしの関係には、いろいろな見方があります。文法のつながり、意味の近さ、指し示す相手など、注目したい関係は1つではありません。
そこで使うのが Multi-Head Attention です。マルチヘッド・アテンションと読み、日本語では複数ヘッド注意とも呼ばれます。これは、Attention を複数の組に分けて、それぞれ別の視点で同時に計算するしくみです。1つひとつの計算の組をヘッド(head)といいます。
各ヘッドは、クエリ・キー・バリューをそれぞれ別のやり方で作り直してから、Attention を計算します。あるヘッドは文法のつながりに、別のヘッドは意味の近さに、というように、たがいに異なる関係に注目するよう学びます。最後に、すべてのヘッドの出力をつなぎ合わせて、1つにまとめます。いくつもの視点を同時に使うことで、語どうしの豊かな関係をとらえられます。
理解の確認
Multi-Head Attention は、Attention を複数のヘッドに分け、それぞれ別の視点で同時に注目を計算します。文法・意味・指し示す相手など、異なる関係を別々のヘッドがとらえ、最後に出力をまとめます。
7. 位置エンコーディング:語の順番を教える
Self-Attention には、弱点が1つあります。文の全部の語を同時に見るため、語の並び順の情報が、そのままでは失われることです。「猫が犬を追う」と「犬が猫を追う」は、同じ語の集まりですが、順番が違えば意味が逆になります。順番を伝えるしくみが要ります。
これを補うのが位置エンコーディングです。英語では positional encoding(ポジショナル・エンコーディング)と表記します。位置エンコーディングは、それぞれの語に、その語が何番目にあるかを表す情報を数のならびとして加えます。語の意味を表すベクトルに、位置を表すベクトルを足し合わせて入力するのです。こうすると、同時に見ても、どの語が何番目かが分かります。
位置を表すベクトルには、位置ごとに異なる、なめらかに変化する波のような値を使う方法が知られています。位置が近いほど値も近くなるため、語と語の位置の関係をモデルが読み取れます。大切なのは、Self-Attention が並び順を直接扱えないぶんを位置エンコーディングが補っているという点です。
理解の確認
Self-Attention は語を同時に見るため、並び順の情報が失われます。位置エンコーディングは、各語に何番目かを表す情報を加えて、順番を伝えます。語の意味のベクトルに位置のベクトルを足し合わせて入力します。
8. Transformer の全体像
ここまでの部品を組み合わせると、Transformer の全体像が見えてきます。Transformer は、エンコーダとデコーダからなります。
エンコーダは、入力の文を受け取り、Self-Attention で語どうしの関係をとらえ、意味を豊かに表し直します。この Self-Attention の層と、各語を個別に変換するフィードフォワード層(前向きの全結合層)を組にして、何段も重ねます。各段には、前のレッスンで学んだスキップ結合とレイヤー正規化が組みこまれ、深く重ねても学習が安定します。
デコーダは、出力の文を1語ずつ作ります。デコーダの中では、まず出力側の Self-Attention で、これまでに作った語どうしの関係をとらえます。このとき、まだ作っていない先の語を見てしまわないように、先を隠す工夫をします。次に Source-Target Attention で、エンコーダが表した入力に注目し、入力のどこと結びつくかを見ます。そのうえで、次の語を予測します。
入り口では、語を単語埋め込みのベクトルに変え、位置エンコーディングを足します。単語埋め込みは、単語の意味をベクトルで表す方法で、自然言語処理の応用のレッスンでくわしく扱います。出口では、デコーダの出力から、次に来る語の候補それぞれの、もっともらしさを計算します。
こうして Transformer は、RNN の回帰結合を使わず、Attention と全結合層とスキップ結合と正規化という部品だけで、系列を高い精度で扱います。順番待ちがなく大量のデータで学習できる利点から、Transformer は言語だけでなく、画像や音声など、さまざまな分野へ広がりました。
ポイント
Transformer は、エンコーダで Self-Attention により入力を表し直し、デコーダで Source-Target Attention により入力に注目しながら出力を作ります。RNN を使わず、Attention を主役に組み立てられています。
理解の確認
Transformer は、エンコーダとデコーダからなります。エンコーダは Self-Attention で入力を表し直し、デコーダは出力側の Self-Attention と、入力に注目する Source-Target Attention を使って、次の語を予測します。入り口で位置エンコーディングを加え、スキップ結合と正規化で深い学習を安定させます。
理解度の確認
説明できる項目にチェックを入れましょう。すべて確認できたら、完了ボタンで記録します。
分からなかった点・気になった点
読み込み中です。