🐒

Stanford NLP with Deep Learning Lecture9のまとめ(Transformer編)

2023/06/22に公開

1. はじめに

本稿は前稿の後半部分となっていてLecture9におけるTransformerの内部の工夫やAttentionについてふれていきます。
Transformerに関する記事は以前にも書いたのですがその時より良い記事を心がけていきます。
また、Transformerの中身部分を1ページで書きますので分量がいつもより多くなるかもしれません、、、
個人的に量の多い記事は好きくないのですが、分けるのも中途半端やなと思うので1つにまとめていきます。ご了承ください。

2. Transformer

まずは大枠としてTransformerのモデルアーキテクチャについて述べていきたいと思います。
講義で用いていた資料とWebに公開されている講義の資料が少し異なるので挿入している画像と講義中の画像が異なるのはご了承ください。
Transformerとは、図1で示した通りEncoderとDecoderで内部構造が少し異なっている深層学習モデルとなっており、特徴としてはそれまでの主流であった再帰の要素を排除し、Attention機構を採用することで精度の向上を達成しました。
図1)Transformerのモデルアーキテクチャ図([1]より引用)

Transformerの流れとしては以下のようになります。(Block内部については省きます)

  1. Encoderの入力をEmbeddingし、位置情報を付与する
  2. 得た文章ベクトルをEncoderBlockにいれ、層の数だけ内部の処理を行う(図1参照)
  3. Decoderの入力をEncoderの時と同様にEmbeddingを行い、位置情報を付与する
  4. Decoderの各ブロックにDecoderの入力とEncoderの最終層の出力を入力として用いる
    (後述するCross-Attentionで利用)
  5. DecoderBlockの処理を層の数だけ行う(図1参照)
  6. Decoderの最終層の出力を線形層を通した後Softmax関数に入れ、出力を得る

次からは、前稿で触れていないTransformerの内部構造について触れていきます。
そのため、Self-Attentionや位置Encoding、Maskingについての詳細部分は省略していきます。

3. TransformerにおけるAttention

前稿で述べたSelf-Attentionを発展させ、Transformer内で採用されている各種Attentionについて述べていきます。

3-1:Scaled Dot-Product Attention

これはSelf-Attetnionにscalingの処理を加えたAttentionを指します。

なぜScalingが必要なのか?

それはSelf-Attention内におけるSoftmax関数と内積の性質に由来しています。
内積は内積を取るベクトルの次元数が大きくなればなるほど値が必然的に大きくなります。
また、Softmax関数は入力の値の絶対値が大きくなればなるほど、なだらかな曲線になります。
すなわちこれは、勾配がかなり小さくなることを意味しています。
よって、これを避けるために入力であるkeyとqueryの内積に対して次元数に応じた(次元数dの平方根)scalingを行います。

<数式>

\begin{align} &output = Softmax\left( \frac{\mathbf{X}\mathbf{Q}\mathbf{K}^T\mathbf{X}^T}{\sqrt{d}} \right)\mathbf{X}\mathbf{V} \\ &[\mathbf{X}:入力, \mathbf{Q}:queryに関する重み, \mathbf{K}:keyに関する重み, \mathbf{V}:valueに関する重み, d:モデルの出力の次元数] \end{align}

これによって学習時の勾配計算も問題なく行えるようになります。

3-2:Multi-Head Attention

3-1述べたScaled Dot-Product Attentionによって学習時の問題も解消して、Self-Attentinoを行えるようにしました。
しかし、このまま一括でSelf-Attention内のqueryとkeyの内積を計算する時、計算コストが高すぎるという問題点があります。
この問題に対してTransformerの開発者はquery, key, valueを分割して並列処理を行えば良いのではという考えのもと対処しました。(図2参照)
その考えを採用したAttentionをMulti-Head Attentionと呼びます。
図2)Scaled Dot-Product AttentionとMulti-Head Attentionの比較([2]より引用)

<数式>

Multi-Head Attentionは以下のような手順で出力を得ています。

  1. ヘッド数hで分割したquery, key, valueの重みを定義する(原論文ではh=8)
\begin{align} &query: Q_l \in \mathbb{R}^{d \times \frac{d}{h}} \\ &key: K_l \in \mathbb{R}^{d \times \frac{d}{h}} \\ &value: V_l \in \mathbb{R}^{d \times \frac{d}{h}} \\ &[d:モデルの出力の次元数, l:1~h] \end{align}\tag{1}

2 . 各ヘッドは独立しているのでそれぞれで出力を計算する

\begin{align} &output_l = Softmax\left( \frac{\mathbf{X}\mathbf{Q}_i\mathbf{K}_i^T\mathbf{X}^T}{\sqrt{d}} \right)\mathbf{X}\mathbf{V}_i \\ &[output_l \in \mathbb{R}^{T \times \frac{d}{h}}] \end{align} \tag{2}
  1. 全てのヘッドの出力を結合し、Attentionの出力とする
