機械学習におけるtransformer

2020年09月29日

機械学習におけるtransformerとは

機械学習におけるTransformerモデルは、自然言語処理における業界標準になっています。例えば、高性能モデルGPT3 Transformerのデモやそのトレーニングにかかる時間や費用を詳述した記事などは、目にしたことがあるでしょう。さらに、自然言語処理以外でも、Transformerはコンピュータビジョン音声合成の分野で活用されています。本記事では、Transformerの全体的な仕組みについて説明していきます。

これまで言語モデリングや機械翻訳における最新のアプローチは、LSTMやGRUアーキテクチャにAttentionを加えたものでした。とはいえ、これらのアーキテクチャの主な課題は、本来、再帰型であるため、シーケンスが長くなるとランタイムが増加することです。つまり、これらのアーキテクチャは文の各単語を順次処理するので、文が長くなると、全体のランタイムが増加してしまうのです。

『Attention is All You Need』という論文で最初に紹介されたTransformerアーキテクチャは、この再帰構造を使わず、Attentionメカニズム(注意機構)のみを使用して入力と出力の間のグローバルな依存関係を捉えます。

以下は、Transformer全体の仕組みを表した図をこの論文から抜粋したものです。

https://arxiv.org/pdf/1706.03762.pdf

Transformerモデルはほぼ全ての自然言語処理タスクを実行できます。言語モデリングや翻訳、分類に利用でき、問題の逐次性を取り除くことによって迅速にタスクを実行します。Transformerを機械翻訳に利用すれば、一つの言語から別の言語に変換し、分類問題では、適切な出力層を利用してクラス確率を提供します。

ネットワークの最終出力層はタスクによって異なりますが、Transformerの基本的な構造はどのタスクでもかなり似通っています。本記事では、機械翻訳を例にとって詳しく見てみましょう。

下の図は、Transformerが翻訳を実行する仕組みを外側から見たものです。このモデルは英語の文を入力として受け取り、ドイツ語の文を返します。

Transformerは基本的にエンコーダ層とデコーダ層をスタックしたモデルです。エンコーダ層の役割は、Attentionメカニズム(注意機構)を利用して英語の文を数値形式に変換することです。一方、デコーダはエンコーダ層で変換された情報を利用して、ドイツ語の翻訳に変換することを目的とします。下の図では、Transformerが英語の文を入力として受け取り、六つのエンコーダ層を使って変換します。次に、最終のエンコーダ層からの出力が各デコーダ層に渡され、英語からドイツ語に翻訳されます。

 

エンコーダ

エンコーダスタックは六つのエンコーダ層が積み重ねられています。ただし、ここでは論文通り、六つのエンコーダ層を使っていますが、Transformerの新しいバージョンではより多くの層を利用していることを覚えておいてください。スタック内の各エンコーダは基本的に次の二つの主要な層から構成されています。

  • 複数ヘッドの自己注意層(Multi-head self-attention Layer)
  • 位置単位の順伝播ネットワーク(position-wise fully connected feed-forward network)

これらについては次のセクションでご説明いたします。現時点では、エンコーダ層に注意層(Attention)と位置単位の順伝播ネットワークが含まれることを覚えておいてください。

エンコーダ層は、下図のように入力がSxDの形状であることを想定しています。(Sはソース文、つまり英語文の長さを示し、Dは、ネットワークで重みを学習することができる埋め込みの次元を示します。)本記事では、Dにはデフォルトとして512を使用しますが、Sはバッチ内の文の最大長になります。そのため、通常、Sはバッチによって異なります。

エンコーダスタックは、各層が順番に積み重ねられた構造をしているので、次のエンコーダ層へのデータの受け渡しを容易にするため、各エンコーダ層の出力は入力と同じ次元にする必要があります。そこで、出力もSxDの形状になります。

 

自己注意層(Self-attention Layer)

上の図は非常に複雑に見えますが、実際のところ、理解するのは簡単です。では、ご説明いたしましょう。

