ディープラーニングブログ

Mine is Deeper than yours!

論文解説 Attention Is All You Need (Transformer)

こんにちは Ryobot (りょぼっと) です.

本紙は RNN や CNN を使わず Attention のみ使用したニューラル機械翻訳 Transformer を提案している.
わずかな訓練で圧倒的な State-of-the-Art を達成し,華麗にタイトル回収した.

また注意を非常にシンプルな数式に一般化したうえで,加法注意・内積注意・ソースターゲット注意・自己注意に分類した.このうち自己注意はかなり汎用的かつ強力な手法であり他のあらゆるニューラルネットに転用できる.

WMT'14 の BLEU スコアは英仏: 41.0, 英独: 28.4 で第 1 位

f:id:Ryobot:20171221163853p:plain:w700

左側がエンコーダ,右側がデコーダである.それぞれ灰色のブロックを 6 個スタックしている ({N=6}).

  • エンコーダ: [自己注意, 位置毎の FFN] のブロックを 6 層スタック
  • デコーダ: [(マスキング付き) 自己注意, ソースターゲット注意, 位置毎の FFN] のブロックを 6 層スタック

ブロック内は残差接続 (Residual Connection) と層正規化 (Layer Normalization) を適応する.

Transformer の詳細に入る前に,注意について再考したい.

注意は辞書オブジェクト

一般的な Encoder-Decoder の注意はエンコーダの隠れ層を {Source}デコーダの隠れ層を {Target} として次式によって表される.

{Attention(Target, \, Source) = Softmax(Target \cdot Source^T) \cdot Source}

より一般化すると {Target}{query} (検索クエリ) と見做し,{Source}{Key}{Value} に分離する.

{Attention(query, \, Key, \, Value) = Softmax(query \cdot Key^T) \cdot Value}

これ以降,イニシャルが小文字の {query, \, key, \, value} (ないし {q, \, k, \, v}) はベクトル,大文字の {Query, \, Key, \, Value} (ないし {Q, \, K, \, V}) は行列 (ベクトルの配列) を表す.

f:id:Ryobot:20171221163903p:plain:w700

この時 {Key}{Value} は各 {key} と各 {value} が一対一対応する key-value ペアの配列,つまり辞書オブジェクトとして機能する.

{query}{Key}内積{query} と各 {key} の類似度を測り,softmax で正規化した注意の重み (Attention Weight) は {query} に一致した {key} の位置を表現する.注意の重みと {Value}内積{key} の位置に対応する {value} を加重和として取り出す操作である.

f:id:Ryobot:20171221163943p:plain:w700

つまり注意とは {query} (検索クエリ) に一致する {key} を索引し,対応する {value} を取り出す操作であり,これは辞書オブジェクトの機能と同じである.例えば一般的な Encoder-Decoder の注意は,エンコーダのすべての隠れ層 (情報源) {Value} から {query} に関連する隠れ層 (情報) {value} を注意の重みの加重和として取り出すことである.

{query} の配列 {Query} が与えられれば,その数だけ key-value ペアの配列から {value} を取り出す.

Memory を Key と Value に分離する意味

key-value ペアの配列の初出は End-To-End Memory Network [Sukhbaatar, 2015] であるが,{Key}{Input}{Value}{Output} (両方を合わせて {Memory}) と表記しており,辞書オブジェクトという認識はなかった.

初めて辞書オブジェクトと認識されたのは Key-Value Memory Networks [Miller, 2016] である.

f:id:Ryobot:20171221164543p:plain:w700

Key-Value Memory Networks では key-value ペアを文脈 (e.g. 知識ベースや文献) を記憶として格納する一般的な手法だと説明している.{Memory}{Key}{Value} に分離することで {key}{value} 間の非自明な変換によって高い表現力が得られるという.ここでいう非自明な変換とは,例えば「{key} を入力して {value} を予測する学習器」を容易には作れない程度に複雑な (予測不可能な) 変換という意味である.

その後,言語モデルでも同じ認識の手法 [Daniluk, 2017] が提案されている.

f:id:Ryobot:20171221164537p:plain:w700

加法注意と内積注意

注意は「注意の重みの求め方」によって加法注意と内積注意に区分される.

f:id:Ryobot:20171221164307p:plain:w700

加法注意 (Additive Attention) [Bahdanau, 2014] は注意の重みを隠れ層 1 つのフィードフォワードネットワークで求める.