output = [output_1; \cdots ; output_h] \in \mathbb{R}^{T \times d} \tag{3}

Multi-Head Attentionの面白い特性として、上の2で述べた通り各ヘッドは独立しているため入力は同じでも各ヘッドで異なる捉え方をしているというものがあります。
この特性は言語理解においてかなり重要な性質であり、これによってより複雑な意味の理解を可能にしました。

3-3:Cross-Attention

Attentionの最後としてDecoder部分で採用されているCross-Attention(Source-Traget Attention)について述べていきます。
これまでは、一つのソースからquery, key, valueを作成しAttentionを行うSelf-Attentionについて述べてきました。
しかし、TransformerのDecoderBlockにおける二つ目のAttention(図1参照)はquery,key,valueを異なるソースから作成するCross-Attentionを採用しています。
これによってEncoderで得た言語表現をDecoderで用いることを可能にしました。

<数式>

今回は一旦Single-Head Attentionで考えていきます(h=1の時)。実際はMulti-Head Attentionが採用されています。

  1. Encoderの出力Hからmemory部分をDecoderの入力Zからquery部分を算出する
\begin{align} &key:HK (memory) \\ &value:HV (memory) \\ &query:ZQ (query) \\ \end{align} \tag{4}

2.keyとqueryの関係性を内積を用いて獲得する(Attention score)

\mathbf{\alpha} = \frac{\mathbf{ZQ(HK)}^T}{\sqrt{d}}

3.Attentionの出力を算出する

output = Softmax(\mathbf{\alpha})(\mathbf{HV})

4. Attention以外の工夫

TransformerはAttention機構だけで構成した深層学習モデルとして一躍有名になりました。しかしAttention以外にも様々な工夫が内部には含まれています。前稿でも述べたFFNやMaskingもその一例です。
この章では前稿で触れていないResidual Connection(残差接続)とLayer Normalization(層正規化)について述べていきたいと思います。

4-1:Residual Connections(残差接続)

RNNsの勾配問題の解消の方法としてちょっと出た残差接続はTransformerでも採用されています。
Transformerでは隠れそう内部の副層の処理後全てに残差接続を行っています。(Attention後やFFN後)
残差接続は次の処理の入力を前の出力のみではなく、前の処理で用いた入力も併せて入力とするという手法です。(図3参照)
残差接続によって活性化関数によって消滅してしまった勾配を補うことで勾配消失問題の解決に加えて、損失曲線の凹凸を減らし学習効率の向上にも貢献しています。
図3)残差接続([1]より引用)

4-2:Layer Normalization(層正規化)

Transformerでは残差接続が行われる段階で一緒に正規化も行っています。
Transformerでは数ある正規化の中でも層正規化を採用しています。
これは系列データである言語モデルにより適しているためです。
というのもバッチ正規化の場合、見ているバッチ内のベクトルが0になってしまうと正しく正規化が行えないのに対して層単位で行うとその心配がなく、正規化を行えるためです。
以下式のように、各層の平均と標準偏差、重み、バイアスを用いて正規化を行います。

\begin{align} &output = \frac{x - \mu}{\sigma + \epsilon}\gamma + \beta \\ &[x:入力, \mu:平均, \sigma:標準偏差, \epsilon:分母を保証するための小さい数字, \gamma:重み, \beta:バイアス] \end{align}

5.Transformerの修正点

Transformerの内部構造についてこれまで述べてきました。
現在でも覇権を握っているTransformerモデルですが解決すべき課題も以下のようにまだあります。

  • Self-Attentionにおける計算量の増加
    Self-Attentionではqueryとkeyの内積をとる作業において系列長に合わせて指数関数的に計算量が増加してしまいます。
    この問題に対しては、行列のランクを下げて計算コストの削減を行うLinformerや、
    Self-Attentionではない複数のAttentionを併用して行うBigBirdが提案されています。

  • 位置表現について
    Transformerではsincos関数による絶対位置による位置表現を用いており、これは最善の手段ではないとされています。
    そのため相対位置表現や係り受けによる位置表現などを用いた手法も提案されています。

6. まとめ

Lecture9は一気にTransformerの内部構造を解説していく回でした。
もともとある程度わかっていたので知識の補完やより詳細部分の学習を行えました。
次からは学習面や各種タスクにどう落とし込んでいくかの部分に入るのでまた楽しみですね。

7. 参考文献

[1]Stanford CS224N NLP with Deep Learning | Winter 2021 | Lecture 9 - Self- Attention and Transformers
[2]Ashish Vaswani, et al. "Attention is All You Need", NeurIPS, 2017.

Discussion