🐒

Transformerアーキテクチャと自然言語処理の発展

2023/01/23に公開約7,700字3件のコメント

1. はじめに

はじめまして、この投稿がZennの初投稿となります。
初学者ゆえ至らない点や、不適切な表現があるとは思いますが都度ご指摘していただけると幸いです。

この記事についてですが、先月から自然言語処理を今のトレンドであるTransformerを主軸に勉強し始めており、インプットだけでなくアウトプットのためZennを書こうと思ったのがきっかけです。
(同様にQiitaにてベイズに関するアウトプットも行なっています。)
また、参考資料については下にも書いてはいますが「Transformerによる自然言語処理」をメインにしています。
といってもこの本は誤翻訳がひどいので自分で調べながらやる必要があり、二度手間になるかもです。ただ内容としては初学者の自分でも理解でき、GitHubに公開されているJupiter Notebookと同時に進めれば誤翻訳もまあ修正できると感じたので個人的には良い本だと思っています。
というわけで、前説が長いのは見づらいだけなので本題に入ります。

2. 自然言語処理(NLP)の発展

現在の自然言語処理の分野において圧倒的な地位を誇るTransformerが2017年に発表された「Attention is All You Need」[1]で登場するまでにもさまざまなニューラルネットワークを用いた言語モデルが提案されていた。まずはこれらについて代表的なものをピックアップして述べていきます。

2.1 <Word2Vec>

Word2Vecは2013年にMikolovらによって提案された単語に対して文脈に依存せずに、
一意な分散表現を学習するモデルです[2]。
このモデルの特徴としては、単語に文脈に依存しない分散表現を与える(⇦ Word Embedding)ことによって、数値による加減法を意味にも適応できるような性質である加法構成法を示すことにあります。
このモデルには文が与えられたときの単語の確率分布を考えるCBOWというモデルと、因果関係を真反対に考えたある単語が与えられたときの文中における別の単語の確率分布を考えるskip-gramというモデルの二つが内包されています。
[問題点]
この問題点としては以下の二点が挙げられます。

  • 文脈によって意味が異なる多義語を扱う上で、単語に一意に分散表現を与えてしまうWord2Vecでは扱えなないこと
  • 単語の語順を考慮していないため、構成単語が同じでも語順で意味が異なる文章において同一の分散表現を与えてしまう点

2.2 <ELMo>

ELMoは2018年に提案されたモデル[3]のことでWord2Vecとは異なり、得られる単語の分散表現が文脈に応じて異なるという特徴があります。(⇦ Contextualized Word Embedding)
これには系列データを処理するためのモデルであるRNN(再起型ニューラルネットワーク)のなかでもLSTMが用いられています。
ELMoではこのLSTMを順方向と逆方向の多層LSTMを組み合わせた双方向LSTMを採用しており、
これによって文脈によって異なる分散表現が得ることができます。
また、ELMoはTransformerの応用型であるBERTのもととして考えられたモデルでもあります。

ELMoに関してはTransformerが出た後のモデルですが、一応述べました。
次に自然言語処理の分野が飛躍的な発展をとげるきっかけとなったTransformerのモデルアーキテクチャについて簡単に紹介します。

3. Transformerのモデルアーキテクチャ

原論文[1]では以下のようにTransformerのアーキテクチャが紹介されています。
図1)[1]より引用したTransformerのアーキテクチャ
N_xの部分は同じ層のスタックを表しており、原論文[1]においては6層になっています。
よって左側に6層のエンコーダスタック、右側に6層のデコーダスタックがあることを表しています。
エンコーダスタックにおいては、入力をもとに埋め込みと位置情報を付与した後にAttention副層とFFN(フィードフォワードネットワーク)副層を通過し出力は次のエンコーダスタック層に加えて、
デコーダスタックのAttention層に送られます。
デコーダスタックにおいては、入力をもとに埋め込みと位置情報を付与した後、マスクを含んだAttention副層とAttention副層、FFN副層を通過したあと最終的には出力確率として活性化関数であるSoftmax関数を通すことで出力されます。
この後はTransformerを構成する上で重要な以下の三つについて述べていきます。

  1. Multi-Head Attention
  2. エンコーダスタックの各副層の中身
  3. デコーダスタックの中身
    まずは1つめのMulti-Head Attentionについて述べていきます。

4. Multi-Head Attention

まずMulti-Head Attentionより前に、Attentionについて述べていきます。
原論文[1]ではAttentionは以下のように表現されています。

We call our particular attention "Scaled Dot-Product Attention" (Figure 2). The input consists of queries and keys of dimension d , and values of dimension d .

