Learning Transformer(図解トランスフォーマー)



Learning Transformer



リンクをコピーする

前回の記事で (前の投稿)、私たちは注意メカニズムを研究しました-現代の深層学習モデルにおける遍在する方法。注意は、ニューラル機械翻訳アプリケーションのパフォーマンスを向上させるのに役立つ概念です。この投稿では、これらのモデルのトレーニング速度を上げるために注意を払うモデルであるTheTransformerを紹介します。トランスフォーマーは、特定のタスクでGoogle Neuro Machine TranslationModelよりも優れています。ただし、最大の利点は、Transformerが並列化にどのように貢献するかによってもたらされます。実際、Google Cloudは、TheTransformerを参照モデルとして使用して クラウドTPU 製品。それでは、モデルを分離して、どのように機能するかを見てみましょう。



トランスフォーマーは記事に掲載されています 注意が必要なすべてです 。そのTensorFlow実装は次のように実装されます Tensor2Tensor パッケージの一部が提供されます。ハーバードのNLPチームが用途を作成しました 注釈付きペーパーを実装するためのPyTorchのガイド 。この記事では、トピックを深く理解していなくても理解しやすいように、いくつかのことを単純化しすぎて1つずつ紹介します。

ハイレベルな外観

まず、モデルをブラックボックスと見なします。機械翻訳アプリケーションでは、ある言語の文を使用して別の言語に出力します。
画像
オプティマスプライムの良さを開くと、エンコードコンポーネント、デコードコンポーネント、およびそれらの間の接続が表示されます。
オプティマスプライムの利点が現れます。エンコーディングコンポーネント、デコーディングコンポーネント、およびそれらの間の接続を見ました。



画像
エンコーディングコンポーネントはエンコーダーのスタックです(紙はそれらの6つを互いに積み重ねます。6番目の数字について魔法のようなものは何もありません。他の配置で間違いなく実験できます)。デコードコンポーネントは、同じ数のデコーダーのスタックです。
エンコーディングコンポーネントは、一連のエンコーダです(紙のスタックが互いに重なり合っています。魔法のような数字の6はありません。間違いなく、他の配置を試すことができます)。デコードコンポーネントは、同じ数のデコーダーのスタックです。
画像
エンコーダーはすべて構造が同じです(ただし、重みは共有されません)。それぞれが2つのサブレイヤーに分割されます。
エンコーダーの構造は同じです(ただし、重みは共有されません)。それぞれが2つのサブレイヤーに分割されています。
画像
エンコーダーの入力は、最初に自己注意レイヤーを通過します。このレイヤーは、エンコーダーが特定の単語をエンコードするときに、入力文内の他の単語を確認するのに役立ちます。自己注意については、投稿の後半で詳しく見ていきます。
エンコーダーへの入力は、最初に自己注意レイヤーを通過します。このレイヤーは、エンコーダーが入力文にエンコードされている他の単語をエンコードするのに役立ちます。ポスト後の自己注意を注意深く観察します。

自己注意層の出力は、フィードフォワードニューラルネットワークに供給されます。まったく同じフィードフォワードネットワークが各位置に個別に適用されます。
自己注意層の出力は、フィードフォワードニューラルネットワークに送信されます。まったく同じフィードフォワードネットワークが、各場所に個別に適用されます。

デコーダーには両方のレイヤーがありますが、それらの間には、デコーダーが入力センテンスの関連部分に焦点を合わせるのに役立つアテンションレイヤーがあります(seq2seqモデルでアテンションが行うのと同様)。
デコーダーにはこれらの2つのレイヤーがありますが、それらの間にアテンションレイヤーがあり、デコーダーが入力文の関連部分に焦点を合わせるのに役立ちます(同様) Seq2seqモデル プロジェクトの注意事項)。
画像



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

モデルの主要なコンポーネントを確認したので、さまざまなベクトル/テンソルと、それらがこれらのコンポーネント間をどのように流れて、トレーニングされたモデルの入力を出力に変換するかを見てみましょう。
モデルの主要コンポーネントを確認したので、まず、さまざまなベクトル/テンソルと、それらがこれらのコンポーネント間をどのように流れてトレーニングモデルの入力を出力に変換するかを調べます。 。