内積注意 (Dot-Product Attention, Multiplicative Attention) [Luong, 2015] は注意の重みを内積で求める.一般に内積注意の方がパラメータが必要なく (故にメモリ効率も良く) 高速である.Transformer はこちらを使う.

ソースターゲット注意と自己注意

注意は「入力がどこから来るのか」によってソースターゲット注意と自己注意に区分される.

f:id:Ryobot:20171221164314p:plain:w700

ソースターゲット注意 (Source-Target-Attention) では {Key}{Value} はエンコーダの隠れ層 ({Source}) から来て,{Query}デコーダの隠れ層 ({Target}) から来る.一般的な Encoder-Decoder の注意はこちらである.前述のとおり {Source}{Memory} とも呼ばれ,{Key}{Value}{Memory} を 2 つに分離したものと解釈できる.

自己注意 (Self-Attention) では {Query, \, Key, \, Value} は全て同じ場所 ({Self}) から来る.例えばエンコーダの {Query, \, Key, \, Value} はすべて下の隠れ層から来る.

自己注意はある位置の出力を求めるのに下の隠れ層の全ての位置を参照できる.これは局所的な位置しか参照できない畳み込み層より優れた利点である.

f:id:Ryobot:20171221164550p:plain:w700

従来の注意モデルでは 1 度の注意に 1 つの {query} しか与えられない (e.g. RNNsearch, MemN2N).しかし,デコーダ{Query} が同時に与えられる場合,もしくは {Query} が同時に与えられる自己注意では,それぞれ同時に注意を実行し,{query} と同数の出力ベクトルをまとめて得られる.

Transformer

f:id:Ryobot:20171221164529p:plain:w700

モデルは至ってシンプルである.

  • エンコーダ: [自己注意, 位置毎の FFN] のブロックを 6 層スタック
  • デコーダ: [(マスキング付き) 自己注意, ソースターゲット注意, 位置毎の FFN] のブロックを 6 層スタック

ネットワーク内の特徴表現は [単語列の長さ x 各単語の次元数] の行列で表される.注意の層を除いて 0 階の各単語はバッチ学習の各標本のように独立して処理される.

訓練時のデコーダは自己回帰を使用せず,全ターゲット単語を同時に入力,全ターゲット単語を同時に予測する.ただし予測すべきターゲット単語の情報が予測前のデコーダにリークしないように自己注意にマスクをかけている (ie, Masked Decoder).評価/推論時は自己回帰で単語列を生成する.

縮小付き内積注意

Transformer では内積注意を縮小付き内積注意 (Scaled Dot-Product Attention) と呼称する.通常の内積注意と同じく {query} をもとに key-value ペアの配列から加重和として {value} を取り出す操作であるが,{Q}{K}内積をスケーリング因子 {\sqrt{d_{k}}} で除算する.

また,{query} の配列は 1 つの行列 {Q} にまとめて同時に内積注意を計算する (従来通り {key}{value} の配列も {K, \, V} にまとめる).

縮小付き内積注意は次式によって表される.

f:id:Ryobot:20171221164431p:plain:w380

{d_{k}} が小さい場合,スケーリング因子がなくても内積注意は加法注意と同様に機能する.しかし {d_{k}} が大きい場合,スケーリング因子がないと加法注意の方がうまく機能する.内積注意は内積が大きくなりすぎて,逆伝播の softmax の勾配が極端に小さくなることが原因である.

Scaled Dot-Product Attention Multi-Head Attention
f:id:Ryobot:20171221164515p:plain:w300 f:id:Ryobot:20171221164455p:plain:w400

Mask (option) はデコーダの予測すべきターゲット単語の情報が予測前のデコーダーにリークしないように自己注意にかけるマスクである (Softmax への入力のうち自己回帰の予測前の位置に対応する部分を {1} で埋める).

複数ヘッドの注意

Transformer では縮小付き内積注意を 1 つのヘッドと見做し,複数ヘッドを並列化した複数ヘッドの注意 (Multi-Head Attention) を使用する.ヘッド数 {h=8} と各ヘッドの次元数 {d_{model} \, / \, h = 64}トレードオフなので合計のパラメータ数はヘッド数に依らず均一である.