ここではAttentionを'Scaled Dot-Product Attention'と呼び、入力(1つ前の層の出力)に対して三つの行列を用いることでクエリー[Q]とキー[K]、そしてバリュ[V]というd次元の値を作成し、以下式を計算することでトークン列のi番目の重みを決定することを指します。

Attention(Q, K, V) = Softmax\bigg(\frac{QK^T}{\sqrt{d_k}}\bigg)V

この式おける\sqrt{d_k}の役割としては0から1の範囲の値を取るようにスケールするためです。
Multi-Head AttentionはこのScaled Dot-product Attentionを拡張し、図2のように複数組(Q, K, V)を用意し、最終的な出力を一つに集約するというAttention構造のことを指します。
図2 Multi-Head Attentionの構造 [1]より引用
Attentionがそれまでのモデルと違ってい良い点は以下の二点が挙げられます。

  • あるトークンの情報を処理するときにそのトークン以外の全てのトークンの情報を直接用いて出力を計算するため遠く離れたトークンの情報もきちんと考慮した出力を得ることができる。
  • これまでは順番に計算したことによって並列処理ができなかったが、Attentionでは各トークンの出力が独立しているため並列化でき、計算効率が向上した。
    次はこのAttentionを用いてTransformerの各層で行われていることについて述べていきます。

5. エンコーダスタック

Transformerは以下の層で構成されている。

  • Embedding層(埋め込み層) #最下層のみ存在
  • 位置エンコーディング
  • Multi-Head Attention副層
  • FFN副層
  • 後層正規化プロセス

<Embedding層>

ここでは入力(文章)をベクトル表現に変換するために、さまざまな埋め込み手法を用いて単に文を数値化した各トークンに意味を持たせる層のことです。
ここで用いられている埋め込み法としては先ほども出たskip gram等が用いられます。
ただこのままでは単語単位での類似性はわかるが各単語のトークン列ないにおける位置に関する情報が不足しているため、次の位置エンコーディングと共に用いることでこの問題を解決しました。

<位置エンコーディング>

トークン列ないの単語の位置を渡したいからといって単語それぞれに独立した位置ベクトルを作ると計算コストの面でもattentionの複雑さが増す点からみても良くない。
この問題に対して、Transformerの設計者の方々はベクトルを追加する代わりに、位置エンコーディング値を入力埋め込みに追加することで位置情報を記述した。
よって、Attention層に入るまでに入力はまず埋め込みベクトルに変換され、その後位置ベクトルを加えることで位置情報も加味した位置エンコーディングベクトルを得ることができます。

<Multi-Head Attention副層>

エンコーダスタックにおけるMulti-Head Attentionは、Attentionの二種類ある使い方のうち
'Self Attention'と呼ばれるQ,K,Vを同じ入力を元に作成する使い方でMulti-Head Attentionを使用しています。
この層では位置エンコーディングベクトルを受け取り、Attentionを通すことで各トークンの持つ情報を引き出す作業を行なっています。
Transformerでは512次元の入力を8つのヘッドを並列に走らせることで各ヘッド64次元の処理に変えることで計算速度を向上させています。
また、headを複数用意することである単語に関して、他の単語との関係性を機械に認識させる(attentionさせる)ことができるため表現力の向上にも繋がっています。
ただ、各出力は欲しい出力である行列の一部でしかなので最後に連結させる必要があります。
よって先ほどのAttentionの式を各head一つ一つの出力として捉えると、Multi-Head Attentionの式は以下のようになります。

\begin{aligned} MultiHead(Q, K, V) = Concat(head_1, \cdots , head_h)W^0\\ [head_i:i番目のheadにおけるAttentionの出力, W^0:重み行列を意味するパラメータ] \end{aligned}

<FFN(Feedforward Network)>

FFNは前の副層から得られたd次元の出力を入力とし、以下のように記述されます。

  • FFNは2層あり、一層目ではReLU活性化関数が二層目では線形変換が行われる。
  • TransformerにおけるFFNへの入力は512次元だが、内部層においては2048次元である。

また、最適化され標準化されたFFNは以下のように書くことがきます。

FFN(x) = max(0, xW_1+b_1)W_2 = b_2

この線形変換はカーネルサイズが1の2つの畳み込みとみなすことができます。

<後層正規化>

