今更ながらTransformerについてまとめてみた

※注意書き※
素人が書いてます。勉強がてらまとめてます。間違ってたらご指摘よろしくお願い致します。。。

# Transformer入門
2017年、Googleの研究者たちがリカレントニューラルネットワーク(RNN)を上回る新しいニューラルネットワークアーキテクチャを『Attention Is All You Need』という論文で発表しました。

Transformerは3つの特徴を持っています。
* エンコーダ・デコーダをもつフレームワーク
* アテンション機構
* 転移学習

Transformer以前は、RNNをベースとしたアーキテクチャが利用されていましたが、大きく２つの問題がありました。それは、並列処理ができない点と長期記憶ができないという課題でした。
### リカレントニューラルネットワーク(RNN)
図1-1
![RNN1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601336/d72b807b-3d32-8e14-74d8-372284652d3b.png)
図1-2
![RNN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601336/404f309d-e26e-3921-c7c2-5f698dd0c89c.png)
Transformer以前の自然言語処理における最先端技術はRNNをベースとしたリカレントアーキテクチャでした。これらのアーキテクチャは、図1-1のようなフィードバックループ処理をもつことで、ある時刻から別の時刻に情報を伝播させることで、「記憶」させることが可能でした。
図1-1をさらに展開してみると、図1-2のように各時刻の状態を次の演算に渡しす処理を繰り返すことで、RNNは前の時刻の情報を記憶して、予測に利用できました。ただしこの方法には弱点がありました。
それは、前の時刻から情報を伝播されないと計算を開始することができず『並列化』が難しいため、高速化ができないという課題です。
図1-3
![RNN1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601336/ebd059da-af6f-f820-181b-67a5cc045218.png)
図1-3ではRNNのエンコーダ／デコーダのペアを持つアーキテクチャの例を挙げました。左側がエンコーダで右側がデコーダです。これは機械翻訳でよく利用されており、エンコーダ側は入力側で与えられた情報を最後の隠れ状態と呼ばれる数値表現にエンコードされ、エンコードされた状態をデコード側では出力結果を生成します。
問題として、最後の隠れ状態では、すべての情報を含めておく必要があるが特に長い情報の場合は表すのが難しく、１つの表現に圧縮する過程で、最初の方の情報が失われしまうことがあります。
この問題は、デコーダが『最後の隠れ状態』にのみアクセスすることが根本原因であることから、デコーダがエンコーダのすべての隠れ状態にアクセスできるようにすることで、回避する方法が出てきました。この方法はアテンション(Attention)と呼ばれ、Transformerアーキテクチャの主要な構成要素の１つです。
### アテンション機構
図1-4
![attension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601336/fbc5aace-ca40-5b14-891b-4cf8b5996f2b.png)
アテンションは入力側に対して、単一の隠れ状態を生成する代わりに、エンコーダはデコーダがアクセスできる隠れ状態を各時間で出力します。ただすべての状態を同時に使用するとデコーダの入力が膨大になるため、どの状態を使用するか優先順位をつけます。デコーダは各エンコーダの各状態に、デコーダの時刻ごとに異なる重み、つまり「アテンション」を割り当てます。図1-4はRNNにアテンション機構をつけることで長期記憶を可能にしたアーキテクチャになります。
しかし、この方式には問題があります。それは入力側が順序良く処理を進めていくことから入力側の並列化ができず、結果的にリソースを活用できず時間がかかっていたことにありました。
図1-5
![attension_trans.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601336/8136adff-8734-cf75-61ea-bc516e54301d.png)
Transformerは再帰性を排除して、セルフアテンション(Self-attention)を導入しました。ニューラルネットワークの同じ層内のすべての状態にアテンションを計算することとし、図1-5のような入力側にもアテンションを導入し、エンコーダとデコーダがそれぞれがセルフアテンション機構をもち、その出力が順伝播型ニューラルネットワークに入力することで、並列化を可能にしました。
### 転移学習
自然言語処理の実用的なアプリケーションでは、モデルを学習するために大量のラベル付きデータを利用できるなんて恵まれた状況は少ないかと思います。そこで最近のコンピュータビジョンでは転移学習を利用するのが一般的になっています。転移学習ではResNetのような畳み込みニューラルネットワーク(CNN)をあるタスクで学習させた後に新しいタスクに適応させるファインチューニング(fine-tune)をします。
図1-6
![kyosi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601336/c1d2dff3-9857-9430-3f9a-28e4ba7754ed.png)
図1-6は従来の教師あり学習で、同一タスク／ドメインで学習と評価をする方法でした。自然言語処理では長らく主流でしたが、コンピュータビジョンで転移学習が主流となったことを受け、2017～2018年に転移学習を自然言語処理でも使えるようにOpenAIの研究者が『Learning to Generate Reviews and Discovering Sentiment』にて考案しました。
図1-7
![tenni.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601336/67449424-e5e7-42d9-dfa5-47a947a98065.png)
転移学習を説明した図が図1-7となります。モデルを「ヘッド」と「ボディ」に分割して、「ヘッド」はタスクに特化したネットワークにします。「ボディ」は広域ドメインの特徴を学習し、重みをもっており新しいタスク用の新しいモデルを初期化するために使われます。従来の教師あり学習のアプローチに比べると、様々な下流タスクで少ないラベル数で効率的に学習できる利点がありました。
2018年にセルフアテンションと転移学習を組み合わせたTransformerモデルとして、GPT(OpenAI)とBERT(Google)がリリースされました。

#### GPT
Transformerアーキテクチャのデコーダ部分のみを利用して、ULMFiT言語モデルアプローチを採用しています。GPTはアドベンチャー、ファンタジー、ロマンスなどの様々なジャンルの未発表書籍7000冊からなるBookCorpusで事前学習されています。

##### ULMFiT
事前学習とドメイン適応とファインチューニングの３つのステップで構成されています。最初のステップである事前学習では、出現済みの単語を元に次の単語を予測するタスクを学習します。このタスクは言語モデルと呼ばれており、ラベル付きデータを必要とせず、Wikipediaなどから入手できる大量のテキストを利用できるメリットがあります。
次にドメイン適応のステップになります。大規模コーパス(構造化して集積したもの)で事前学習した言語モデルをターゲットドメインのコーパスに適応させます。一例ですがWikipediaで事前学習したモデルを機械翻訳用のIMDbコーパスを使って適応させます、この段階でも言語モデルは使われていますが、今後はモデルがターゲットコーパスの次の単語を予測する必要があります。
そのあと言語モデルはターゲットタスク用の分類層とともにファインチューニングをします。
この一連の流れを持つフレームワークをULMFiTと言います。

#### BERT
Transformerアーキテクチャのエンコーダ部分と、マスク言語モデルと呼ばれる言語モデルを使用します。マスク言語モデルの目的は、テキスト中のランダムにマスクされた単語を予測することです。「私は海で[MASK]を釣りました」という文書が与えられたとき、モデル[MASK]で隠された単語としてもっとも可能性の高い候補を予測する必要があります。BERTはBookCorpusと英語版Wikipediaで事前学習されています。