一般的なNLPアプリケーションの場合と同様に、埋め込みアルゴリズムを使用して各入力単語をベクトルに変換することから始めます。
NLPアプリケーションの場合と同様に、最初に埋め込みアルゴリズムを使用して、各入力単語をベクトルに変換します。
画像
埋め込みは、最下部のエンコーダーでのみ行われます。すべてのエンコーダーに共通する抽象化は、それぞれがサイズ512のベクトルのリストを受け取ることです。下部のエンコーダーでは単語の埋め込みになりますが、他のエンコーダーでは、すぐ下にあるエンコーダーの出力になります。 。このリストのサイズは、設定できるハイパーパラメータです。基本的には、トレーニングデータセット内の最長の文の長さになります。
埋め込みは、最下部のエンコーダーでのみ行われます。すべてのエンコーダーの一般的な抽象化は、それぞれサイズ512のベクトルのリストを受け取ることです- 一番下のエンコーダーには埋め込まれた単語がありますが、他のエンコーダーでは、すぐ下のエンコーダーの出力になります 。このリストのサイズは、設定できるハイパーパラメータです。基本的には、トレーニングデータセット内の最長の文の長さです。

入力シーケンスに単語を埋め込んだ後、それぞれがエンコーダーの2つのレイヤーのそれぞれを流れます。
入力シーケンスに単語を埋め込んだ後、単語は各エンコーダーの2つのレイヤーを通過します。
画像
ここで、Transformerの1つの重要なプロパティがわかり始めます。それは、各位置の単語がエンコーダー内の独自のパスを流れるということです。自己注意層では、これらのパス間に依存関係があります。ただし、フィードフォワード層にはこれらの依存関係がないため、フィードフォワード層を通過しながらさまざまなパスを並行して実行できます。
ここで、Transformerの重要なプロパティが表示され始めます。ここでは、パス内の各単語がエンコーダー内の独自のパスを流れます。自己注意層では、これらのパス間に依存関係があります。ただし、フィードフォワード層にはこれらの依存関係がないため、フィードフォワード層を通過するときにさまざまなパスを並行して実行できます。

次に、例を短い文に切り替えて、エンコーダーの各サブレイヤーで何が起こるかを見ていきます。
次に、例を短い文に切り替えて、エンコーダーの各サブレイヤーで何が起こるかを見ていきます。

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

すでに述べたように、エンコーダーは入力としてベクトルのリストを受け取ります。これらのベクトルを「自己注意」層に渡し、次にフィードフォワードニューラルネットワークに渡すことによってこのリストを処理し、出力を次のエンコーダーに上向きに送信します。
すでに述べたように、エンコーダーは入力としてベクトルのリストを受け取ります。ベクトルを「自己注意」層に渡し、フィードフォワードニューラルネットワークに渡し、出力を次のエンコーダーに送信してリストを処理します。
画像

高レベルでの自己注意

誰もが知っておくべき概念のように、「自己注意」という言葉を投げかけることに騙されないでください。 Attention is All You Needの論文を読むまで、私は個人的にこの概念に出くわしたことはありませんでした。それがどのように機能するかを蒸留してみましょう。
誰もが知っておくべき概念である「セルフケア」という言葉に惑わされないでください。注意はあなたが必要とするすべての論文を読む前に、私はこの概念に遭遇したことがありません。それがどのように機能するかを蒸留してみましょう。

次の文が翻訳したい入力文であるとしましょう。
次の文が翻訳したい入力文であると仮定します。

”The animal didn't cross the street because it was too tired”

この文の「それ」は何を指しますか?それは通りを指しているのですか、それとも動物を指しているのですか?人間にとっては簡単な質問ですが、アルゴリズムにとってはそれほど簡単ではありません。
この文で「それ」とはどういう意味ですか?それは通りや動物を指しますか?これは人間にとっては単純な問題ですが、アルゴリズムにとっては単純ではありません。

モデルが「それ」という単語を処理しているとき、自己注意により、「それ」を「動物」と関連付けることができます。
モデルが単語「it」を処理するとき、自己注意により、「it」を「animal」に関連付けることができます。

モデルが各単語(入力シーケンスの各位置)を処理するとき、自己注意により、入力シーケンスの他の位置を調べて、この単語のエンコードを改善するのに役立つ手がかりを探すことができます。
モデルが各単語(入力シーケンスの各位置)を処理するとき、自己注意により、入力シーケンスの他の場所を調べて、単語をより適切にエンコードするのに役立つ手がかりを見つけることができます。

