Transformer (機械学習モデル)

**Transformer**（トランスフォーマー）は、2017年6月12日にGoogleの研究者等が発表した深層学習モデルであり、主に自然言語処理 （NLP）の分野で使用される。

自然言語などの時系列データを扱って翻訳やテキスト要約などのタスクを行うべく設計されているのは回帰型ニューラルネットワーク （RNN）と同様だが、Transformer の場合、時系列データを逐次処理する必要がないという特徴がある。たとえば、入力データが自然言語の文である場合、文頭から文末までの順に処理する必要がない。このため、Transformer では 回帰型ニューラルネットワークよりもはるかに多くの並列化が可能になり、トレーニング時間が短縮される。

その導入以来、Transformer モデルは自然言語処理の多くの問題に取り組む上で広く選択されており、 Long Short-term Memory（LSTM）などの古い回帰型ニューラルネットワークモデルに取って代わった。Transformer モデルはトレーニング中の並列化を容易にするため、より大きなデータセットでのトレーニングを可能にした。このことが、 BERT （Bidirectional Encoder Representations from Transformers）や GPT （Generative Pre-trained Transformers）などの事前トレーニング済みシステムの開発につながった。これらは、巨大な一般言語データセットでトレーニングされており、特定の言語タスクにファインチューニングできる。

## 背景
トランスフォーマー登場以前には、自然言語処理の分野で注意機構（アテンション）を回帰型ニューラルネットワークモデルに追加するモデルが広く採用されていた。

### 注意機構

**[[注意機構]]**（）または**アテンション**（）は系列信号の重み付き統合である。

アテンションの基本は次のモデル式で表される。

\boldsymbol{z} = \Sigma w(i) \boldsymbol{v}(i)

系列信号に対し、i 番目の信号 \boldsymbol{x_i} からベクトル値 \boldsymbol{v}(i) とスカラ重み w(i) を計算し、系列全長にわたって重み付け和したものがアテンションである。系列の特定時刻に大きな重みを置くことを動物における注意に例えてアテンションと名付けられた。アテンション \boldsymbol{z} はベクトルの和で求められるため系列長に関わらず同じshapeを持ち、また \boldsymbol{v}(i) と w(i) は動的に算出される。ゆえにアテンションは可変長系列を入力に取れる。

#### RNNでの利用
ニューラルネットワークの分野ではLSTMやGRUなどの回帰型ニューラルネットワークにアテンション機構を追加したモデルが高性能な自然言語処理システムで採用されてきた。

ゲート付き RNN はトークンを順次処理し、各トークンの後に表示されるデータの表現を含む状態ベクトルを維持する。
n 番目のトークンを処理するとき、モデルは文の n-1 番目のトークンまでを表現する状態と、新しいトークンの情報とを組み合わせて新しい状態を作り出す。
そしてこの新しい状態が文の n 番目のトークンまでを表現する。
理論的には、あるトークンに関する情報を全ての時点でエンコードし続ける場合、シーケンスの任意の長さまで伝播できる。
しかし実際には勾配消失問題を一因としてこの機構は不完全であり、長い文の終わりにおける状態からは、初期のトークンに関する情報の多くは不正確ないし抽出不可能である。

この問題は、アテンション機構の導入によって対処された。
アテンション機構により、モデルは文の前の任意の時点の状態を直接見て、そこから引き出すことができる。
アテンション層は以前のすべての状態にアクセスでき、現在のトークンとの関連性の学習値に従ってそれらを重み付けして、遠く離れた関連するトークンに関する明瞭な情報を提供する。
アテンションの効用の明確な例は翻訳である。
英語からフランス語への翻訳システムでは、フランス語出力の最初の単語は、英語入力の最初の単語に最も強く依存することが想定される。
しかし、古典的なエンコーダー/デコーダー LSTM モデルでは、フランス語出力の最初の単語を生成するために、英語入力の**最後の**単語の状態ベクトルのみがモデルに与えられる。
理論的には、このベクトルは英語の文全体に関する情報をエンコードして、モデルに必要なすべての知識を与えることができるが、実際には、この情報はしばしば欠落している。
アテンション機構が導入されている場合、モデルは代わりに、フランス語の出力の始まりを生成するときに初期の英語トークンの状態に対応することを学習できるため、翻訳対象の概念をよりよく伝えることができる。

## 基本設計
Transformer 以前に発明されたモデルと同様に、Transformer はエンコーダ・デコーダ構造である。エンコーダは、入力を次々と繰り返し処理する一連のエンコード層で構成され、デコーダは、エンコーダの出力に対して同じことを行う一連のデコード層で構成される。

各エンコード層の機能は、入力のどの部分が互いに関連しているかに関する情報を含め、入力を処理してエンコーディングを生成することである。
各エンコード層は一連のエンコーディングを次のエンコーダ層に入力として渡す。