ディープラーニングは基本的に多くの行列計算から構成されていますが、この層でもたくさんのインテリジェントな行列計算が行われています。自己注意層は、Query(W_q)、Key(W_k)、Value(W_v)の三つの重み行列で初期化されています。各行列のサイズは(Dxd)であり、論文ではdが64に設定されています。機械学習では、これら行列の重みを学習していきます。

最初の計算(図の計算1)では、入力にそれぞれQuery、Key、Value行列を掛け合わせて行列Q、K、Vを作ります。

ここまでは単に行列の掛け算を行なっているだけのように思えますが、二番目の計算に進めば、それらの掛け算を行った理由が理解できるようになるはずです。では、ソフトマックス関数の出力について考えてみましょう。まず、QとKᵀ行列を掛けてサイズ(SxS)の行列を取得し、スカラーであるdの平方根で割ります。次にソフトマックス関数を利用して行の合計を1にします。

結果として得られるSxS行列は直感的に、各単語が別の単語にどの程度寄与しているかを表していると考えられます。例えば、次のようになります。

寄与度を示すSxS行列の取得後、この行列に文のValue行列(Sxd)を掛けるとSxd(4×64)の形状の行列が得られます。この操作で実際に行っているのは、「quick」のような単語埋め込みベクトルを0.75 x(quickの埋め込み)および0.2 x(foxの埋め込み)に置き換えることです。結果として得られる単語「quick」の出力自体にAttentionが埋め込まれています。

この層の出力は(Sxd)次元なので、次のエンコーダの入力として渡す前に、出力をD=512に変更する必要があることに注意しましょう。

このような自己注意層(self-attention layer)が多数並列して使用されるので、複数ヘッドと呼ばれます。自己注意層の数hは論文と同様、8にしてあります。入力Xは並列された多数の自己注意層を通過し、それぞれが(Sxd) = 4×64の形状のz行列になります。次にこれら8(h)の行列を連結し、サイズDxDの線形の最終出力層Woを適用します。

連結演算では、SxD(4x(64×8) = 4×512)のサイズになります。この出力にWoを掛けると、最終的な出力Zは望ましい形状のSxD(4×512)になります。h、d、 Dの関係はh x d = Dになっています。

これで4×512の形状の出力Zを取得できました。しかし、出力Zは、別のエンコーダに入力される前に順伝播ネットワーク(feed-forward network)を通過します。

 

位置単位の順伝播ネットワーク(Position-wise fully connected feed-forward network)

複数ヘッドの自己注意層(multi-head self-attention layer)を理解していれば、順伝播ネットワーク(feed-forward network)を理解するのはかなり簡単です。順伝播ネットワークとは、単に出力Zに対して様々な線形層とドロップアウト層を適用するだけです。そのため、ここでも行列の掛け算が多数行われます。

順伝播ネットワークは出力Zの各位置に対して並列して適用される(各位置とは、単語と考えることができます)ので、位置単位の順伝播ネットワークと呼ばれます。順伝播ネットワークも重みを共有するので、ソース文の長さは重要ではありません。重みを共有していない場合、ソース文の最大長に基づいて多くのネットワークを初期化しなければならないので、現実的ではないからです。

 

位置エンコーディング(positional encoding)

シーケンスの順序を利用できるようにするためには、シーケンス内のトークンの相対位置または絶対位置に関する何らかの情報を与える必要があります。このためには、エンコーダとデコーダ両方のスタック下位の入力埋め込みに「位置エンコーディング」を追加します。位置エンコーディングは、埋め込みと同様、二つを合計できるように、同じ次元Dである必要があります。

 

論文の著者は、正弦関数(sin)と余弦関数(cos)を利用して、様々な位置を示す位置エンコーディングを作成しました。

この数式によって2D行列が生成され、最初のエンコーダステップに進む埋め込みベクトルに追加されます。位置エンコーディングとは、ネットワークが単語の位置を取得できるように文に追加される定数行列にすぎません。