RNNに精通している場合は、非表示状態を維持することで、RNNが処理した以前の単語/ベクトルの表現を現在処理している単語/ベクトルに組み込む方法を考えてみてください。自己注意は、Transformerが他の関連する単語の「理解」を現在処理している単語に焼き付けるために使用する方法です。
RNNに精通している場合は、RNNが処理中の前の単語/ベクトルの表現を、処理中の現在の単語/ベクトルとマージできるように、非表示状態を維持する方法を検討してください。自己懸念は、Transformerが他の関連する単語の「理解」を現在取り組んでいる単語に組み込むために使用する方法です。
画像
TransformerモデルをロードできるTensor2Tensorノートブックを必ずチェックして、このインタラクティブな視覚化を使用して調べてください。
必ずご確認ください Tensor2Tensorノートブック 、ここでTransformerモデルをロードし、このインタラクティブな視覚化で調べることができます。

自己注意の詳細

まず、ベクトルを使用して自己注意を計算する方法を見てから、マトリックスを使用して実際にどのように実装されているかを見てみましょう。
最初にベクトルを使用して自己注意を計算する方法を見てから、行列を使用して実際にどのように機能するかを引き続き確認しましょう。

自己注意を計算する最初のステップは、エンコーダの各入力ベクトルから3つのベクトルを作成することです(この場合、各単語の埋め込み)。したがって、単語ごとに、クエリベクトル、キーベクトル、および値ベクトルを作成します。これらのベクトルは、トレーニングプロセス中にトレーニングした3つの行列を埋め込みに乗算することによって作成されます。
自己注意を計算する最初のステップは、各エンコーダーの入力ベクトルから3つのベクトルを作成することです(この場合、各単語を埋め込みます)。したがって、単語ごとに、クエリベクトル、キーベクトル、および値ベクトルを作成します。これらのベクトルは、埋め込みに、トレーニング中にトレーニングした3つの行列を掛けることによって作成されます。

これらの新しいベクトルは、埋め込みベクトルよりも次元が小さいことに注意してください。それらの次元は64ですが、埋め込みおよびエンコーダの入力/出力ベクトルの次元は512です。小さくする必要はありません。これは、多面的な注意の計算を(ほとんど)一定にするためのアーキテクチャの選択です。
これらの新しいベクトルは、埋め込まれたベクトルよりも小さいことに注意してください。それらの次元は64であり、埋め込みおよびエンコーダーの入出力ベクトルの次元は512です。これらを小さくする必要はありません。これは、長期的な注意の計算を(ほとんど)変更しないアーキテクチャ上の選択です。
画像
「クエリ」、「キー」、「値」のベクトルとは何ですか?
「クエリ」、「キー」、「値」のベクトルとは何ですか?

これらは、注意を計算して考えるのに役立つ抽象概念です。以下で注意がどのように計算されるかを読み進めると、これらの各ベクトルが果たす役割について知る必要があるほとんどすべてを知ることができます。
それらは、計算と思考に役立つ抽象化です。注意力の計算方法を読み続けると、これらの各ベクトルについて知る必要があることがわかります。

自己注意を計算する2番目のステップは、スコアを計算することです。この例の最初の単語「思考」の自己注意を計算しているとします。入力文の各単語をこの単語に対してスコアリングする必要があります。スコアは、特定の位置で単語をエンコードするときに、入力文の他の部分にどれだけ焦点を合わせるかを決定します。
自己注意を計算する2番目のステップは、スコアを計算することです。この例では、最初の単語「思考」の自己懸念を計算していると仮定します。この単語に基づいて、入力文の各単語にスコアを付ける必要があります。特定の場所で単語をエンコードすると、スコアによって、入力文の残りの部分にどれだけ焦点が当てられるかが決まります。

