🐕

図解 Transformer——機能概観

2024/07/17に公開

序文

大型言語モデルであるChatGPTの登場により、私たちは自然言語処理(NLP)の新たな時代に突入しました。この時代において、Transformerアーキテクチャは非常に重要な役割を果たしています。その特異性は、技術的な進歩だけでなく、言語モデルの潜在能力に対する理解を根本的に変えた点にあります。

Transformerは深層学習アーキテクチャの一つで、注意機構を使用することにより、深層学習NLP翻訳モデルの性能を大幅に向上させます。この概念が初めて提唱されたのは、「Attention is all you need」という論文です。この登場は、従来のシーケンスモデリング手法(例:長短期記憶ネットワークやゲート付きリカレントユニット)から、より効率的で複雑な言語パターンを捉える新たなフレームワークへの転換を示しています。このフレームワークは、モデルが入力シーケンスのすべての要素を同時に処理し、それらの間の複雑な関係を捉えることを可能にします。この包括的な注意機構により、Transformerは長いシーケンスを処理する際に、従来の手法に比べてより効率的かつ正確に処理できます。

Transformerのこれらの特徴は、言語処理能力を向上させただけでなく、複雑な言語パターンを学習する能力も大幅に強化しました。その結果、GPTシリーズのようなモデルは、自然言語を理解し生成するだけでなく、テキスト要約、質問応答、翻訳などのさまざまなタスクにおいて優れたパフォーマンスを発揮するようになりました。この多機能性と柔軟性の向上は、自然言語を処理し理解するためのかつてない可能性を提供します。

この記事は、2023年初頭に翻訳されたKetan Doshiのブログに基づくTransformerに関するシリーズ記事の一部です。著者はこのシリーズ記事の中で、Transformerの基本知識、アーキテクチャ、およびその内部の動作方式を紹介し、Transformerの内部詳細を深く分析しています。

シリーズ記事は全部で四つのパートから成り、この記事はその第一部であり、Transformerの全体的なアーキテクチャと動作過程を紹介しています。

Transformerとは何か?

Transformerアーキテクチャは、順序性を持つテキストデータの処理に優れています。これにより、テキストシーケンスを入力として受け取り、別のテキストシーケンスを出力として生成します。例えば、入力された英語の文をスペイン語に翻訳することができます。

Transformerのコア部分は、エンコーダ層とデコーダ層のスタックで構成されています。混乱を避けるため、単一の層をエンコーダまたはデコーダと呼び、それぞれのグループをエンコーダスタックおよびデコーダスタックと呼びます(原文ではEncoder stackおよびDecoder stack)。

エンコーダスタックおよびデコーダスタックの前には、それぞれ対応する埋め込み層があり、デコーダスタックの後には最終的な出力を生成するための出力層があります。

エンコーダスタック内の各エンコーダの構造は同じです。デコーダスタックも同様です。それぞれの構造は次の通りです:

エンコーダ:一般に2つのサブレイヤーを持ちます。シーケンス内の異なる単語間の関係を計算するための自己注意機構(self-attention)と、前方伝播層(feed-forward)を含みます。

デコーダ:一般に3つのサブレイヤーを持ちます。自己注意機構(self-attention)、前方伝播層(feed-forward)、およびエンコーダ-デコーダ注意機構(Decoder-Encoder self-attention)を含みます。

各エンコーダおよびデコーダには、それぞれの層に固有の重みのセットがあります。

エンコーダとデコーダの自己注意機構(self-attention)、前方伝播層(feed-forward)、およびデコーダ内のエンコーダ-デコーダ注意機構(Decoder-Encoder self-attention)は、すべて残差接続と正則化層を持っています。

Transformerに基づく多くの変種が存在します。いくつかのTransformerアーキテクチャはデコーダ構造を持たず、エンコーダのみに依存しています。

Attentionは何をしているのか?

Transformerの画期的なパフォーマンスは、注意機構の使用にあります。

単語を処理する際、注意機構によりモデルはその単語と密接に関連する他の単語に注目できます。

例えば、以下の英語の文では、「ball」は「blue」や「hold」と密接に関連しています。一方で、「boy」は「blue」と関連していません。

Transformerは、入力シーケンス内の各単語を他の単語と関連付けることで、自己注意機構(self-attention)を形成します。

以下の2つの文を考えてみましょう:

The cat drank the milk because it was hungry.
The cat drank the milk because it was sweet.