上の図は、最初のエンコーダへの入力に追加される位置エンコーディング行列を可視化したヒートマップです。最初の300個の位置(左)と最初の3000個の位置(右)のヒートマップを表示しています。各単語の位置を理解するためTransformerに提供される位置エンコーディングには明確なパターンがあることがわかります。また、位置エンコーディングは正弦関数および余弦関数を利用しているので、非常に高い位置の位置埋め込みもかなりうまく行えることが二番目の図からわかります。

 

追加と正規化

エンコーダの説明の際、話を簡単にするため、触れなかったことが一つあります。エンコーダのアーキテクチャ(デコーダのアーキテクチャも同じですが)には、resnet50に似た残差スキップ接続が含まれています。そのため、論文で紹介された正確なエンコーダのアーキテクチャは次のようになります。簡単に言うと、残差スキップ接続は、ディープニューラルネットワーク内のよりずっと長い距離で情報伝達するために役立ちます。組織内で上司だけでなく、上司の上司にも情報の受け渡しができる状態と考えるとよいでしょう。

 

デコーダのアーキテクチャ

デコーダスタックは六つのデコーダ層から成り、スタック内の各デコーダは次の三つの層から構成されています。

  • マスク付き複数ヘッドの自己注意層(masked multi-head self-attention layer)
  • 複数ヘッドの自己注意層(multi-head self-attention layer)
  • 位置単位の順伝播ネットワーク(position-wise fully connected feed-forward network)

エンコーダと同様、デコーダにも位置エンコーディングとスキップ接続が含まれています。複数ヘッドの自己注意層と順伝播ネットワークに関しては既にご説明したので、さっそくエンコーダと異なる部分について見ていきましょう。

この場合、Transformerは、入力単語および条件・予測の基となる英語文を与えられて次の単語を予測する条件付き言語モデルと考えることができます。 

このようなモデルに学習させるためには、まず開始トークン(<s>)を入力し、英語文に基づいて最初の単語を予測させます。次に、その予測の正誤に基づいて重みを変更し、開始トークンと最初の単語(<s> der)を入力します。モデルが二番目の単語を予測すると、重みを再度調節します。既におわかりのように、これは本質的に逐次的なプロセスです。

Transformerのデコーダはこのようにして学習しますが、重要なのは、順番に処理する必要がないということです。その代わり、学習の際は、マスキングを利用してこの計算を行い、出力文全体を受け取ります。(ただし、<s>トークンを前に追加することによって出力文は右にシフトしています。)また、予測時にはネットワークに出力を与えないことに注意してください。

 

マスク付き複数ヘッドの自己注意層(masked multi-head self-attention layer)

デコーダにはマスク付き複数ヘッドの自己注意層(masked multi-head self-attention Layer)が含まれています。つまり、「シフトさせた出力(デコーダへの入力)」にマスクをかけて、ネットワークが次に来る単語を見ることができないようにします。そうでないと、学習中、簡単にその単語をコピーできてしまうからです。 

以前ご説明したように、注意層ではquery(Q)とkeys(K)の内積をdの平方根で割ってからソフトマックス層に渡します。マスク付き注意層では、ソフトマックスに渡す前の行列(TxTの形状)をマスキング行列に加えます。 

そこで、マスク付き注意層では関数が次のように変化します。

いくつかのステップに分けて考えてみましょう。(TxT)の形状のQxK/sqrt(d)行列は次のようになります。ソフトマックスが適用されていないので数値は大きくなる可能性があります。

上記の行列にソフトマックを適用し、それにvalue行列Vを掛けると、「schnelle」という単語は、「braune」と「fuchs」から構成されていることになります。それを避けるため、マスク行列を加えると次のようになります。

e^{-inf} = 0で、「schnelle」に続く全ての位置は0に変換されています。この行列にvalue行列Vを掛けると、デコーダを通過するZベクトル内の「schnelle」の位置に相当するベクトルには、次に来る「braune」や「fuchs」の情報が一切含まれていません。このようにしてTransformerは「シフトさせた出力文」を一度に受け取るので、逐次的に学習しないのです。これはかなり大きなメリットであると言えるでしょう。 

 