{d_{model} = 512} 次元の {Q, \, K, \, V} を用いて単一の内積注意を計算する代わりに,{Q, \, K, \, V} をそれぞれ {h=8} 回異なる重み行列 {W_i^Q, \, W_i^K, \, W_i^V}{d_{k}, \, d_{k}, \, d_{v} = 64} 次元に線形写像して {h=8} 個の内積注意を計算する.各内積注意の {d_{v} = 64} 次元の出力は連結 (concatenate) して重み行列 {W^o}{d_{model} = 512} 次元に線形写像する.

複数ヘッドの注意は次式によって表される.

f:id:Ryobot:20171221164416p:plain:w500 f:id:Ryobot:20171221164426p:plain:w620

ここで {d_{model} = 512} はすべての層の出力の次元数,{d_{k} = 64}{Q}{K} の次元数,{d_{v} = 64}{V} の次元数である.

実験的に複数ヘッドの注意の方が単一の注意より性能が高いことが判明した.複数ヘッドの注意は各ヘッドが異なる位置の異なる部分空間を処理すると解釈でき,単一の注意は加算がこれを妨げてしまう.

位置毎のフィードフォワードネットワーク

位置毎のフィードフォワードネットワーク (Position-wise Feed-Forward Network, FFN) はその名のとおり単語列の位置毎に独立して処理する FFN である.

FFN は次式によって表される.

f:id:Ryobot:20171221164438p:plain:w350

ReLU で活性化する {d_{ff} = 2048} 次元の中間層と {d_{model} = 512} 次元の出力層から成る 2 層の全結合ニューラルネットワークである.

位置エンコーディング

Transformer は RNN や CNN を使用しないので単語列の語順 (単語の相対的ないし絶対的な位置) の情報を追加する必要がある.

本手法では入力の埋め込み行列に位置エンコーディング (Positional Encoding) の行列 {PE} を要素ごとに加算する.

位置エンコーディングの行列 {PE} の各成分は次式によって表される.

f:id:Ryobot:20171221164434p:plain:w350

ここで {pos} は単語の位置,{i} は成分の次元である.位置エンコーディングの各次元は波長が {2 \pi} から {10000 \cdot 2 \pi}幾何学的に伸びる正弦波に対応する.

位置エンコーディングを可視化すると次図のとおり (ソース).

f:id:Ryobot:20171221163928p:plain:w700

横軸が単語の位置 (0 ~ 99),縦軸が成分の次元 (0 ~ 511),濃淡が加算する値 (-1 ~ 1) である.

位置エンコーディングの初出は End-To-End Memory Network (MemN2N) である.質疑応答では複数の入力文を扱うため,入力文の時系列をエンコードする時間エンコーディング (Temporal Encoding) も使用される.

実験

実装は Tensor2Tensor である.

データセットは WMT'14 の英仏 (36M 対訳文) と英独 (4.5M 対訳文) を使用する.希少語に対応するためにソース言語とターゲット言語で語彙を共有した 32000 ピースの Wordpiece (サブワード) を使用する.

8 枚の P100 GPU で訓練した.後述の基本モデル (base) は 1 訓練ステップに約 0.4 秒かかり,全 10 万ステップに 12 時間かかる.また,巨大モデル (big) は 1 訓練ステップに 1 秒かかり,全 30 万ステップに 3.5 日かかる.

最適化は Adam ({\beta_{1} = 0.9, \, \beta_{2} = 0.98, \, \epsilon = 10^{-9}}) を使用し,訓練過程で学習率を変化させる.

f:id:Ryobot:20171221164446p:plain:w640

この式により,最初の {warmup\_steps = 4000} ステップは学習率が線形に増加し,その後は学習率が逆平方根に比例して減少する.{d_{model}^{-0.5}} は約 {0.044} であり,折り返し時の {min} は約 {0.016} である.

訓練時は 3 種類の正規化を使用する.

f:id:Ryobot:20171221164441p:plain:w450

埋め込み層の辞書行列とソフトマックス層の行列は重み共有する [Press, 2016].

評価時はビーム探索 (ビーム幅 {4},長さのペナルティ {\alpha = 0.6}) を使用する.

結果

実験結果は次図のとおり.

f:id:Ryobot:20171221164409p:plain:w600

WMT'14 英独は巨大モデル (big) が 28.4 の BLEU スコアを達成した (以前の SOTA より 2.0 高い).基本モデル (base) であっても,非常に少ない訓練コストでアンサンブル学習を含む以前の SOTA より性能が優れている.

