DEVELOPER’s BLOG
技術ブログ
【論文】"Attention is all you need"の解説
Attention は "Attention is all you need" (Vaswani et al, 2017)で一躍有名になった手法ですが、実はこの論文の前からあった概念です。今回はこのAttentionの技術について、またこの論文について解説していきたいと思います。
1 Attentionの概念
Attentionとは、「注意」とあるように、画像や文章の特定の部分に注意を向けるよう、学習させていく方法です。人間の場合を考えてみましょう。私たちが何かを見るとき、全ての部分を同じように観察しているわけではありません。犬の絵があれば、「犬の顔」「犬の手足」「犬の尻尾」を認識して犬だと識別できるのであって、毛の一本一本や肋骨の形に注目している人は少ないでしょう。これと同じことを機械にさせることができれば、より人間に近い形で画像や文章を認識することができます。これがAttentionの一番の動機であり定義の一つです。
具体的にこれがどのようにモデルに表現されているかを知るには、まずSeq2Seqモデルを少し理解するのが良いと思います。
1-1 Seq2Seq モデル
Seq2Seqモデルは文章解析のために作られたモデルで、Encoderと呼ばれる入力を処理する部分と、Decoderと呼ばれる出力を処理する部分に分かれています (Sutskever, 2014)。従来のニューラルネットワークでは、元となる文章をまとめて機械に取り込むので、画像などの情報は処理できても、文章や会話のような順番(sequence)が重要となる入力に関しては上手く学習することができませんでした。そこで、入力の順番の情報も出力に反映させられうようにSeq2Seqが開発されました。
具体的には、EncoderとDecoderにRNNの一種であるLSTMを使います。詳しくはLSTMの記事を読んで頂けると早いですが、sequenceを処理できるRNNの中でも、多少距離が開いていても対応できるLSTMを使うことで、最大限に入力sequenceの情報を出力に反映させることができます。

1-2 Attentionモデル
しかし、Seq2Seqには大きな限界があります。それは、入力の情報は結局最後には一つにまとめられて、固定された大きさのベクトルとして出力に引き渡される、という点です。これを解決し、さらに柔軟なモデルにするために、Attentionが開発されました(Bahdanau 2015)。言葉では分かりにくいので、具体的に図と数式で見ていきましょう。

まず、従来のSeq2Seqのように各単語ごとにencoder(青)とdecoder(赤)からマシンの状態(state)を出力します。そして、推測したい言葉(target)から計算された出力(ht)を全てのencoder出力(hs)と組み合わせ、関連度(a_t)を算出します。

このscoreの出し方は様々あり、後述のtransformerモデルの中では内積が使われています。
次に、この関連度でencoderに重りをつけ、「文脈」(context)を割り出します。

そして、もう一度Decoderのtargetと文脈を組み合わせて、decoderの隠れ層の最終出力を決定します。

最後に、このdecoderの結果を用いて最終出力を決定します。

ここで鍵なのが、attentionの度合いを決定するa_tが毎回更新される、という点で、Seq2Seqにはない柔軟性を取り入れることに成功した、というところです。データのどこにattentionを向けるのか、機械に学習させることで、より早く、高い精度を達成することができます。
2 Attention is all you needのモデル
では、Attention is all you need (Vaswani, 2017)について見ていきましょう。上で触れたように、attention自体はこれ以前からある概念ですが、この論文の革新的なところは、余分な部分を取り除き、attentionのみで学習しても、高い精度がでる、という点でした。以下、論文で実装されているtransformerモデルについて解説したいと思います。
2-1 モデルの仕組み
モデルの中心にあるのはattentionなので、元データ(memory)と検索をかけたい入力(input)の関連度を計算します。 逆に言うと、それしかしません。
下の図で見てみましょう。memoryをkeyとvalueに分けるという工夫以外は、基本的にattention_weightを算出し、valueと組み合わせているだけです。以前のように先にRNNを通したりする必要はないのです。Attentionの仕組み自体は上で解説しているので、数式などは省略しますが、順番に見ていきましょう。
2-1-1 input, memory
入力はinputとmemoryの二つに分けられています。それぞれtensorで、shapeは[batch_size, length, depth]となっています。例として、

というデータがあったとします。この場合inputlength=4, memorylength=3になります。 実際、自然言語等のデータを使う場合、多少の下処理が必要になってきます。
まず、文章をいくつかのトークンに区切り、さらにそれを数値に変換していきます。

これでnumpy arrayに変換すれば、処理が可能になります。
2-1-2 query, key, value

ここで先ほどの入力がquery, key, valueというattentionの中心になる情報に変換されます。queryはinputからくる、「検索をかけたいもの」になります。上の例でいうと、「猫」というのが検索をかけたいものであり、できればそれと関連する言葉が「結果」として出てきてほしい、ということになります。keyはこの検索をかけるときに、memory内のトークンと検索をかけるqueryがどの程度近いのかを図るための索引のようなものです。そして、keyの索引を参考に、対応する適切なvalueをアウトプットします。
なぜ、わざわざmemoryをkeyとvalueに分けるのでしょうか。元となった論文Miiler et al, 2016 によると、memoryを二つに分けることで、keyとvalueの間の非自明な変換によって高い表現力が得られる、ということです。つまり、keyとvalueの関係性が我々に理解のできないようなものであっても、うまく対応できるのです。
2-1-3 attention weight
上記のqueryとkeyから、attention weightと呼ばれる、関連度を計算していきます。この重みが大きいと、query中の言葉とkey中の言葉の関連度が高い、ということになります。

