図解トランスフォーマー



Illustrated Transformer



序文

Transformerの記事を説明する非常に優れた記事を翻訳してください。 元のリンク
前に 論文 注意は、深層学習モデルの至る所に存在する方法になっています。これは、NMT(ニューラル機械翻訳)の翻訳効果を向上させるのに役立つアイデアです。このブログでは、トレーニングをスピードアップするために注意を拡張するTransformerを解析します。 G OogleのNMTパフォーマンスは抜群です。ただし、その最大の利点は、並列化できることです。実際、Google Cloudは、クラウドTPUの派生モデルとしてTransformerを推奨しています。それでは、Transformerを分解して、どのように機能するかを見てみましょう。
トランスフォーマーは 'にあります 注意が必要なすべてです 'TFアプリケーションで提案されているのは Tensor2Tensor サブモジュール。ハーバードのNLPチームは、対応するPyTorchを作成しました ガイドの説明 。この論文の目的は、初心者が理解しやすいように、難易度を単純化し、概念を段階的に説明することです。



ハイレベルな外観

まず、機械翻訳など、モデル全体をブラックボックスと見なし、言語からの文を入力として受け入れ、それを他の言語の出力に翻訳します。



エンコードコンポーネント、デコードコンポーネント、およびそれらの間の接続レイヤーで構成される詳細を確認してください。



コーディングコンポーネントは6層のエンコーダーのスタックであり、デコードコンポーネントも6層のデコーダーです。

エンコーダの構造は完全に同じですが、パラメータを共有しないでください各エンコーダは、次の2つの単語に分解できます。

エンコーダーへの入力は、最初に自己注意レイヤーを通過します。これは、エンコーダーが単語をエンコードするときに、入力シーケンス内の他の単語を認識できるようにします。後で、自己注意の内部構造を詳しく見ていきます。
自己注意の出力は順方向ネットワークに流れ、各入力位置に対応する順方向ネットワークは互いに独立しています。
デコーダーにもこれらのサブレイヤーがありますが、2つのサブレイヤーの間にアテンションレイヤーが追加され、デコーダーが入力文の関連部分に焦点を合わせるのに役立ちます。 seq2seqモデル 注意効果も同様です。

テンソルを画像に取り込む

ここで、ベクトル/テンソルから始めて、モデルの主要コンポーネントを分析し、次にそれらがさまざまなコンポーネントと出力をどのように通過するかを分析します。
NLPアプリケーションの一般的な例と同様に、最初に入力ワードを使用します 埋め込みアルゴリズム ベクトルに変換します。

各単語は512次元のベクトルにマッピングされ、ベクトルはボックスで表されます。

単語のベクトル化は最下位レベルのエンコーダーの入力でのみ発生するため、他のエンコーダーの入力が前のものであることを除いて、各エンコーダーはリストを受け取ります(各要素は512次元の単語ベクトルです)。エンコーダーの出力。リストのサイズは設定可能なスーパーパラメータであり、通常はトレーニングセットの最長の文の長さです。
入力シーケンスをベクトル化した後、それらはエンコーダーの次の2つのサブレイヤーを通過します。

ここでは、各単語が独自のエンコーダパスのみを流れるTransformerの主要な機能を確認できます。自己注意層では、これらのパスは相互に依存しています。 フォワードネットワーク層には、これらの依存関係はありません。 、ただし、これらのパスは、フォワードネットワークを流れながら並行して実行できます。

今、私たちはエンコードしています!

前述のように、エンコーダは入力用のベクトルのリストを受け取ります。次に、自己注意処理に送信され、次に転送ネットワークに送信され、最後に次のエンコーダに送信されます。

各場所の単語ベクトルは、自己注意モジュールに送信され、次にフォワードネットワークに送信されます(ネットワーク構造は各ベクトルで同一です)

高レベルでの自己注意

自己注意という言葉に惑わされないでください。誰もがそれをよく知っているようですが、記事を読む前は、注意は必要なすべてです。私は個人的にその概念を理解していませんでした。以下では、それがどのように機能するかを徐々に分解します。
次の文を例にとると、入力文として「動物は疲れすぎたので通りを渡らなかった」と翻訳したいと思います。文中で「それ」とはどういう意味ですか? 「それ」は「通り」または「動物」を指しますか?人々にとっては簡単な質問ですが、アルゴリズムについては簡単ではありません。
モデルが単語「it」を処理するとき、自己注意により「it」と「animal」を関連付けることができます。モデルが各場所で単語を処理するとき、自己注意により、モデルは、現在の単語をより適切にエンコードするための2番目の手がかりとして文の他の場所情報を見ることができます。 RNNに精通している場合は、RNNの非表示状態により、前の単語ベクトルが現在の単語の解釈ベクトルをどのように解釈できるかを考えることができます。 Transformerは、自己注意を使用して、関連する単語の理解を現在の単語にエンコードします。