スコアは、クエリベクトルとスコアリングするそれぞれの単語のキーベクトルの内積をとることによって計算されます。したがって、位置#1の単語の自己注意を処理している場合、最初のスコアはq1とk1の内積になります。 2番目のスコアは、q1とk2の内積になります。
クエリベクトルの内積を、スコアリングした対応する単語のキーベクトルと照合することにより、スコアを計算します。したがって、位置#1の単語の自己注意を処理する場合、最初のスコアはq1とk1の内積になります。 2番目のスコアは、q1とk2の内積です。
画像
3番目と4番目のステップは、スコアを8で除算することです(論文で使用されているキーベクトルの次元の平方根–64。これにより、より安定した勾配が得られます。ここでは他の可能な値がありますが、これはデフォルト)、次に結果をsoftmax操作に渡します。 Softmaxはスコアを正規化して、すべてが正になり、合計が1になるようにします。
3番目と4番目のステップは、スコアを8で除算することです(論文で使用されているキーベクトルの次元の平方根-64。これにより、より安定した勾配が得られます。他の可能な値がある場合がありますが、これがデフォルトです。 )、次に結果をsoftmax操作に渡します。 Softmaxはスコアを正規化するため、それらはすべて正の数であり、合計は1になります。
画像
5番目のステップは、各値ベクトルにソフトマックススコアを掛けることです(それらを合計する準備として)。ここでの直感(直感)は、私たちが焦点を合わせたい単語の値をそのまま維持し、(たとえば、0.001のような小さな数字でそれらを氾濫させることによって)溺れさせることです。
5番目のステップは、各値ベクトルにソフトマックススコアを掛けることです(それらを追加する準備をします)。ここでの直感は、焦点を合わせたい単語の値を変更せずに維持し、無関係な単語を溺れさせることです(たとえば、0.001のような小さな数値を掛けることによって)。

6番目のステップは、重み付き値ベクトルを合計することです。これにより、この位置(最初の単語)で自己注意レイヤーの出力が生成されます。
6番目のステップは、加重値ベクトルを要約することです。これにより、この場所に(最初の単語の)セルフフォーカスレイヤーの出力が生成されます。
画像

自己注意の行列計算

最初のステップは、クエリ、キー、および値のマトリックスを計算することです。これを行うには、埋め込みを行列Xにパックし、トレーニングした重み行列(WQ、WK、WV)を掛けます。
最初のステップは、クエリ、キー、および値のマトリックスを計算することです。これを行うには、埋め込みを行列Xにラップし、トレーニング済みの重み行列(WQ、WK、WV)を掛けます。
画像
最後に、マトリックスを扱っているので、ステップ2から6を1つの式に凝縮して、自己注意層の出力を計算できます。
最後に、マトリックスで作業しているので、ステップ2から6を式に集中させて、セルフフォーカスレイヤーの出力を計算できます。
画像

多くの頭を持つ獣

この論文は、「多頭」注意と呼ばれるメカニズムを追加することにより、自己注意層をさらに洗練させました。これにより、次の2つの方法でアテンションレイヤーのパフォーマンスが向上します。
この記事では、「ロング」アテンションと呼ばれるメカニズムを追加することにより、セルフフォーカスレイヤーをさらに改良します。これにより、次の2つの方法で対象のレイヤーのパフォーマンスが向上します。

  1. これにより、さまざまな位置に焦点を合わせるモデルの機能が拡張されます。はい、上記の例では、z1には他のすべてのエンコーディングが少し含まれていますが、実際の単語自体が支配的である可能性があります。 「動物は疲れすぎて通りを渡らなかった」などの文章を翻訳する場合に役立ちます。「それ」がどの単語を指しているのかを知りたいと思います。
    これにより、モデルの機能が拡張され、さまざまな場所に焦点を合わせることができます。はい、上記の例では、z1には他のすべてのエンコーディングが少し含まれていますが、実際の単語自体が支配的である可能性があります。 「動物は疲れすぎて道路を横断していません」というフレーズを翻訳すると、「それ」がどの単語を指しているのかがわかります。これは便利です。

  2. これは、アテンションレイヤーに複数の「表現部分空間」を提供します。次に説明するように、マルチヘッドアテンションでは、クエリ/キー/値の重み行列のセットが1つだけでなく、複数あります(Transformerは8つのアテンションヘッドを使用するため、エンコーダー/デコーダーごとに8つのセットになります) 。これらの各セットはランダムに初期化されます。次に、トレーニング後、各セットを使用して、入力埋め込み(または下位のエンコーダー/デコーダーからのベクトル)を異なる表現部分空間に投影します。
    これは、注意層に複数の「表現部分空間」を与えます。次に説明するように、クエリ/キー/値の重み行列のセットが1つだけでなく、複数あります(Transformerは8つのアテンションヘッダーを使用するため、エンコーダー/デコーダーごとに8を設定することになります)。これらの各セットはランダムに初期化されます。次に、トレーニング後、各グループを使用して、入力埋め込み(または下位のエンコーダー/デコーダーからのベクトル)を異なる表現部分空間に投影します。
    画像
    上で概説したのと同じ自己注意計算を、異なる重み行列を使用して8回だけ実行すると、8つの異なるZ行列になります。
    上で概説したのと同じ自己懸念計算を実行すると、8つの異なる時間だけが異なる重み行列を使用し、最終的に8つの異なるZ行列になります。
    画像
    これは私たちに少し挑戦を残します。フィードフォワード層は、8つの行列を想定していません。つまり、単一の行列(各単語のベクトル)を想定しています。したがって、これらの8つを1つのマトリックスに凝縮する方法が必要です。
    これは私たちにいくつかの課題を残します。フィードフォワード層は、8つの行列を想定していません。つまり、単一の行列(各単語のベクトル)を想定しています。したがって、これらの8つを行列に圧縮する方法が必要です。