B) 複数ヘッドの注意層(Multi-Headed Attention Layer)

デコーダアーキテクチャでは、エンコーダの出力であるZベクトルがデコーダの複数ヘッド注意層に渡されます。エンコーダの最終出力であるZには特別な名前がつけられており、しばしばmemoryと呼ばれます。注意層はこのエンコーダの出力と下位からデコーダ内を流れるデータ(シフトさせた出力)の両方を入力として受け取り、注意機構を利用します。Queryベクトル(Q)はデコーダ内を流れるデータから作成され、Key(K)とValue(V)ベクトルはエンコーダの出力に由来します。 

下位からの出力は既にマスクがつけられているので、デコーダ内の各位置がValueベクトルの全ての位置に対応できます。そのため、生成される全ての単語位置においてデコーダは英語文全体にアクセスすることが可能です。 

以下は単一の注意層です。

重みの計算を行った数値をご覧ください。また、Zベクトルの形状を見て、重み行列がこれまでどの次元においてもターゲットやソース文の長さを使用していなかったことを確認してください。

ここまで全ての行列の計算では通常、形状が消去されます。例えば、上の計算2では、S次元が消去されます。論文の著者が、機械学習のバッチ選択の際、パディングを最小限に抑えたバッチについて言及していたのはこのためです。バッチでは全てのソース文は同じ長さであり、異なるバッチはソース文の長さが異なる可能性があります。

複数ヘッドの注意層の次はスキップ接続と順伝播層にデータが渡されます。

 

出力ヘッド

Transformerの作業が終了したら、デコーダ出力の上位にタスク固有の出力ヘッドを追加します。上位にいくつかの線形層やソフトマックスを加えて、ドイツ語語彙の全ての単語の確率を取得すればよいのです。これは次のようになります。

ご覧の通り、確率を生成することができます。これまで、Transformerアーキテクチャにおけるフォワードパスの仕組みについてご説明しました。次に、これらニューラルネットアーキテクチャのトレーニング方法について見ていきましょう。

 

トレーニング

これまでご説明した構造を俯瞰すると、次のようになります。

英語の文と「シフトさせた出力文」を与えてフォワードパスを行うと、ドイツ語の語彙に対する確率を取得できます。そこで、ターゲットが適切なドイツ語になっている可能性がある場合は、交差エントロピーのような損失関数を利用することができるはずです。そして、分類タスクの場合と同じようにAdam Optimizerを利用して学習させればドイツ語の翻訳が取得できます。

論文の著者は次のように、別のオプティマイザと損失を利用していますが、KLダイバージェンス損失と学習率のスケジューリングに関する以下の二つのセクションはご自由に省略してください。これらはパフォーマンスをより向上させるために行うだけであって、Transformerのアーキテクチャ固有の部分ではありません。

 

ラベルスムージングを利用したKLダイバージェンス

KLダイバージェンスとは、分布Pが分布Qで近似される際に生じる情報量の損失のことです。KLダイバージェンスを使用するときは、モデルから生成される確率(Q)を用いてターゲット分布(P)を推定しようとします。学習では、この情報量の損失を最小化します。

ラベルスムージングを使用しない場合、KLダイバージェンスは交差エントロピーと全く同じです。例えば、以下のような二つの分布があるとします。

KLダイバージェンスの数式は単に-logq(oder)を提供するだけであり、これは交差エントロピー誤差です。

論文の著者はα = 0.1としてラベルスムージングを利用しているので、KLダイバージェンスは交差エントロピーと一致しません。つまり、ターゲット分布で出力値が1-αで置き換えられ、残りの0.1が全ての単語に分散されています。これは、モデルが自信過剰にならないようにするためであると著者は述べています。