まず、queryとkeyの関連度を取ります。上の図では内積をとっていますが、これは内積注意(Dot-Product Attention)と呼ばれる手法で、Attention is all you need内で使われている手法になります。他にも、加法注意(Additive Attention)と呼ばれるものもあり、その場合はqueryとkeyをFFN(Feed Forward Network)に通してattention weightを求めます。一般的に内積注意の方がFFNのパラメーターを調整する必要がなく、処理も速いと言われています。
次に、内積をsoftmaxにかけます。これは一つのqueryに対してweightの合計が1.0になるようにするためです。Softmax関数は入力に大きな値があるとgradientが0に近くなり、学習が遅れてしまいます。そこで、queryとkeyの次元が大きいほどlogitが大きくなることに注目して、queryの大きさを次元に従って小さくすることが一般的です。具体的には、
 と調整します。
2-1-4 output
最後に、このように得られたattention weightをvalueと掛け合わせることで、出力を決定します。

以上がこのモデルの基本構造になります。このモデルの要は1-2で触れたquery, key, valueに入力を分け、queryからvalueを導き出す、というところにあります。
2-2 Attentionの種類
Attentionには大きく分けて2種類あります。
1つ目は、inputとmemoryが全く同じデータの場合です。これはSelf-Attentionと呼ばれます。
2つ目は、inputとmemoryで違うデータを使う場合です。これはSourceTarget-Attentionと呼ばれます。
Self-Attentionでその言語の構造を学習した後で、SourceTarget-Attentionで新しい文章に対して予測を行うことができる、というイメージです。なのでTransformerモデルも含め、両方のAttentionを組み合わせているモデルがほとんどです。
2-3 Transformerに付け加えられた工夫
ここからはAttention is all you needで実装されたTransformerモデルを中心に、基本的なAttentionに加えてどのような工夫がなされているのか、解説していきたいと思います。
下図の通り、transformerにはattention以外に様々な要素が加え得られています。左側がdecoderと呼ばれる、self-attentionを主に使い文章自体の構造を学習していく部分で、右側がencoderと呼ばれる、self-attentionとsourcetarget-attentionを組み合わせ、新たなmemoryに対するアウトプットを求める部分になります。

2-3-1 Multi-head Attention
論文では、行くつもの小さなAttentionを並列に繋げると、パフォーマンスが上がったと言われています。それぞれのAttentionをheadと呼ぶので、Multi-head Attentionと呼ばれています。Attention is all you needでは、全体として512次元のtensorが使われていて、この総数はheadの数によりません。head=4ならば各headのデータ次元は128になりますし、head=8ならば64次元になります。
2-3-2 Masking
上でAttention weightの計算方法をご紹介しましたが、maskは特定のkeyに対応するattention weightを0にするために使います。入力にあたるlogitに対し、値を-∞に設定することで、softmax時の値が0になります。
Maskを使う動機は主に
・padを無視したい
・decoderのself-attentionの段階で情報を先読みできないようにするため
の2つがあります。
2-3-2-1 padを無視したい
Inputやmemoryにおいて、batchごとのトークンの数は様々です。例えば、
のように、長さが1, 3, 2 とばらつきがあります。
そこで長さを揃えるためにpadで埋めることになります。
しかしattention weightの計算をするとき、padの分は計算から除外したい、と考えます。なぜなら、padの数はbatch内の他の文の長さによって影響されるので、本来干渉するべきでない情報が影響し合うことになるからです。そこで、softmaxの結果を0にして影響を避けよう、というのがmaskの目的です。
2-3-2-2 decoderのself-attentionの段階で情報を先読みできないようにするため
Transformerのdecoderでは、self-attentionが行われる部分があります。しかし、新たなアウトプットを予測する部分ですから、自分自身をmemoryにしてしまうと、先の答えが見えているのと同じになってしまいます。今までに得た情報のみで推論するように、先のattention weightを全て0にしてしまいます。

2-3-3 Hopping / Position-wise Feedforward Network
このmulti-head attentionを複数組み合わせたり、FFNを挟むことで、さらに学習精度が上がります。Attention is all you needでは、2048次元の中間層と512次元の出力層からなる2層の全結合ニューラルネットワークを使用しています。

2-3-4 Wrapper
TransformerにはLayer Normalization, Attention Dropout, Residual Connectionなどの正規化が行われており、これらをまとめてwrapperとして実装しています。これらの措置は主に学習速度を上げたり、学習精度を高めたりするための措置です。
2-3-5 Positional Encoding
Attentionは、そのままではトークンの順序を情報として学習に使うことができません。このままでは語順が反映されなくなってしまうので、Positional Encodingを足します。Attention is all you need では、
PE(pos, 2i) = sin(pos/1000^{2i/d})
PE(pos, 2i+1) = cos(pos/1000^{2i/d})
としています。その理由として、相対的な位置(PE{pos+k})をPE{pos}の線形代数で表現できるため、学習がしやすいだろうからです。
以上、attention及びtransformerモデルについての解説でした。
アクセルユニバース株式会社(以下当社)では、人が対応している業務を画像認識、音声認識、文字認識等を活用して効率化する機械学習ソリューション開発をおこなっています。
「機械学習について」機械学習とプロセス
また、定期的にメルマガでも情報配信をしています。
ご希望の方は問い合わせページに「メルマガ登録希望」とご連絡ください。
参考文献
作って理解する Transformer / Attention
ディープラーニングブログ/論文解説 Attention Is All You Need (Transformer)
Twitter・Facebookで定期的に情報発信しています!
Follow @acceluniverse