どうすればいいですか?行列を連結してから、追加の重み行列WOで乗算します。
私たちは何をしますか?行列を接続してから、別の重み行列WOを掛けます。
画像
多頭の自己注意については、これでほぼすべてです。かなりの数の行列だと思います。それらすべてを1つのビジュアルにまとめて、1か所で確認できるようにします。
これはすべて長期的な自己懸念についてです。これはマトリックスのごく一部であることに気づきました。それらすべてを1つのビジョンにまとめて、1か所で確認できるようにします。
画像
アテンションヘッドに触れたので、前の例に戻って、例文で「it」という単語をエンコードするときに、さまざまなアテンションヘッドがどこに焦点を合わせているかを確認しましょう。
注意の頭に触れたので、前の例に戻って、例文で「it」をコーディングしているため、さまざまな注意ポイントがどこに焦点を合わせているかを確認しましょう。 'このフレーズ:
画像
ただし、すべての注意の頭を画像に追加すると、解釈が難しくなる可能性があります。
しかし、私たちが絵にすべての注意を向けると、物事を理解するのが難しくなる可能性があります。
画像

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

これまで説明してきたように、モデルに欠けていることの1つは、入力シーケンス内の単語の順序を説明する方法です。
これまでのモデルに欠けていることの1つは、シーケンス内の語順を考慮する方法です。

これに対処するために、トランスフォーマーは各入力埋め込みにベクトルを追加します。これらのベクトルは、モデルが学習する特定のパターンに従います。これは、各単語の位置、またはシーケンス内の異なる単語間の距離を決定するのに役立ちます。ここでの直感は、これらの値を埋め込みに追加すると、Q / K / Vベクトルに投影された後、ドット積の注目中に、埋め込みベクトル間に意味のある距離が提供されるということです。
この問題を解決するために、トランスフォーマーは入力埋め込みごとにベクトルを追加します。これらのベクトルは、モデル学習の特定のパターンに従います。これは、各単語の位置、またはシーケンス内の異なる単語間の距離を決定するのに役立ちます。ここでの直感は、これらの値が埋め込みに追加され、Q / K / Vベクトルに投影されると、ドット積の注目中に、埋め込みベクトル間に意味のある距離が提供されるということです。
画像
埋め込みの次元が4であると仮定すると、実際の位置エンコーディングは次のようになります。
埋め込まれた次元が4であると仮定すると、実際の位置エンコーディングは次のようになります。
画像
このパターンはどのように見えるでしょうか?
このモデルはどのように見えるでしょうか?

