自然言語処理の巨獣「Transformer」のSelf-Attention Layer紹介
「Transformer」概要
2017年中旬、Googleが発表した論文「Attention is all you need」で提出されたモデル「Transformer」は、深層学習の自然言語処理(NLP)分野でいまはデファクトスタンダードとして使われています。Transformerは要するに、過去の自然言語処理(NLP)で多く使われる再帰型ニューラルネットワーク(RNN)や畳み込みニューラルネットワーク(CNN)を「Self-Attention Layer」に入れ替えたモデルです。
それ以降、大抵の自然言語処理(NLP)分野で発表された研究や論文は、Transformerで再構築して発表されています。期待を裏切らなく、再構築されたモデルの結果は、以前の結果を上回っています。 Transformerは2017年に公開され、今でも自然言語処理(NLP)の巨獣としてこの分野を導いています。
巨獣の証は、この二年間で最も有名な自然言語処理モデルがすべてTransformerの仕組みで構築されている事です。2018年Googleが発表した自然言語処理(NLP)モデルBERTは、教師なしで学習したTransformerであり、2019年OpenAIが「あまりにも危険で発表したくないAI」と自己評価したモデルGPT2は、Masked Self-Attention Layerを使用したBERTです。
紹介を始める前に、先に名詞の定義をします。「入力文章」とはLayerの入力全句、「単語」は入力文章を形態素解析した後の最小単位、「対象単語」は単語Aが単語Bに対してAttention計算する状況での単語Bを指す、「層」とはSelf-Attention Layerを指しています。
「Self-Attention Layer」紹介
2015年に発表されたAttention(注意機構)とは、単語同士の関係を行列で表す方法です。本来はエンコーダーとデコーダーとして動作していますが、Self-Attention Layerはその方法をLayer内で実現し計算の高速化を実現しました。Attentionの仕組みと発展についてはSyncedさんの記事(英語)をお薦めめします:
Self-Attention Layerは従来の自然言語処理(NLP)モデル構造と比べると、主に二つのメリットがあります。
- 並列計算可能 (再帰型ニューラルネットワークと比べ)
- 長文の為の深いモデル構築不要 (畳み込みニューラルネットワークと比べ)
正確に言うと、畳み込みニューラルネットワーク(CNN)での自然言語処理(NLP)は元々再帰型ニューラルネットワーク(RNN)の並列計算問題解決法として提出されました。しかし、畳み込みニューラルネットワーク(CNN)での自然言語処理はカーネルで単語関係を見ているので、計算量の為にカーネルサイズを小さくすると、長文だと前後単語関係が見られなくなります。それを克服するには深いモデルを構築し深い層で長文の前後の単語関係を見る事になりますが、それなりに計算量も多くなるので、何れにしろ長文には向いていません。
Self-Attention Layer では入力文章内の単語関係を一度に見る事を実現する事により、層内を単純な行列計算にして計算ユニットでの並列計算を可能にしました。さらに、Self-Attention Layerではマルチヘッド(Multi-Head)構造という特徴があって、様々な単語関係の種類や入力文章内単語の間合いで単語の予測をする事ができます。
基本構造
入力文章Xは埋め込み(Word Embedding)してから単語別にQuery, Key とValue の三つの変数を計算します。
- q ⁱ (Query) = W ᑫ a ⁱ
- k ⁱ (Key) = W ᵏ a ⁱ
- v ⁱ (Value) = W ᵛ a ⁱ
W ᑫ, W ᵏ, W ᵛ が層内でトレーニングする変数です。層内のAttentionはQueryとKeyの組み合わせで、Queryが「与える方」、Keyが「受ける方」として動作しています。 Valueは「情報付与者」として、Attentionを使い単語の情報を引き出し予測結果を出します。
Attention
Attentions(注意機構) α はQuery「与える方」とKey「受ける方」の内積をQueryとKeyのサイズの平方根で割る事で値を得られます。入力文章内の単語同士は単語のQueryと対象単語のKeyで別々のAttentionを計算する事によりAttention Matrix Aが作られます。長めの入力文章だと多くの単語により埋め込み後のベクトルが大きくなり、内積の値も大きくなるのでサイズ平方根で入力文章別のバランス調整を行います。
Attention Matrix Aは入力文章ごとにSoftmax関数に通します。Softmax関数で出力したAttention Matrix内のAttention ᾱは対象単語のValueに掛けて情報付与することによって、出力のb なります。
このQuery, KeyとValueの組み合わせがSelf-Attention Layerで一番トリッキーな所です。QueryとValueが単語同士の関係を立ち上げて、ValueでAttentionに情報付与をして総合して単語と他の全ての対象単語との関係を考慮した出力をする。
行列化
上図から見ると明らかなように、Self-Attention Layer内での計算は行列計算です。今の深層学習での主流のGPU計算との相性が抜群です。
その上、層内計算に使われる入力は前の単語での出力を新単語の層入力とする系列データでは無いので、並列計算も可能です。
GPU計算+並列計算、これは深層学習に最も相応しい組み合わせですね。
マルチヘッド(Multi-Head)構造
自然言語処理(NLP)での厄介な問題の一つが単語同士の関係です。単語同士の関係は必ず一つ以上存在します、以下の例をご覧ください。
“LSC is the best!”
“It’s the best of LSC.”
この二つの例文内での “LSC” と “best” の関係は大きく違います。同じAttention Matrixで観察されると文章が事実と異なって解釈される事になります。Self-Attention Layerでこの問題を解決するためにマルチヘッド(Multi-Head)という構造があり、可変パラメータとして単語関係を別々に観察する事ができます。
マルチヘッド(Multi-Head)構造は複数のAttention Matrixを一つのSelf-Attention Layerに内蔵する方法です。単純にSelf-Attention Layer内のQuery, KeyとValueを複数にして、独立にAttention Matrixを計算すれば、層内で複数のAttention Matrixを得る事ができます。 マルチヘッド(Multi-Head)構造だと層内のAttention Matrixから複数の出力がでるので、層の出力をする前にトレーニングする変数 Wᵒを付けて、BがAttention Matrixの複数出力だと層の出力O = WᵒB となります。
時間複雑性
Self-Attention Layerの時間複雑性は他のモデル構造と比べても優れています。他のモデル構造と比べたFLOPS(Floating-point Operations Per Second)は以下の様です:
- Self-Attention: O(length²•dim)
- RNN(LSTM): O(length•dim²)
- Convolution: O(length•dim²•kernel-width)
Attentionは入力文章の長さ<<埋め込み単語のベクトルサイズの時、計算量が少ないです。
まとめ
Transformerは発表以来、自然言語処理を導き続ける巨大な存在です。その中のコアである「Self-Attention Layer」についてわかりやすい様に説明をしてみました。技術について詳しく知りたい方は論文の “Attention is all you need”を読む事をお薦めします。もし私の様に論文を読むのがだるい方には下記のToward Data Scienceの記事を薦めます。
if you like(this_article):
please(CLAPS)
follow(LSC_PSO)
# Thanks :)