WMT'14 英仏は巨大モデル (big) が 41.0 の BLEU スコアを達成し,シングルモデルの以前の SOTA に比べて 1/4 の訓練コストであるにも関わらず性能が優れている.

各要素の重要度を測るために,基本モデル (base) に様々な変更を加えて性能を評価した.また巨大モデル (big) も評価した.

f:id:Ryobot:20171221164326p:plain:w700

計算量を一定に保ちながら注意ヘッドの数と {K}{V} の次元数を変更したところ,単一のヘッドは最高の設定に比べて BLEU スコアが 0.9 も悪く,逆にヘッドが多すぎても性能が落ちた.

自己注意の可視化

複数ヘッドの自己注意 (エンコーダの第 5 ブロック) を可視化したところ,各ヘッドが構文や意味構造を処理することが判明した.

{query}‘making’ のとき 8 個のヘッドの自己注意は次図のとおり.

f:id:Ryobot:20171221163913p:plain:w700

上段は {Q},下段は {V} である.8 色のマーカーの濃淡は 8 個のヘッドの注意の重みの大きさであり,線の色は注意の重みが最大のヘッドを示している.
この例では多くのヘッドが ‘making’ という動詞の長期依存を捉え,‘making...more difficult’ という句を形成している.

{query}‘its’ のとき 2 個のヘッドの自己注意は次図のとおり.

f:id:Ryobot:20171221163919p:plain:w700

紫色の濃淡は 1 個目のヘッド,茶色の濃淡は 2 個目のヘッドの注意の重みの大きさである.
この例では ‘its’ という代名詞が ‘Law’ という名詞を指すという照応関係を形成している.また,注意の重みが集中している.

自己注意

自己注意の起源は Yoshua Bengio の研究グループが提案した文章の埋め込みベクトルを求める手法である.

ネガポジ判定用の文を埋め込んだ結果は次のとおり.赤いマーカーの濃淡は注意の重み (Attention Weight) の大きさである.

f:id:Ryobot:20171221163936p:plain:w700

各単語の埋め込みベクトルを {h_i},自己注意への入力を {H} とする.

f:id:Ryobot:20171221164356p:plain:w200

注意の重み {A} は入力 {H} を用いて次式によって表される.

f:id:Ryobot:20171221164400p:plain:w310

ここで {W_{s1}, \, W_{s2}} は重み行列である.
入力 {H} から得られた注意の重み {A} と入力 {H}内積して文章の埋め込みベクトル {M} を求める.

f:id:Ryobot:20171221164404p:plain:w105

つまり,自己注意は入力 {H} を 2 つに複製 (コピー) し,一方の分岐に任意の関数を適応して注意の重み {A} を求め,分岐を統合 (ie, 内積) する手法であると言える.

ここで全結合と自己注意を比較したい.