'it'(エンコーダーの最終出力)をエンコードする場合、注意の一部は '動物'に集中し、その表現は 'it'のエンコードにマージされます。

上の写真は Tensor2Tensorノートブック 視覚化の例

自己注意の詳細

最初に自己注意のベクトルを計算する方法を見てから、それを行列で計算する方法を見てみましょう。
最初の一歩 エンコーダの入力ベクトルに従って、3つのベクトルが生成されます。たとえば、単語ベクトルごとに、query-vec、key-vec、value-vecが生成され、生成方法にそれぞれ3つの行列が乗算され、これらの行列はトレーニングプロセスにあります。学ぶ必要があります。 [注:すべての単語ベクトルが3つの行列を楽しむわけではありませんが、すべての入力は3つの変換行列を共有します 重み行列は、入力位置に基づく変換行列です 試してみるポイントがあります。各単語に変換マトリックスがある場合、それはより効果的ですか? 】
多頭注意の計算をより安定させるために、これらの新しいベクトルの次元は入力単語ベクトルの次元(512–> 64)よりも小さく、必ずしも小さいわけではないことに注意してください。

W ^ qを掛けて、クエリを取得します

いわゆるquery / key / value-vecとは何ですか?
この種の抽出は、注意を計算して考えるのに適しています。次の注意を読むと、これらのベクトルの役割をより明確に理解できるようになります。
第二段階 注意力の計算はスコアを計算することです。 「ThinkingMatchines」というフレーズの場合、「Thinking」(pos#1)の注意スコアを計算します。各単語と「思考」の評価スコアを計算する必要があります。このスコアは、「思考」(固定位置)をエンコードするときに各入力単語がどれだけ注意を向ける必要があるかを決定します。
このスコアは、すべての単語のクエリベクトルとキーベクトルに対応する内積によって取得されます。したがって、位置#1を処理すると、最初のスコアはq1とk1の内積であり、2番目のスコアはq1とk2の内積です。

ステップ3と4 、8で割った値(= )、したがって、勾配はより安定します。次に、softmax演算を追加し、すべてが正で合計が1になるようにスコアを正規化します。

ソフトマックススコアは、この場所での各単語の表現(注意)の程度を決定します。明らかに、この位置にある単語は正規化されたスコアが最も高いはずですが、ほとんどの場合、単語の関連する単語に注意を払うことが常に役立ちます。
5番目のステップ 、softmaxスコアにvalue-vecを掛けます。関心のある単語の価値を保持し、無関係な単語の価値を弱めます。
ステップ6 、すべての重み付けベクトルを合計して、その位置での自己注意の出力を生成します。

上記は自己注意計算プロセスであり、生成されたベクトルはフォワードネットワークに流れ込みます。実際のアプリケーションでは、上記の計算はより高速なマトリックスで実行されます。以下では、単語レベルでの行列計算について説明します。

自己注意の行列計算

最初の一歩 、クエリ/キー/値マトリックスを計算し、すべての入力単語ベクトルを入力マトリックスにマージします そしてそれらに重み行列を掛けます

入力行列Xの各行は、入力文の単語ベクトルを表します。

やっと マトリックス処理を使用するため、ステップ2から6を組み合わせて、自己注意層の出力を計算する式にします。

行列形式の自己注意計算

多くの頭を持つ獣

この論文は、多頭メカニズムをさらに自己注意に高め、2つの方法で注意層の効果を改善します。

  1. 強気のメカニズムは、さまざまな場所に焦点を合わせるモデルの能力を拡張します。上記の例では、z1には、実際の単語によってのみ決定される、他の単語に関する少量の情報しか含まれていません。 「動物は疲れすぎて通りを渡らなかった」という翻訳のような他の場合には、「それ」という言葉が何を指しているのか知りたいのです。
  2. マルチヘッドメカニズムは、注意の複数のサブ表現を与えます。以下の例に示すように、長いヘッドの下には、1つのセット(論文では8つのヘッド)だけでなく、複数のクエリ/キー/値マトリックスのセットがあります。各グループはランダムに初期化され、トレーニング後、入力ベクトルを異なる部分式スペースにマッピングできます。

各ヘッドには、Q / K / Vマトリックスのセットがあります

多頭の自己注意を計算すると、Q / K / V行列の8つの異なるセットがあり、8つの異なる行列が得られます。

これはいくつかの問題を引き起こします。フォワードネットワークは8つのマトリックスを受信できません。代わりに、入力は行列であることが期待されるため、次の8つの行列を1つの行列に処理する方法があります。

上記は、マルチヘッド自己注意メカニズムの内容です。マトリックスの一部に過ぎないと思います。それらをグラフに載せて、次のように視覚化してみましょう。

ここで、アテンションヘッドを追加した後、「it」をコーディングするときにどのアテンションヘッドが集中するかを振り返ります。

「それ」をエンコードするとき、一方の注意の頭は「動物」に集中し、もう一方の頭は「疲れた」に焦点を合わせます。ある意味で、モデルは「それ」の表現のために「動物」と「疲れた」を合成します。

すべての注意を画像に入れると、直感的に説明するのが難しくなります。

位置エンコーディングを使用したシーケンスの順序の表現

これまで、入力ステートメントの語順を理解する方法については説明していません。
語順の利用の問題を解決するために、Transformerは各単語にベクトルペアを追加しました。これらのベクトルは、モデル学習の指定されたパターンに従って、単語の位置、またはシーケンス内のさまざまな単語の例を決定します。 。これを理解するには、これらの値を追加して、Q / K / Vベクトルにマッピングされたときの単語ベクトルとポイント乗算された注意の間の距離を提供します。

モデルに語順情報を提供するために、新しい場所embベクトルが追加され、各ベクトル値は指定されたパターンに従います。

位置ベクトルが4次元であると仮定すると、実際の位置ベクトルは次のようになります。

4次元のみのベクトル表現の例

いわゆる指定モードとは何ですか?
次の図では、各行は位置pos-embを表しているため、最初の行は、文の最初の単語ベクトルに追加するベクトルです。各行には512の値があり、各値は[-1、1]にあり、パターンを視覚化できるようにペイントします。

実際の例は20ワードで、各ワードは512次元です。左側は正弦関数によって生成され、右側は余弦によって生成されるため、中央で有意な分離を観察できます。

位置ベクトルのコーディング方法は、論文のセクション3.5に記載されており、コードも確認できます。 get_timing_signal_ld() コードを配置する方法は1つだけではありません。符号化方法は、未知の長さのシーケンスを処理できなければならないことに注意する必要があります。

残差

エンコーダー構造で注目に値する詳細の1つは、各サブレイヤー(slef-attention、ffnn)に残りの接続があり、その後に接続が続くことです。 レイヤーの正規化

ベクトルとレイヤーノルムの操作を視覚化すると、次のようになります。

同じことがデコーダーにも当てはまります。 2層エンコーダ+2層デコーダがトランスを構成すると仮定し、その構造は次のとおりです。

デコーダー側

エンコーダー側のほとんどの概念を確認したので、デコーダーがどのように機能するかについての基本的な理解ができました。それらがどのように連携するかを見てみましょう。
エンコーダーは入力シーケンスの処理から始まり、最終的なエンコーダーの出力はKとVに変換されます。これらは、各デコーダーの「エンコーダー-デコーダー注意」レイヤーによって使用されます。デコーダーが入力シーケンスの適切な場所に焦点を合わせるのを助けます。

エンコード後は、デコードの各ステップで要素を出力シーケンスとして出力するデコードプロセスです。

次の手順は、デコーダが変換出力を完了したことを示す特別な記号が表示されるまで繰り返されます。各ステップの出力は、次のデコーダーに送られます。エンコーダの入力の処理と同様に、位置ベクトルがデコーダの入力に追加されます。

デコーダーのセルフアテンションレイヤーは、エンコーダーのセルフアテンションレイヤーとは少し異なります。デコーダーでは、自己注意レイヤーは、現在の出力よりも前の場所にのみ注意を向けることができます。ソフトマックスの前に、これは将来の場所を隠すことによって達成されます(それらを-infに設定します)。
'Encoder-Decoder Attention'レイヤーは、マルチヘッドのセルフアテンションと同じように機能します。 1つのポイントを除いて、前のレイヤーからの出力を取得してクエリマトリックスに変換し、最後のレイヤーのエンコーダーのキーを受け取ります。そして、キーと値のマトリックスを実行するための値のマトリックス。

最終的な線形およびソフトマックス層

デコーダーは最終的に浮動小数点ベクトルを出力します。どうやってそれを言葉に変えますか?これは、最終的な線形層とソフトマックス層の主な作業です。
線形層は、デコーダーの最終出力を非常に大きなロジットベクトルにマッピングする単純な完全に接続された層です。モデルに、トレーニングセットから学習された10,000語(出力の語彙)があることがわかっているとします。次に、ロジットベクトルには10,000の次元があり、各値は単語の可能な傾向値を表します。
ソフトマックス層はこれらのスコアを確率値(正と合計の両方で1)に変換し、最大値に対応する次元の単語がこのステップの出力単語です。

トレーニングの要約

トレーニングされたトランスフォーマーの前進プロセスを見てきましたが、トレーニングの概念を確認することも非常に役立ちます。
トレーニング中、モデルは上記のフォワードプロセスを経て、マーカートレーニングセットでトレーニングすると、予測された出力を実際の出力と比較できます。
視覚化のために、出力に6つの単語しかないと仮定します(「a」、「am」、「i」、「thanks」、「student」、「」)

モデルの語彙は、トレーニング前の前処理中に生成されます。

語彙が定義されると、ワンホットエンコーディングなど、各単語を表す同じ次元のベクトルを構築できます。次の例では、「am」をエンコードしています。

たとえば、ワンホットエンコーディングの出力語彙を使用する

モデルの損失損失、トレーニングプロセス中に最適化に使用される指標について説明し、非常に正確なモデルを取得するための学習をガイドします。

損失関数

簡単な例を使用して、翻訳などのトレーニングを示します。 ありがとうございました 'それ'。つまり、出力の確率分布は「thanks」という単語を指しますが、モデルはランダムに初期化されるようにトレーニングされていないため、期待される出力になる可能性は低くなります。

モデルパラメータはランダムに初期化されるため、トレーニングされていないモデルはランダムな値を出力します。実際の出力を比較してから、転送後のエラーを使用して、出力が実際の出力に近づくようにモデルの重みを調整できます。

2つの確率分布を比較する方法は?簡単な採用 クロスエントロピー または カルバック・ライブラー発散 それらの中の一つ。
これが非常に単純な例であることを考えると、より現実的なケースは、入力として文を使用することです。たとえば、入力は「jesuisétudiant」であり、期待される出力は「私は学生です」です。この例では、モデルが次の条件を満たす連続確率分布を出力することを期待しています。
1各確率分布は、語彙と同じ次元です。
2最初の確率分布は、「i」の予測確率値が最も高くなります。
3 2番目の確率分布は、「am」の予測確率値が最も高くなります。
45番目の出力が ''タグを指すまで。

文の場合、トレーニングモデルのターゲット確率分布

十分に大きなトレーニングセットで十分な時間をトレーニングした後、生成されると予想される確率分布は次のようになります。

トレーニング後、モデルの出力は期待される翻訳になります。もちろん、これはプロセスがトレーニングセットからのものであることを意味するものではありません。出力とはほとんど関係がない場合でも、各場所には値があることに注意してください。これは、softmaxがトレーニングに役立つ場所です。

モデルが最も高い確率を選択し、他の部分を破棄すると仮定すると、モデルはステップごとに1セットの出力のみを生成するため、これは貪欲なデコードと呼ばれる予測を生成する方法です。もう1つの方法はビームサーチです。各ステップは、ヘッドの確率が最も高い2つの出力のみを保持します。 2つの出力に従って、次のステップが予測され、次に、ヘッドの可能性が高い2つの出力が予約され、予測が終了するまで繰り返されます。 Top_beamsは、スーパーパラメーターでテスト可能な調整です。

前進して変革する

この記事が、読者がTransformerの主要な概念の理解に壊滅的な影響を与えるのに役立つことを願っています。それについてもっと知りたい場合は、次の手順をお勧めします。
1読む 注意が必要なすべてです 紙、トランスフォーマーのブログ投稿 Transformer:言語理解のための新しいニューラルネットワークアーキテクチャTensor2Tensor 使用説明書。
2ウォッチ」 ŁukaszKaiserの講演 '、モデル全体とその詳細をとかします。
3プロジェクトを再生する Tensor2Tensorリポジトリの一部として提供されるJupyterNotebook
4次のプロジェクトを試す Tensor2Tensor

関連作業

  1. ニューラル機械翻訳のための深さ方向に分離可能な畳み込み
  2. それらすべてを学ぶための1つのモデル
  3. シーケンスモデル用の離散オートエンコーダ
  4. 長いシーケンスを要約してウィキペディアを生成する
  5. イメージトランスフォーマー
  6. Transformerモデルのトレーニングのヒント
  7. 相対位置表現による自己注意
  8. 離散潜在変数を使用したシーケンスモデルでの高速デコード
  9. Adafactor:劣線形メモリコストを伴うアダプティブラーニングレート

了承:
この投稿の以前のバージョンに関するフィードバックを提供してくれたIlliaPolosukhin、Jakob Uszkoreit、Llion Jones、Lukasz Kaiser、Niki Parmar、およびNoamShazeerに感謝します。
私を襲ってください ツイッター 修正やフィードバックのために。