Transformerにおいて各副層の後には後層正規化(Post-LN)が行われており、
ここでは残差接続に関する加算関数による処理と層正規化プロセスが含まれています。
[残差接続]
残差接続は入力であるxに直前の副層の出力であるSublayer(x)を加えることで、
情報が失われていなことを確実にしている処理のことです。
これによって、深い層を持つモデルにおいても学習が適切に行えるようになっています。
[層正規化プロセス]
残差接続によって得た新しい入力を次の副層へ入力するために正規化するプロセスである。
このLayer Normalizationは全身のBatch Nomalizationの弱点であった以下の二点を各layerの隠れ層の値を使って正規化を行うことで克服した手法です。

  • ミニバッチのサイズが小さいと正規化できない
  • RNNに適用できない

数式は以下のように表されます。

\begin{aligned} LayerNormalization(y_i) = \frac{\gamma}{\sigma_i}\bigodot (y_i-\mu_i) + \beta\\ \left[ \mu_i:y_iの平均, \sigma_i:y_iの標準偏差, \gamma:スケールパラメータ, \beta:バイアスベクトル \right] \end{aligned}



よってPost-LN自体は以下のように記述することができる。

LayerNormalization(x+Sublayer(x))

6. デコーダスタック

デコーダスタックはほとんどエンコーダスタックで行われていることと同じです。
ただ、Attention層に関してはマスク付きのAttention層を通常のAttention層の前に入れているという異なる点があります。
このマスク付きAttention層とは、入力によって得られたトークンの一部をマスクと言って
Attentionにおける各トークンの重要性を表す重みの値を0にする処置をしてからAttentionに入力する処理を行いその出力を次のAttention副層に渡す層です。
このマスク処理を行うメリットは以下の二点にあります。

  • Paddingの過程でトークン列に追加される特殊トークン[PAD]を無視することができる。
  • この次のAttentionにて未来の情報を見ずに仮定のもと推論を行うことができる。

2個目の理由に関しては、Transformerが再起型ではなく自己回帰型のモデルであることに起因します。
自己回帰型のモデルというのは、ある段階iにおける出力を元にi+1の予測を行ったとき、
その出力を元に次のi+2の予測を行うというモデルのことで、エンコーダスタックと同様に入力をそのまま使ってしまうと、i段階で予測した答えの部分をi+1の段階で用いるということになり、未来の予測をカンニングしているような感じになってしまいます。

これを防ぐためにマスク付きのAttentionを間に挟んでいる。
このAttentionの使い方をSelf Attentionと区別して、'SourceTarget-Attention'と言います。
これに関して分かりやすい図を載せているQiita[4]の記事があったのでそこから画像を引用します。
図3 End-to-End Memory NetworkにおけるSourceTarget Attention[4]より引用

SourceTarget-AttentionとSelf-Attentionの大きく異なる点は、
Self-AttentionがQuery(Q)もMemory(KとV)に用いられているデータが同じであるのに対して、SourceTarget-AttentioinはQuery(Q)として用いられるデータとMemory(KとV)に用いられるデータが異なるという点にあります。

このようにしてエンコーダスタックからきた入力をQueryとしてマスク付きAttentionの出力をMemoryとしてAttentionに入れるのがTransformerにおけるデコーダスタックである。

7. まとめ

今回は、Transformerのモデルアーキテクチャに関して自然言語処理の概要から述べていきました。
Attentionの発想はもちろんですが、デコーダスタックにおけるMasked Multi-Head Attentionの導入理由であったり、左右のバランス、そしてなによりTransformer内での出力が512次元に統一されているところから設計者の方たちすげーってずっとなっていました。
ここからより自然言語に踏み込んでいきたいと思います。
また、文章中になにか変な点やお前間違っているぞ!といった点ございましたらご指摘よろしくお願いします🙇‍♂️

8. 参考文献

[書籍]

[論文]

[1] Ashish Vaswani, et al. "Attention is All You Need", NeurIPS, 2017.
[2] Tomos Mikolov, et.al, "Efficient Estimation of Word Representations in Vector Space", ICLR, 2013.
[3] Matthews E.Peters, el. al, "Deep contextualized word representations", NAACL, 2018.

[記事]

[4] 作って理解するTransformer/Attention

Discussion

素敵な記事をありがとうございます。こちらのリンク先が表示できず、確認いただけるでしょうか。

これに関して分かりやすい図を載せているQiita[4]の記事があったのでそこから画像を引用します。

Qiita の部分のリンクです

[4] 作って理解するTransformer/Attention

作って理解するTransformer/Attention のリンクです

ご指摘ありがとうございます。
urlの一部を消してしまっていて、移動できないようでした。
修正致しましたのでリンクに飛べるようになったと思います。

超絶感謝です!

ログインするとコメントできます