次の図では、各行がベクトルの位置エンコーディングに対応しています。したがって、最初の行は、入力シーケンスの最初の単語の埋め込みに追加するベクトルになります。各行には512個の値が含まれ、それぞれの値は1〜-1です。パターンが見えるように色分けしています。
下の図では、各線の位置がベクトルに対応しています。したがって、最初の行は、入力シーケンスに埋め込まれた最初の単語に追加したベクトルになります。各行には512個の値が含まれています-各値の値は1〜-1です。パターンが見えるように色分けしました。
画像
位置エンコーディングの式は、論文(セクション3.5)に記載されています。 get_timing_signal_1d()で位置エンコーディングを生成するためのコードを見ることができます。これは、位置エンコーディングの唯一の可能な方法ではありません。ただし、これには、目に見えない長さのシーケンスにスケーリングできるという利点があります(たとえば、トレーニング済みモデルが、トレーニングセット内のどの文よりも長い文を翻訳するように求められた場合)。
位置コーディングの公式は、論文(セクション3.5)に記載されています。あなたはできる get_timing_signal_1d() ロケーションエンコーディングの生成に使用されるコードを見ました。これは、コードを配置するための唯一の可能な方法ではありません。ただし、目に見えないシーケンスの長さに拡張できるという利点があります(たとえば、文の翻訳を求められたモデルがトレーニングセットのどの文よりも長い場合)。

残差

先に進む前に言及する必要があるエンコーダーのアーキテクチャーの詳細の1つは、各エンコーダーの各サブレイヤー(自己注意、ffnn)の周囲に残りの接続があり、その後に レイヤーの正規化 ステップ。
続行する前に言及する必要があるエンコーダーアーキテクチャの詳細の1つは、各エンコーダーの各サブレイヤー(セルフノート、ffnn)の周囲に残りの接続があり、レイヤーの正規化ステップがあることです。
画像
自己注意に関連するベクトルとレイヤーノルム操作を視覚化すると、次のようになります。
セルフフォーカスに関連するベクトルとレイヤーの仕様操作を視覚化する場合は、次のようになります。
画像
これは、デコーダーのサブレイヤーにも当てはまります。 2つのスタックされたエンコーダーとデコーダーのトランスフォーマーを考えると、次のようになります。
これは、デコーダーのサブレイヤーにも当てはまります。積み重ねられたエンコーダーとデコーダーを備えた2つのトランスを考えると、次のようになります。
画像

デコーダー側

エンコーダー側のほとんどの概念について説明したので、基本的にデコーダーのコンポーネントがどのように機能するかを理解しました。しかし、それらがどのように連携するかを見てみましょう。
エンコーダーの概念のほとんどをカバーしたので、基本的にデコーダーのコンポーネントがどのように機能するかを理解しました。しかし、それらがどのように連携するかを見てみましょう。
画像
画像
次の手順は、トランスデコーダが出力を完了したことを示す特別な記号に達するまでプロセスを繰り返します。各ステップの出力は次のタイムステップで下部のデコーダーに送られ、デコーダーはエンコーダーと同じようにデコード結果をバブルアップします。また、エンコーダ入力で行ったのと同じように、これらのデコーダ入力に位置エンコーディングを埋め込んで追加し、各単語の位置を示します。
次の手順では、トランスデコーダが出力を完了したことを示す特別な記号に到達するまで、このプロセスを繰り返します。次のタイムステップでは、各ステップの出力が下部のデコーダーに送られ、デコーダーはエンコーダーのようにデコード結果をバブルします。エンコーダ入力の場合と同様に、これらのデコーダ入力に位置コードを埋め込んで追加し、各単語の位置を示します。
画像

デコーダーのセルフアテンションレイヤーは、エンコーダーのセルフアテンションレイヤーとは少し異なる方法で動作します。
デコーダーのセルフフォーカスレイヤーは、エンコーダーのセルフアテンションレイヤーとは少し異なる方法で動作します。

デコーダーでは、自己注意層は出力シーケンスの前の位置にのみ注意を向けることができます。これは、自己注意計算のsoftmaxステップの前に、将来の位置をマスクする(-infに設定する)ことによって行われます。
デコーダーでは、自己注意層のみが出力シーケンスの前の位置に焦点を合わせることができます。これは、自己懸念計算のsoftmaxステップの前に、将来の場所をマスクする(-infに設定する)ことによって行われます。

「Encoder-DecoderAttention」レイヤーは、その下のレイヤーからクエリマトリックスを作成し、エンコーダスタックの出力からKeys and Valuesマトリックスを取得することを除いて、マルチヘッドセルフアテンションと同じように機能します。
'Encoder-Decoder Note'レイヤーは、その下のレイヤーからクエリマトリックスを作成し、エンコーダスタックの出力からキーと値を取得することを除いて、マルチヘッドセルフアテンションと同じです。マトリックス。

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

