トランスフォーマーのテキスト埋め込み
1. 概要
このチュートリアルでは、トランスフォーマーを分析して、トランスフォーマーがテキストをどのように表現するかについて直感的に理解します。 次に、BERTという名前の非常にクールなモデルと、それを使用してテキストのより豊富なベクトル表現を取得する方法について学習します。
以下の内容を理解するには、一般的なディープラーニングとリカレントニューラルネットワークに関する基本的な知識が必要です。
さぁ、始めよう!
2. 変圧器とは何ですか?
トランスフォーマーは、高度なアテンションメカニズムでシーケンス全体を処理できる大きなエンコーダー-デコーダーモデルです。
トランスフォーマー以前に使用されていた最も高度なアーキテクチャは、 LSTM /GRUを使用したリカレントニューラルネットワークでした。
ただし、これらのアーキテクチャには次の問題があります。
- 彼らは本当に長いシーケンスに苦労しています(LSTMおよびGRUユニットを使用しているにもかかわらず)
- それらのシーケンシャルな性質はいかなる種類の並列計算も許可しないため、それらはかなり遅いです
トランスフォーマーの動作は異なります。
- シーケンス全体で機能します。これにより、長距離の依存関係を学習できます。
- アーキテクチャの一部を並行して処理できるため、トレーニングが大幅に高速化されます
それらは人気のある論文AttentionIs All You Need で発表され、そこで提案された新しいアテンションモデルにちなんでそのように名付けられました。
3. 変圧器の解剖
3.1. 全体的なアーキテクチャ
「私の仕立て屋は豊富です」を英語からスペイン語に翻訳したいとします。 次に、トランスフォーマーは次のようになります。
前述のように、これは大きなエンコーダー-デコーダーモデルであり、入力シーケンスが大きなエンコードブロックに入り、トークンごとに豊富な埋め込みを取得します。これにより、デコードブロックにフィードして出力が取得されます。
したがって、前の図は次のようになります。
現在、各エンコーディング/デコーディングブロックには、実際には多くのスタックされたエンコーダ/デコーダが含まれています。 このように、初期レイヤーはより基本的なパターンをキャプチャしますが、最後のレイヤーは畳み込みネットワークと同様に、より洗練されたパターンを検出できます。
ご覧のとおり、最後のエンコーダー出力はすべてのデコーダーで使用されます。
3.2. 入力
エンコーダーは、テキストではなくベクトルで直接操作できます。 では、これらのベクトルをどのように取得するのでしょうか。
テキストは、固定語彙の一部であるトークンに変換する必要があります。
その後、トークンは、word2vecやその他のなどの固定表現を使用して埋め込みベクトルに変換されます。
しかし、シーケンスを一度に処理しているので、シーケンス内のトークンの位置をどのように知ることができますか?この問題に対処するために、
これらのベクトルは、エンコーダーによって消費される準備ができています。
3.3. エンコーダスタック
エンコーダーは、シーケンス内のトークンごとに1つのベクトルを受け取り、は、入力シーケンスと同じ形状のトークンごとに新しいベクトルを返します。
直感的には、エンコーダーは同じ入力ベクトルを返しますが、より複雑な情報で「強化」されています。
したがって、今のところ、トークンごとに1つのベクトルを受け取り、トークンごとに1つのベクトルを返すブラックボックスがあります。
ボックスを開いて、中に何が入っているか見てみましょう。
エンコーダーの最初のレイヤーは自己注意レイヤーであり、はエンコーダーの最も重要な部分です。 このレイヤーは、関連するトークンがどれだけ離れていても、同じシーケンスでそれらを検出できます。
たとえば、次の文では、「猫はマットの上にいます。 「それはたくさんの食べ物を食べました」、「それ」はマットではなく猫を指します。したがって、注意メカニズムはトークン「それ」の処理でトークン「猫」を計量します。
アテンションレイヤーはシーケンス全体を必要とするため、プロセスのこの部分はシーケンシャルです。
次に、「Add&Normalize」レイヤーを見つけます。これは、入力シーケンスに自己注意出力を追加し、それを正規化します。 正規化ステップではシーケンス全体が必要になるため、処理のこの部分もシーケンシャルです。
その後、各トークンはフィードフォワードニューラルネットワークによって処理されます。これは、並行して処理できるステップです。
最後に、フィードフォワードステップの入力と出力を使用して、別のAdd&Normalizeステップが適用されます。
次の図では、エンコーダー内の順次(灰色)および並列(オレンジ)のステップの分布を確認できます。
現在のエンコーダ入力が処理され、次の入力が生成されます。最後のエンコーダの場合を除き、その出力はエンコーディングスタック全体の出力と見なされます。
以下のアニメーションは、プロセスを示しています。
3.4. デコーダースタック
デコーダーはほとんどエンコーダーですが、追加のエンコーダー-デコーダーアテンションレイヤーがあります。
すべてのデコーダーの入力は次のとおりです。
- 以前に生成されたシーケンス
- エンコーダーの出力
ブラックボックスとして見ると、これは次のようになります。
デコーダーの内部を分析してみましょう。
最初のレイヤーも自己注意レイヤーであるため、実行はシーケンシャルです。 シーケンス全体がないため、デコーダーの自己注意レイヤーはエンコーダーのレイヤーとは異なります。
出力シーケンスはトークンごとに作成されるため、位置「 t」、でトークンを処理しているときは、最初から前の位置までのシーケンスしかありません。
その後、すでにおなじみの「追加と正規化」レイヤーができます。
次のステップは、デコーダーとの違いを生むステップです。エンコーダー-デコーダーアテンションレイヤーです。
この注意メカニズムは、入力シーケンスのどのトークンが現在の出力トークンにより関連性があるかについての洞察を提供します。
このステップは順次実行され、その後に「追加と正規化」レイヤーが続きます。
最後に、フィードフォワード層(並列化可能)と、それに続く「追加と正規化」層もあります。
ご覧のとおり、ほとんどのデコーダー処理は順次(灰色)であり、1つのレイヤーのみを並列(オレンジ色)で処理できます。
現在のデコーダー入力が処理され、次のデコーダーにフィードする出力が生成されます。
最後のデコーダーは出力レイヤーに接続され(これについてはすぐに説明します)、次の出力トークンを生成します。 生成されたトークンが「文の終わり」を意味する特別なトークンになるまでプロセスが続行されます。
このアニメーションは、デコーダープロセスを要約したものです。
3.5. 出力
デコーダーは、処理される位置の前にトークンの出力ベクトルのリストを生成することを学びました。 したがって、処理されて同様のシーケンスが生成されますが、意味的にはよりリッチになります。
それらのトークンがすでに生成されたシーケンスを表す場合、次のトークンをどのように生成しますか?
デコーダースタックは、floatのベクトルを出力します。 このベクトルは線形層に接続されています。完全に接続されたニューラルネットワークは、出力ベクトルを語彙と同じサイズの大きなベクトルに投影します。 そのベクトルは「ロジット」ベクトルと呼ばれ、語彙の各トークンのスコアが含まれています。
最後に、スコアが確率に変換されるように、そのレイヤーはsoftmaxレイヤーに接続されます。 このようにして、すべてのトークンがシーケンスの次の確率になる確率を含むベクトルが得られます。 私たちがしなければならないのは、確率ベクトルで最も高い確率でトークンを取得することです。
それを図で見てみましょう:
4. BERT
4.1. 説明
BERTは、事前にトレーニングされたTransformerエンコーダースタックです。
これは、トレーニングの労力をほとんどかけずに、特定のタスクに合わせてモデルを微調整できるため、NLPの最大の成果の1つでした。
これは、画像処理の事前トレーニング済みモデルに相当します。これにより、より基本的な機能を学習するための最大のトレーニング作業がすでに提供されているため、トレーニングをあまり行わなくても新しいオブジェクトを分類できます。
同様に、BERTの出力の上にいくつかの密なレイヤーを追加し、異なる言語ドメインで分類子を作成することができます。 語彙、構文、言語モデルなどの違いに適応するには時間がかかりますが、基本的な学習はすでにモデルに含まれています。
4.2. BERTの動作方法
BERTを使用するには、2つの特別なトークン[CLS]と[SEP]を含む語彙が必要です。
最初の入力トークンは、「Classification」を表す特別な[CLS]トークンである必要があり、シーケンスは、「Separator」を表すトークン[SEP]で終了する必要があります。
BERTは常にベクトルの固定シーケンス(通常のサイズは512)を受け取るため、シーケンスが短い場合はシーケンスがどこで終了するかを示す必要があることに注意してください。
次の図の例を参照してください。
4.3. テキストの埋め込み
各トークンを表すベクトルが必要な場合は、エンコーディングスタックブロックによって生成された対応する出力ベクトルを使用できます(上の図の「y」ベクトル)
シーケンス全体を表すベクトルが必要な場合は、次の3つの戦略に従うことができます。
- [CLS]トークン出力ベクトルを使用する
- トークンベクトル間に平均プーリングを適用する
- トークンベクトル間に最大プーリングを適用する
デフォルトの戦略は最初の戦略ですが、他の2つは他のタスクに最適であると示唆している論文もあります。
5. 結論
このチュートリアルでは、トランスフォーマーとは何か、その構成要素、および高度な注意モデルのおかげでトランスフォーマーが非常にうまく機能する理由を学びました。
最後に、BERTとは何か、それを使用してテキスト埋め込みベクトルを取得する方法について簡単に説明しました。