順伝播 逆伝播
全結合 {Out = W \cdot In} {GradIn = W^{T} \cdot GradOut}
自己注意 {Out = f(In^{T}) \cdot In} {GradIn = (f'(In^{T})^{T} \cdot In^{T} + f(In^{T})^{T}) \cdot GradOut}

全結合は「重み」と「入力」の内積であり,自己注意は「注意の重み」と「入力」の内積である.

自己注意と他のネットワーク

自己注意層と他のネットワーク (リカレント層と畳み込み層) を比較する.

  1. Complexity per Layer: 1 層あたりの合計の計算複雑性 (複雑性が低いほどスケールアップしやすい)
  2. Sequential Operations: 系列を処理する最小の操作回数 (操作回数が少ないほど並列化しやすい)
  3. Maximum Path Length: 任意の入力位置と出力位置を結ぶパスの最大経路長 (パスが短いほど長距離依存を学びやすい)

f:id:Ryobot:20171221164338p:plain:w600

ここで {n} は単語列の長さ,{d} は各単語の次元数,{k} は畳み込みのカーネルサイズ,{r} は制約自己注意の近傍のサイズである.これらはオーダーが小さいほど優れている.

自己注意層の注意の重みは単語列の長さ {n} の 2 乗オーダーなので {O(n^2 \cdot d)} の複雑性がある.一方,リカレント層の重み行列は次元数 {d} の 2 乗オーダーなので {O(n \cdot d^2)} の複雑性がある.
一般的に {n} < {d} なので,自己注意層はリカレント層より高速である.

自己注意層や畳み込み層は一定の操作回数で処理 (すべての位置を接続) できるが,リカレント層は {O(n)} のタイムステップ操作が必要である.

単一の畳み込み層は {k} < {n} なので入出力位置の全ペアを接続しない.通常の畳み込み層ないし拡張畳み込み層 (Dilated Convolution) を使用して全ペアを接続するには,それぞれ {O(n/k)}{O(log_{k}(n))} の層をスタックする必要がある.
制約自己注意は出力位置を中心とするサイズ {r} の近傍に位置する入力単語列のみ計算するので,複雑性が小さくなる代わりに最大経路長が {O(n/r)} に増大する.

自己注意 ≒ ILSVRC 2017 優勝モデル「圧搾と励起」

自己注意は画像認識の分野でも高い性能が確認されている.

自己注意は同じ場所から来た入力を 2 つに複製し,一方 (もしくは両方) の分岐に任意の関数を適応して「注意の重み」を求め,分岐を統合 (ie, 内積アダマール積) する手法と解釈できる.

ImageNet で高い性能を発揮した「圧搾と励起ネットワーク」と「残差注意ネットワーク」は自己注意と同じ構造をしている.

Squeeze-and-Excitation Network Residual Attention Network
f:id:Ryobot:20171221164521p:plain:w300 f:id:Ryobot:20171221164501p:plain:w400

圧搾と励起ネットワーク (SENet, Squeeze and Excitation Network) は「どのチャネルを重視するか」という注意の重みを求めてチャネル方向にアダマール積する.注意の重みは「グローバルな情報をチャネルの次元数のベクトルに埋め込む Squeeze」と「ベクトルを再調整する Excitation」から求める.

残差注意ネットワーク (RAN, Residual Attention Network) は「特徴マップのどの部分を注視するか」という注意の重みを求めてアダマール積する.注意の重みは「特徴マップを縮小して文脈を求める bottom-up」と「文脈から各ピクセルの強弱を求める top-down」から求める.

CIFAR と ImageNet のエラー率 SOTA を比較する.

Method CIFAR-10 CIFAR-100 ImageNet Top-1 ImageNet Top-5
RAN (Attention-92) 4.99 21.71 19.5 4.8
RAN (Attention-452) 3.90 20.45 - -
SENet - - 17.28 3.79
Shake-Shake 2.86 15.85 - -
ShakeDrop 2.31 12.19 - -

両者のトップは直接比較できないが,畳み込み層の確率的な混合や消去・データ拡張も強いっぽい (ソース).

自己回帰を使わない Transformer

訓練・推論時ともに自己回帰を使わず高速に翻訳できる Transformer である.モデルは [自己注意, (位置エンコーディング付き) 自己注意, ソースターゲット注意, 位置毎の FFN] のブロックを {N} 層スタックしている.

エンコーダの出力が「エンコーダの入力文からデコーダの入力文にコピーする各単語の数」を求めている (ie, Fertility Prediction).よってデコーダは自己回帰を使用せず予め決まった数の単語を生成する.

f:id:Ryobot:20171221164347p:plain:w700

DeepL Translator

深層学習はデータ量とマシンパワーで殴るのが正解?

DeepL が衝撃的なプレスリリースを公開した.あまりに BLEU スコアが高すぎて Transformer が霞んで見える.
Google 翻訳より高性能だったので登場時は Google 社内で大問題になったらしい.

f:id:Ryobot:20171221164320p:plain:w700

DeepL Translator の開発元は対訳文検索エンジン Linguee (2009~) を運営しており,Linguee からクロールした 10 億文で訓練している.大規模コーパスだと言われる WMT'14 英仏 3000 万文,英独 450 万文と比べても非常に巨大な訓練データである.

また,5.1 petaFLOPS (世界ランキング 23 位相当) のスパコンを所有している (PFN の 1024 GPU よりも高火力).すごい.

論文は未公開だが,おそらく巨大な Transformer に近いモデルを使用していると推察される.

残念ながら DeepL Translator は日英翻訳を提供していない.ただし Linguee は日英対訳文を大量に所有しているので今後対応する可能性はある.

また,特許庁NICT が共同で 3.5 億文の日英対訳データセット (JPO コーパス) を公開している.大規模データの殴り合いが好きな方は申請してみると良さそう.