各デコーダーレイヤーは行うことはこの逆であり、すべてのエンコーディングを取得して処理し、組み込まれたコンテキスト情報を使用して出力シーケンスを生成する。

これを実現するために、各エンコーダ層とデコーダ層はアテンション機構を利用する。
アテンション機構は、各入力について、他のすべての入力との関連性で重み付けし、情報を引き出し、出力を生成する。
各デコーダ層には、エンコーディングからの情報を取得するより前に、前のデコーダ層からの情報を取得するためのアテンション機構がある。
エンコーダ層とデコーダ層の両方に、出力をさらに処理するためのフィードフォワードニューラルネットワークがあり、残りの接続と層の正規化手順が含まれている。

### アテンション単位
Transformer の基本的な構成要素は、Scaled dot-product attention unit と表現されるアテンション単位である。文が Transformer モデルに渡されると、アテンションの重みがすべてのトークン間で同時に計算される。アテンション単位は、コンテキスト内の全てのトークンの埋め込みを生成するが、そこにはトークン自体の情報だけでなく、他の関連トークンとの関連（についてアテンションの重みで重み付けされたもの）も含まれる。

具体的には、Transformerモデルは、各アテンション単位について、クエリの重み行列 W_Q 、キーの重み行列 W_K 、値の重み行列 W_V の 3 つを学習する。i 番目のトークンに対し、入力の埋め込み x_i に重み行列のそれぞれを乗じることで、クエリベクトル q_i = x_iW_Q、キーベクトル k_i = x_iW_K
、値ベクトルv_i=x_iW_V ができる。アテンションの重み a_{ij} はクエリベクトル q_i とキーベクトル k_j の内積（dot product）として計算され、勾配の安定化のためにキーベクトル k_j の次元の平方根 \sqrt{d_k}  で除算され（scaled）、さらにソフトマックス関数で重みの合計が 1 に正規化される。

クエリの重み W_Q とキーの重み W_K は異なる行列であり、アテンションが非対称になりうることに注意が必要である。トークン i がトークン j に関心を向ける（すなわち q_i\cdot k_j が大きい）場合であっても、トークン j がトークン i に注意を向ける （すなわち q_j\cdot k_i が大きい）とは限らない。トークン i へのアテンション単位の出力はすべてのトークンの値ベクトルの加重和であり、アテンションの重み a_{ij}（トークン i からそれぞれのトークンへのアテンション）で重み付けされている。 

すべてのトークンのアテンションの計算は、1つの大きな行列計算として表現できる。これは、行列演算を高速に実行できる行列演算最適化を用いたトレーニングに役立つ。行列 Q、K、V の i 番目の行は、それぞれ、クエリベクトル q_i、キーベクトル k_i 、値ベクトル v_i に相当する。


\begin{align}
\mathrm{Attention}(Q, K, V) = \mathrm{softmax} \left( \frac{QK^\mathrm{T}}{\sqrt{d_k}} \right)\,V
\end{align}


#### マルチヘッド アテンション
\left( W_Q, W_K, W_V \right) 行列の 1 セットが**アテンションヘッド**と呼ばれ、Transformer モデルの各層には複数のアテンションヘッドがある。1つのアテンションヘッドは各トークンに関連するトークンに注意を向けるが、複数のアテンションヘッドがあると、モデルは様々な定義の「関連性」に対して同様の操作を行うことができる。トランスフォーマーの多くのアテンションヘッドは、人間が解釈可能な関連性関係をエンコードしていることが研究によって示された。たとえば、主に次の単語に注意を向けるアテンションヘッド、主に動詞から直接目的語に注意を向けるアテンションヘッドなどがある。
Transformer モデルには複数のアテンションヘッドがあるため、表層レベルからセマンティックまで、多くのレベルと関連性関係の型をとらえることができる。マルチヘッドアテンション層からの複数の出力は、連結されてフィードフォワードニューラルネットワーク層に渡される。


\begin{align}
\mathrm{MultiHead}(Q, K, V) = \mathrm{Concat} \left( \mathrm{head}_1, \dots, \mathrm{head}_h \right)\,W^O \\
\mathrm{where}\quad\mathrm{head}_i = \mathrm{Attention}(QW_i^Q, KW_i^W, VW_i^V)
\end{align}


### point-wise feed-forward サブレイヤ
FFN(x_t) = ReLU(x_t W_1)W_2

Point-wise Feed-forward サブレイヤでは、位置 t における入力ベクトル x_t に対しフィードフォワード全結合ネットワーク（MLP）を適用する。重み W_1 W_2 は位置 t に依らず共有されている（異なるレイヤでは異なる重み）。すなわち特徴量をチャネルとした位置方向への 2-layer pointwise Conv1d と等価の処理をおこなう。

FFNは層内の並列計算が可能である。ゆえにこのサブレイヤは位置方向に並列計算が可能であり、Transformerの目標である高い並列性の学習が可能になっている。