最初の文では、単語「it」は「cat」を指しています。2つ目の文では、「it」は「milk」を指しています。モデルが「it」という単語を処理する際、自己注意機構により「it」の意味についての追加情報が提供され、適切な単語に関連付けることができます。

Transformerは各単語に注意スコアを割り当てることで、文の意図や意味に関する微妙な違いを処理できるようにしています。

「it」を処理する際、最初のスコアは「cat」を強調し、2つ目のスコアは「milk」を強調します。したがって、モデルが「it」をデコードする際、つまりそれを他の言語の単語に翻訳する際、「cat」や「milk」の意味的側面をターゲット言語に取り入れます。

Transformerの訓練プロセス

Transformerの訓練と推論には微妙な違いがあります。

まずは訓練プロセスを見てみましょう。各訓練データは次の2つの部分で構成されています:

入力シーケンス、または「ソースシーケンス」(例えば、翻訳問題では「You are welcome」が入力シーケンスです)

出力シーケンス、または「ターゲットシーケンス」(上述の翻訳問題では、「De nada」が「You are welcome」のスペイン語訳であり、これが出力シーケンスです)

Transformerの訓練目標は、訓練データ中のソースシーケンスとターゲットシーケンス間の規則性を学習し、テストや実際のタスクで与えられたソースシーケンスに対してターゲットシーケンスを生成することです。

以下の図に示されているように、Transformerの訓練プロセスは次の6つのステップに大別されます:

入力シーケンス(src_seq)は、最初のエンコーダに送られる前に、位置エンコーディングを伴って埋め込みに変換され、単語埋め込み表現(src_position_embed)を生成し、その後、最初のエンコーダに送られます。

各エンコーダで構成されるエンコーダスタックは、順次、ステップ1の出力を処理し、入力シーケンスのエンコーディング表現(enc_outputs)を生成します。

右側のデコーダスタックでは、ターゲットシーケンスに文頭記号を追加し、位置エンコーディングを伴って埋め込みに変換し、単語埋め込み表現(tgt_position_embed)を生成し、その後、最初のデコーダに送られます。

各デコーダで構成されるデコーダスタックは、ステップ3の単語埋め込み表現(tgt_position_embed)をエンコーダスタックのエンコーディング表現(enc_outputs)と共に処理し、ターゲットシーケンスのデコーディング表現(dec_outputs)を生成します。

出力層はこれを単語の確率および最終的な出力シーケンス(out_seq)に変換します。

損失関数は、この出力シーケンス(out_seq)を訓練データ中のターゲットシーケンス(tgt_seq)と比較します。この損失を用いて勾配を生成し、逆伝播の過程でモデルを訓練します。

Transformerの推論プロセス

推論プロセスでは、入力シーケンスのみがあり、ターゲットシーケンスはデコーダに入力されません。Transformer推論の目的は、入力シーケンスのみに基づいてターゲットシーケンスを生成することです。

したがって、Seq2Seqモデルと同様に、各タイムステップで現在のタイムステップの出力を生成し、次のタイムステップでは前のタイムステップの出力シーケンスをデコーダに入力として渡します。このプロセスは、文末記号に達するまで続きます。

しかし、Seq2Seqモデルとの違いは、各タイムステップでこれまでに生成された全体の出力シーケンスを再入力する点にあります。これは、最後の単語だけを入力するのではなく、現在までに生成された全体の出力シーケンスを再入力することです。

推論プロセスのデータフローは次のとおりです:

最初のステップは訓練プロセスと同じです。入力シーケンス(src_seq)は、位置エンコーディングを伴って埋め込みに変換され、単語埋め込み表現(src_position_embed)を生成し、その後、最初のエンコーダに送られます。

第二のステップも訓練プロセスと同じです。各エンコーダで構成されるエンコーダスタックは、順次、ステップ1の出力を処理し、入力シーケンスのエンコーディング表現(enc_outputs)を生成します。

第三のステップからは異なります。最初のタイムステップでは、ターゲットシーケンスの代わりに、文頭記号だけの空シーケンスを使用します。この空シーケンスは位置エンコーディングを伴って埋め込みに変換され(start_position_embed)、デコーダスタックの最初のデコーダに送られます。

デコーダスタックは、第三ステップの空シーケンス埋め込み表現(start_position_embed)とエンコーダスタックのエンコーディング表現(enc_outputs)を共に処理し、ターゲットシーケンスの最初の単語のデコーディング表現(step1_dec_outputs)を生成します。

出力層はこれ(step1_dec_outputs)を単語の確率および最初のターゲット単語(step1_tgt_seq)に変換します。