損失関数にターゲットを1として与えると、正しいラベルは完全に正しく、そうでない場合は誤りであるということに疑いを持ちません。しかし、語彙は本質的に標準化されていないターゲットです。例えば、greatの代わりにgoodを使うこともできるでしょう。ラベルに少し混乱を加えてモデルが厳格すぎないようにしているのです。

 

Adam Optimizerを利用した学習率のスケジューリング

著者らは学習率スケジューラーを利用してウォームアップステップまで学習率を上げ、それから以下の関数を使って学習率を下げています。β¹ = 0.9、β² = 0.98としてAdam Optimizerを使用しています。これは特別興味深い操作ではなく、単なる学習の選択肢です。

この時点で、モデルは生成モデルであり、予測時に出力ターゲットベクトルを持っていないので、生成的な方法で予測する必要があります。そのため、予測は依然として逐次的です。

このモデルは区分的予測を行います。元の論文では、予測にビームサーチを利用していますが、区分的予測について説明するためには貪欲法でも構わないので、上記の例は、貪欲法の仕組みを表しています。以下のようなプロセスが実行されます。

  • 英語文全体をエンコーダの入力とし、開始トークン<st>だけを「シフトさせた出力(デコーダへの入力)」にして、フォワードパスを行います。
  • モデルが次の単語を予測します。—der
  • 次に、英語文全体をエンコーダの入力とし、前に予測された単語を「シフトさせた出力(デコーダへの入力= <st> der)」に加えて、フォワードパスを行います。
  • モデルが次の単語を予測します。schnelle
  • 英語文全体をエンコーダの入力とし<st> der schnelleを「シフトさせた出力(デコーダへの入力)」にしてフォワードパスを行います。
  • モデルが終了トークン</s>を予測するか、最大数のトークン(定義可能なもの)を生成するまでこれを続けます。これは、翻訳が無限に繰り返されてモデルが破損しないようにするためです。 

 

ビームサーチ

ビームサーチの考え方は本質的に上記の方法と似ています。ただし、ビームサーチでは、生成された最も高い確率の単語一つではなく、最も高い確率の単語二つに注目します。

従って、例えば、英語文全体をエンコーダの入力とし、開始トークンだけを「シフトさせた出力」にすると、最も高い確率の単語二つ、つまりi(p=0.6)とder(p=0.3)を取得できます。次に両方の出力シーケンス、つまり<s> i<s> derの出力モデルを生成し、生成される次のトップワードの確率を見ます。例えば、<s> iの次の予測単語の確率が(p=0.05)であり、<s> derの次の単語の確率が(p=0.5)であるならば、文全体の確率の合計が最大化されるように<s> iのシーケンスを捨て、代わりに<s> derを使用します。(<s> der next_word_to_der p = 0.3+0.5であり、<s> i next_word_to__i p = 0.6+0.05だからです。)このプロセスを繰り返すことにより、最も高い確率の文を取得できます。ここでは、トップワードを二つ利用したので、ビームサーチのビームサイズは2です。論文ではサイズ4のビームサーチが使用されています。

※ 本記事は2020年9月9日、弊社英語ブログに掲載された寄稿記事に基づいたものです

 

ライオンブリッジのAI教師データサービス

当社は20年以上に渡るAIプロジェクトの実績を持ち、データ作成・アノテーションサービスを提供しております。データサイエンティストや言語学者を含み、100万人のアノテーターが登録されているので、大規模なAIプロジェクトも迅速且つ正確に仕上げます。アノテーターは秘密保持契約に署名することが義務付けられており、データ保護のためにオンサイトスタッフやリモートスタッフを派遣し、アノテーターにお客様ご指定のツールを利用してもらうこともできます。必要に応じて案件に特化した秘密保持契約も作成できるので、データの安全性も保証しております。ご相談・無料トライアルはこちらから。

AI向け教師データを提供し、研究開発をサポートいたします。

メディア掲載結果

    AI・機械学習の最新情報をお届けします!

    Lionbridge AIのブログで紹介している事例記事やトレンドニュースといったビジネスに役立つ情報はもちろん、オープンデータセット集なども合わせてメール配信しております。