サブレイヤはResidual connection内で利用されるため、入出力次元を合わせることが好ましい。原論文では入出力次元を d_{model} = 512 で固定したうえで 中間層の次元を入出力より大きくしている。

### エンコーダ
各エンコーダは、セルフ・アテンション機構および point-wise フィードフォワードサブレイヤ（FFサブレイヤ）の2コンポーネントで構成されている。セルフ・アテンション機構は、前のエンコーダからの一連の入力エンコーディングを取り込み、それらの相互の関連性を重み付けして、一連の出力エンコーディングを生成する。次にFFサブレイヤは、各出力エンコーディングを個別にさらに処理する。これらの出力エンコーディングは、最終的に、デコーダに加えて次のエンコーダへの入力として渡される。

最初のエンコーダは、エンコードではなく、位置情報と入力シーケンスの埋め込みを入力として受け取る。他の部位では位置情報を使用しないため、位置情報は Transformer がシーケンスの順序を使用する上で必須である。

### デコーダ
各デコーダは、セルフ・アテンション機構、エンコーディングに関するアテンション機構、FFサブレイヤの3コンポーネントで構成されている。デコーダはエンコーダと同様に機能する、エンコーダによって生成されたエンコーディングから関連情報を引き出す追加のアテンション機構が挿入される。

最初のエンコーダと同様に、最初のデコーダは、エンコーディングではなく、位置情報と出力シーケンスの埋め込みを入力として受け取る。ただし、Transformer は現在または将来の出力を使用して出力を予測するべきではないため、この逆の情報フローを防ぐために出力シーケンスを部分的にマスクする必要がある。最後のデコーダーの後には、最終的な線形変換とソフトマックス層が続き、語彙に対する出力確率が生成される。

### 代替案
Transformer ベースのアーキテクチャのトレーニングは、特に長い文の場合、非常にコストがかかる可能性がある。代替アーキテクチャとして挙げられるReformer では、計算負荷 O(L^2) から O(L\ln L) へと減らす（ただし、L はシーケンス長）。Reformer は、局所性鋭敏型ハッシュと可逆層を使用する。

## 訓練
Transformer は一般に、半教師あり学習（教師なし学習による事前学習とその後の教師あり学習によるファインチューニング）を受ける。
ラベル付けされたトレーニングデータの可用性は限られているため、事前学習はファインチューニングよりもはるかに大きなデータセットに対して行われることが多い。事前学習およびファインチューニングのタスクは以下のようなものである。

* 次の文の予測
* 質問応答
* 読解
* 感情分析
* 言い換え

## 実装
Transformer モデルは、TensorFlow や PyTorch などの主要なディープラーニングフレームワークに実装されている。

Transformer の単純な実装の疑似コードを以下に示す。


```python
def vanilla_transformer(enc_inp, dec_inp):
    """Transformer variant known as the "vanilla" transformer."""
    x = embedding(enc_inp) * sqrt(d_m)
    x = x + pos_encoding(x)
    x = dropout(x)
    for _ in range(n_enc_layers):
        attn = multi_head_attention(x, x, x, None)
        attn = dropout(attn)
        attn = layer_normalization(x + attn)

        x = point_wise_ff(attn)
        x = layer_normalization(x + attn)

    # x is at this point the output of the encoder
    enc_out = x

    x = embedding(dec_inp) * sqrt(d_m)
    x = x + pos_encoding(x)
    x = dropout(x)
    mask = causal_mask(x)
    for _ in range(n_dec_layers):
        attn1 = multi_head_attention(x, x, x, mask)
        attn1 = layer_normalization(attn1 + x)

        attn2 = multi_head_attention(attn1, enc_out, enc_out, None)
        attn2 = dropout(attn2)
        attn2 = layer_normalization(attn1 + attn2)

        x = point_wise_ff(attn2)
        x = layer_normalization(attn2 + x)
    return dense(x)
```


## 応用
Transformer は機械翻訳や時系列予測などの自然言語処理の分野で主に応用されてきた。GPT（GPT-1、GPT-2、GPT-3、GPT-4、ChatGPT）、BERT、XLNet、RoBERTaなどの多くの事前トレーニング済みモデルは、Transformer がそのような自然言語処理関連のさまざまなタスクを実行する能力を実証しており、以下の様な現実世界のタスクに応用しうる。

* 機械翻訳
* 自動要約
* 自然言語生成
* 固有表現抽出（NER） 
* 生物学的配列分析

2020年には、Transformer のアーキテクチャを用いた GPT-2 をファインチューニングすることで、チェスをプレイできることが示された。

Google の研究チームが 2020 年に発表した Vision Transformer では、Transformer のアーキテクチャを画像認識の分野に適用することで、畳み込みニューラルネットワークを凌駕する成績が得られた。

## 関連項目
* 自然言語処理 
* BERT – Bidirectional Encoder Representations from Transformers
* GPT – Generative Pre-trained Transformer
* Vision Transformer
* LLaMA

## 脚注

### 出典