このステップで生成されたターゲット単語をデコーダ入力シーケンスの第二のタイムステップの位置に埋め込みます。第二のタイムステップでは、デコーダ入力シーケンスは文頭記号と最初のタイムステップで生成されたターゲット単語を含みます。

第三のステップに戻り、新しいデコーダシーケンスをモデルに入力します。次に、出力された第二の単語を取り、それをデコーダシーケンスに追加します。このステップを繰り返し、文末記号が予測されるまで続けます。エンコーダシーケンスは各反復ごとに変わらないため、毎回ステップ1とステップ2を繰り返す必要はありません。

Teacher Forcing

訓練時にデコーダに全体のターゲットシーケンスを入力する方法をTeacher Forcingと呼びます。

訓練時には、推論時と同じ方法を使用することも可能です。つまり、各タイムステップでTransformerを実行し、出力シーケンスの最後の単語を取り出し、それをデコーダの入力に追加して、次の反復でデコーダに送ります。最終的に、文末記号が予測されると、損失関数が生成された出力シーケンスとターゲットシーケンスを比較してネットワークを訓練します。

しかし、この訓練メカニズムは訓練時間が長くなるだけでなく、モデルの訓練難易度も増加します。最初の単語の予測が間違っている場合、その間違った予測に基づいて次の単語を予測することになり、誤りが連鎖していきます。

これに対して、ターゲットシーケンスをデコーダに提供することは、ヒントを与えるようなものです。たとえ最初の単語の予測が誤っていても、次のタイムステップでは正しい最初の単語を使用して次の単語を予測するため、誤りの累積を避けることができます。

さらに、このメカニズムにより、Transformerは訓練段階で全ての単語を並行して出力でき、ループを必要としないため、訓練速度が大幅に向上します。

Transformerの応用シーン

Transformerの用途は非常に広範で、言語モデルやテキスト分類などのほとんどのNLPタスクに使用できます。Seq2Seqモデルとして、機械翻訳、テキスト要約、質問応答、固有表現抽出、音声認識などのアプリケーションによく使用されます。

異なる問題に対して、異なるTransformerアーキテクチャがあります。基本的なエンコーダ層はこれらのアーキテクチャの共通構成要素として使用され、解決する問題に応じて特定のアプリケーション「ヘッド」が存在します。

Transformer分類器アーキテクチャ

以下のように、感情分析プログラムでは、テキストファイルを入力として受け取ります。分類ヘッドがTransformerの出力を受け取り、予測されたカテゴリラベル(例:ポジティブまたはネガティブな感情)を生成します。

Transformer言語モデルアーキテクチャ

言語モデルアーキテクチャは、テキスト文のような入力シーケンスの初期部分を入力として受け取り、その後の文を予測することで新しいテキストを生成します。言語モデルアーキテクチャヘッドは、Transformerの出力を入力として受け取り、語彙内の各単語に対する確率出力を生成します。確率が最も高い単語が次の単語として予測出力されます。

RNNタイプのアーキテクチャと比較して、なぜTransformerの方が効果的なのか?

RNNやLSTM、GRUも以前はNLPでよく使われていたアーキテクチャでしたが、Transformerの登場により状況が変わりました。

しかし、RNNには2つの制限があります:

長文中で離れている単語間の長距離依存関係が課題となります。

RNNは各タイムステップで入力シーケンスの1単語を処理します。これは、タイムステップT-1の計算が完了する前にタイムステップTの計算を行えないことを意味します(つまり並列計算ができません)。これにより、訓練と推論の速度が低下します。

一方、CNN(畳み込みニューラルネットワーク)では、すべての出力を並列に計算できます。これにより、畳み込みの速度が大幅に向上します。しかし、CNNも長距離依存関係の処理には制限があります:

畳み込み層では、カーネルサイズに十分近い部分の相互作用しかできません。離れた項目間の相互作用には、層を多く積み重ねた深いネットワークが必要です。

Transformerアーキテクチャはこれらの制限を解決します。TransformerはRNNを排除し、完全にAttentionの利点に依存しています:

シーケンス中のすべての単語を並行して処理することで、計算速度を大幅に向上させます。

入力シーケンス中の単語間の距離は重要ではありません。Transformerは隣接単語と離れた単語間の依存関係を同様に効率的に計算できます。

まとめ:

本シリーズの最初の記事として、この記事ではTransformerの全体アーキテクチャ、および訓練と推論のプロセスについて紹介しました。次の記事では、Transformerの各層のデータフローと、各層の原理と役割について詳しく解説します。

Discussion