デコーダスタックは、浮動小数点数のベクトルを出力します。どうやってそれを言葉に変えるのですか?これが最後の線形レイヤーの仕事であり、その後にSoftmaxレイヤーが続きます。
デコーダスタックは浮動小数点数ベクトルを出力します。どうやってそれを言葉に変えるのですか?これは、最後の線形層の作業であり、その後にSoftmax層が続きます。

線形層は、デコーダーのスタックによって生成されたベクトルを、ロジットベクトルと呼ばれるはるかに大きなベクトルに投影する単純な完全に接続されたニューラルネットワークです。
線形層は、スタックデコーダーによって生成されたベクトルをロゴベクトルと呼ばれるより大きなベクトルに投影する、単純で完全に接続されたニューラルネットワークです。

モデルが、トレーニングデータセットから学習した10,000個の一意の英語の単語(モデルの「出力語彙」)を知っていると仮定します。これにより、ロジットベクトルの幅が10,000セルになります。各セルは、一意の単語のスコアに対応します。これが、モデルの出力とそれに続く線形レイヤーの解釈方法です。
モデルが、トレーニングデータセットから学習された10,000個の一意の英語の単語(モデルの「出力語彙」)を知っていると仮定します。これにより、ロジットベクトルの幅が10,000セルになります。各セルは、一意の単語スコアに対応します。これは、モデルの出力を解釈し、次に線形レイヤーを解釈する方法です。

次に、softmax層は、それらのスコアを確率に変換します(すべて正、すべて合計で1.0になります)。確率が最も高いセルが選択され、それに関連付けられた単語がこのタイムステップの出力として生成されます。
次に、softmax層は、これらのスコアを確率に変換します(すべて正、合計で1.0になります)。確率が最も高いセルが選択され、それに関連付けられた単語がタイムステップの出力として取得されます。

画像

トレーニングの要約

トレーニング済みのTransformerを使用したフォワードパスプロセス全体について説明したので、モデルのトレーニングの直感を一瞥すると便利です。
Transformerの順伝播全体について説明したので、トレーニングモデルの直感を確認すると便利です。

トレーニング中、トレーニングされていないモデルはまったく同じフォワードパスを通過します。ただし、ラベル付きのトレーニングデータセットでトレーニングしているため、その出力を実際の正しい出力と比較できます。
トレーニング中、トレーニングを受けていないモデルは同じフォワードパスを通過します。ただし、マークされたトレーニングデータセットでトレーニングするため、その出力を実際の正しい出力と比較できます。

これを視覚化するために、出力語彙に6つの単語(「a」、「am」、「i」、「thanks」、「student」、「」(「文の終わり」の略))しか含まれていないと仮定します。
これを想像するために、出力語彙に6つの単語(「a」、「am」、「i」、「thanks」、「student」、「」(「文末の略」))しか含まれていないと仮定します。
画像
出力語彙を定義したら、同じ幅のベクトルを使用して、語彙の各単語を示すことができます。これは、ワンホットエンコーディングとも呼ばれます。したがって、たとえば、次のベクトルを使用して「am」という単語を示すことができます。
出力語彙を定義したら、同じ幅のベクトルを使用して、語彙の各単語を表すことができます。これは、シングルサーマルコーディングとも呼ばれます。たとえば、次のベクトルを使用して、単語「am」を示すことができます。
画像
この要約に続いて、モデルの損失関数について説明します。これは、トレーニングされた、できれば驚くほど正確なモデルに至るために、トレーニングフェーズ中に最適化するメトリックです。
確認した後、モデルの損失関数について説明します。これは、十分にトレーニングされた驚くほど正確なモデルを導くために、トレーニングフェーズで最適化した指標です。

損失関数

モデルをトレーニングしているとしましょう。これがトレーニングフェーズの最初のステップであり、「merci」を「thanks」に変換するという簡単な例でトレーニングしているとします。
モデルをトレーニングしているとします。これがトレーニングフェーズの最初のステップであり、その簡単な例をトレーニングしているとしましょう。「merci」を「thankyou」に翻訳します。

これが意味するのは、出力を「ありがとう」という単語を示す確率分布にすることです。ただし、このモデルはまだトレーニングされていないため、まだトレーニングされていない可能性があります。
これは、「ありがとう」という単語を示す確率分布を出力にする必要があることを意味します。ただし、このモデルはトレーニングされていないため、このような状況が発生する可能性はほとんどありません。
画像
2つの確率分布をどのように比較しますか?単純に一方を他方から減算します。詳細については、クロスエントロピーとカルバックライブラー発散を参照してください。
2つの確率分布をどのように比較しますか?単純に一方を他方から減算します。詳しくはご確認ください クロスエントロピーカルバック・ライブラー発散

ただし、これは単純化しすぎた例であることに注意してください。より現実的には、1語より長い文を使用します。例–入力:「jesuisétudiant」および期待される出力:「私は学生です」。これが実際に意味するのは、モデルに次のような確率分布を連続して出力させたいということです。
ただし、これは単純化された例であることに注意してください。より現実的には、1単語より長い文を使用します。例-次のように入力します: 'jesuisétudiant'および期待される出力: '私は学生です'。これは、モデルに確率分布を継続的に出力させたいことを意味します。ここで、

  • 各確率分布は、幅vocab_sizeのベクトルで表されます(おもちゃの例では6ですが、より現実的には3,000や10,000のような数値です)。
    各確率分布は、幅vocab_sizeのベクトルで表されます(おもちゃの例では6ですが、より現実的には3,000または10,000)
  • 最初の確率分布は、単語「i」に関連付けられたセルで最も高い確率を持ちます。
    最初の確率分布は、単語「i」に関連付けられたユニットで最も高い確率を持ちます。
  • 2番目の確率分布は、「am」という単語に関連付けられたセルで最も高い確率を持ちます。
    2番目の確率分布は、単語「am」に関連付けられたセルで最も高い確率を持ちます。
  • 以下同様に、5番目の出力分布が「」記号を示すまで、10,000要素の語彙からのセルも関連付けられています。
    以下同様に、5番目の出力分布が ''記号を表すまで、この記号には10,000要素の語彙に関連付けられたセルもあります。
    画像
    十分な大きさのデータセットで十分な時間モデルをトレーニングした後、生成された確率分布が次のようになることを期待します。
    十分に大きなデータセットで十分な時間モデルをトレーニングした後、次のような確率分布を作成します。
    画像
    ここで、モデルは一度に1つずつ出力を生成するため、モデルはその確率分布から最も確率の高い単語を選択し、残りを破棄していると想定できます。これを行う1つの方法です(欲張りデコードと呼ばれます)。別の方法は、たとえば上位2つの単語(たとえば、「I」と「a」)を保持し、次のステップでモデルを2回実行することです。1回目は最初の出力位置が単語「I」、および最初の出力位置が単語「me」であると仮定した場合、位置#1と#2の両方が保持されていることを考慮すると、どちらのバージョンでもエラーが少なくなります。ポジション#2と#3…などについてこれを繰り返します。この方法は「ビーム検索」と呼ばれ、この例では、beam_sizeが2であり(位置#1と#2のビームを計算した後の結果を比較したため)、top_beamsも2です(2つの単語を保持しているため)。これらは両方とも、実験できるハイパーパラメータです。
    ここで、モデルは一度に1つの出力を生成するため、モデルは確率分布から最も確率の高い単語を選択し、残りの単語を破棄すると想定できます。これは方法です(欲張りデコードと呼ばれます)。別の方法は、最初の2つの単語(たとえば、「I」と「a」)を保持し、次のステップでモデルを2回実行することです。最初の出力位置が単語「I」であると想定されると、別の想定が最初です出力位置は単語「me」です。 #1と#2の場所を考慮すると、どちらのバージョンが保持されるかによってエラーが少なくなります。この位置#2と#3を繰り返します...など。この方法は「ビームサーチ」と呼ばれます。この例では、beam_sizeは2であり(位置#1と#2のビームを計算した後の結果を比較したため)、top_beamsも2つです(2つ予約したため)。これらは、試すことができるハイパーパラメータです。

前進して変革する

これが、Transformerの主要な概念で氷を砕き始めるのに役立つ場所であることがわかったと思います。さらに深く知りたい場合は、次の手順をお勧めします。
これが、Transformerの主要な概念で行き詰まりを打開するのに役立つ場所であることがわかったと思います。もっと深く知りたい場合は、次のステップをお勧めします。