Open yoheikikuta opened 2 weeks ago
今で言うところの GPT-1 つまり GPT の始祖たる論文。 過去に軽く目を通したことはあるけどちゃんと読もうと思い読んでみる。
この論文、arXiv とか conference にはなくて OpenAI のウェブサイト https://openai.com/index/language-unsupervised/ に掲載されていて、こういうところが OpenAI だなって感じ。 全然どうでもいい話だが、Google scholar で調べると公式ウェブサイトの情報をうまく取れておらず、個人の HP にアップされている pdf ファイルにリンクが貼られていて笑ってしまう。
2018 年の論文であり、モチベーションはラベルありのデータは作るのが大変なのでラベルなしのデータも使って自然言語の種々のタスクの性能を向上させたい、というもの。
教師なし学習で事前学習された単語の埋め込みはよく使われているが、この単語レベルから超えて教師なし学習を活用していくのは 2 つの困難がある。
この論文のアプローチは教師なしの事前学習と教師ありの fine-tuning を組み合わせた半教師ありのアプローチを探索している。 現実を反映して、大規模なラベルなしテキストコーパスと、手作業でラベル付けされたトターゲットタスクのデータにアクセスできることを前提としている。 まず、言語モデルを教師なし学習で学習して事前学習をして、その後ターゲットタスクのデータで fine-tuning するという方針(これは別に特別なことはない典型的な方針)を採用している。
この論文が歴史的論文になったのは、モデルのアーキテクチャとして Transformer を用いて、その後の GPT 論文が続いていったためである。これは一つには Transfomer が様々な自然言語処理のタスクに高い性能を見せているためである。もう一つは論文曰く以下である。
This model choice provides us with a more structured memory for handling long-term dependencies in text, compared to alternatives like recurrent networks
more structured memory と言われると強い意味があるように感じられるが、recurrent モデルと比べると長距離依存のパスが O(1) であって長距離依存性をよりダイレクトに扱える、という程度を言っていると思う。 本質的には経験則としてこのモデルが性能がいいから選んだ、である。
自然言語推論、質問応答、意味的類似性、テキスト分類、という 4 つのタスクで評価して、タスクに依存しないアーキテクチャだが高い性能を発揮したという実験結果が得られている。
あと、のちの GPT につながっていく一端として、ゼロショットの動作を検証して down stream タスクに有効な言語知識を獲得している(つまり事前知識で汎用的な言語知識を学んでいる)ことも調べている。
関連研究としての視点は主に 3 つ。
1 つ目は NLP における半教師あり学習。word2vec をはじめとする単語埋め込みの教師なし事前学習を使うという話と、最近では単語レベルを超えてフレーズレベルや文レベルの情報を使うというものになっている、というもの。
2 つ目は教師なしの事前学習。これは半教師あり学習の特殊なケースで教師あり学習をする前に良い初期値を見つけるためのもので、この論文と同様のアプローチだが LSTM でしかやられていない。この論文は Transformer 使っているぞということでモデルを変えただけではあるが、それでも圧倒的に高い性能を出せば勝ちという世界である。
3 つ目は auxiliary objective (補助的な目的関数)。これは教師あり学習の目的関数に、教師なしで使える目的関数を足して学習が望む方向に進みやすくするためのものなので、auxiliary という名がついている。NLP タスクにおいてもアイデア自体は 10 年以上前からあり、この論文でも補助的な目的関数を使う。大きなポイントは補助的な目的関数そのものではなく、教師なし事前学習で既に後続のタスクについてのいくつかの言語的側面を学習していることが分かった、ということ(この話自体は補助的な目的関数と完全に独立だけど、後の歴史を踏まえても重要なインサイトである)。
教師なし事前学習の以下の通り。
教師なしの言語モデル学習は典型的なもの。トークンを u、コンテキストウィンドウを k、モデルパラメタを Θ としたときに以下。 コンテキストウィンドウが k なので、直前の k 個のトークンをインプットにして次のトークンを予測する言語モデルになっている。
$$ L_1(U) = \sum_i \log P(ui \mid u{i-k}, \dots, u_{i-1}; \Theta) $$
この論文では Transformer decoder を言語モデルとして採用する。これは後から見ると歴史の 1 ページという感じが凄いね。 以下のように定式化しているが、これは特別なところはない。
$$ \begin{align} h_0 = U W_e + W_p \ hl = \text{transformerblock}(h{l-1}) \quad \forall i \in [1, n] \ P(u) = \text{softmax}(h_n W_e^T) \end{align} $$
ここで U は -k から -1 までのトークンである。論文では context vector of token と書いてあるが、context vector というのは misleading で単にトークン ID、この定式化では one-hot ベクトル化したもの、でそれを embedding matrix で分散表現にしている(実装もそうなっている)。
公式実装は結構わかりづらい(特に positon encoding をどう入れてるかとか)けど、以下の部分で embed 関数を適用している。
X の最後の次元が 2 でそれぞれトークンの id と positon id になっていて、we と書いてはあるがこれは論文でいうところの $W_e
$ と $W_p
$ を両方保持していて、embed 関数で embedding を取得してトークン embedding と positon embedding を足している。
教師あり学習は以下の通り。
transformerblock の最後の層を取り出し、先ほどは言語モデル用にトークン embedding の転置行列をかけてトークンを予測していた部分を、教師ありデータに合わせて $W_y
$ をかけて softmax してラベルの予測確率としている。
$$ P(y \mid x_1, \dots, x_m) = \text{softmax}(h_m^l W_y) $$
これを使うことで教師あり学習の fine-tuning の際の目的関数は以下のように書ける。
ここで C は input $x_1, \dots, x_m
$ と label $y
$ のペアのデータセットである。
$$ L2(C) = \sum{(x, y)} \log P(y \mid x_1, \dots, x_m) $$
ただし、これだけではなく、教師あり学習で fine-tuning する時にも教師なし学習で使った言語モデルを含めることで性能が良くなり収束も良くなったことを発見したと言っており、教師なし学習で使った言語モデルの目的関数をパラメタ $\lambda
$ を用いて補助的に加えている。
$L_1(C)
$ の C は入力トークンの x のみを使った言語モデルの教師なし学習の目的関数という意味で、label の情報はこちらの項では使わない。
$$ L_3(C) = L_2(C) + \lambda \cdot L_1(C) $$
メインの $L_2(C)
$ に対して、その目的関数の達成や予測精度向上のために補助的に入れているという意味で $L_1(C)
$ を補助的な目的関数 auxiliary objective と呼んでいる。全然どうでもいい話だが、auxiliary という単語を見るといまだに auxiliary field という単語が第一想起される。
ちなみに公式実装では事前学習済み+ fine-tuning 済み(これは陽には書いてないが流石にそうであってほしい)の重みが提供されており、新たな教示ありデータとして ROCStories https://cs.rochester.edu/nlp/rocstories/ というデータでの学習・検証コードが提供されている。
ラベルの予測確率のところをさらりと書いたが、実際には質問応答や含意関係認識(texutual entailment)など様々なタスクが存在する。タスクごとにモデルアーキテクチャを変えるのは高コストだし汎用性に乏しくなるので、ここでは traversal-style approach
という、事前学習したモデルが上手く扱えるようにタスクごとに構造化された入力を順序づけられた sequence に変換する方法を採用する。
言葉で書かれるとちょっと意味が取りにくいが、以下の図のようにタスクごとにどのように一列の sequence として扱うかを Transformer decoder が扱える形で定めて、同じアーキテクチャで複数のタスクを解けるようにするということである。
例えば、entailment であれば、
論文では extract という special token になっているが、実装では classify という名前が充てられている: https://github.com/openai/finetune-transformer-lm/blob/a69b5c43b0452462890bca8ff92fb75dee9290cf/train.py#L372-L374
細かいところとして、similarity を対照的にしているのは similarity が text1,2 を入れ替えても同一ということを陽に制限するためにこのようにしている。これはいかにも無駄だが、モデルアーキテクチャを一つにして様々なタスクを取り扱えるようにするための工夫である。データを dupliacate して text1,2 を入れ替えたデータを作るという手もあるが、ここでは目的関数の計算時に陽に対称性を入れる方法を選んでいる。
実験のセットアップについて。
教師なし事前学習に用いるのは https://arxiv.org/abs/1506.06724 で収集された BookCorpus という様々なジャンルを含む本のデータ。この論文で収集したものは duplicated なものも含まれていて、その辺は hugging face のデータセット https://huggingface.co/datasets/bookcorpus/bookcorpus の方でも解説されている。本論文では 7000 以上の unique なデータと書いてあるので重複を適宜排除したものを用いていそう。
モデルの詳細は以下。
モデルとしては特筆すべきところはなくて、この時点で知られているプラクティスを適宜盛り込んだというものになっている。 https://arxiv.org/abs/1711.05101 は読んでないのでどこかで読んでみるかもしれない。
fine-tuning に関しては、特に指定がない限り、教師なし事前学習で使用したハイパーパラメータ設定を再利用している。 分類器には0.1の dropout 栗を追加している。ほとんどのタスクでは、学習率は6.25e-5、バッチサイズは32を使用していて、ほとんどの場合3エポックの訓練で十分だったとのこと。 こういう収束の具合とかは肌感覚とも合ってるね。 学習率のスケジュールには、線形な減衰スケジュールを使用し、訓練の0.2%でウォームアップを行いました。正則化パラメータ λ は0.5に設定している。
natural language inference, question answering, semantic similarity, and text classification のタスクで検証していて、具体的なデータセットは以下の表の通り。
ここでは個別のデータセットを細かくみるところまではやらない。 それぞれのタスクについての結果は以下の通り。
Natural Language Inference. テキストの含意関係を判定するタスクで、2 つのテキストが与えられた時にそれらの関係を、含意(entailment)、矛盾(contradiction)、中立(neutral)、で判定する。 結果は 1 つのデータセットを除いて SOTA を上回っており、。
Question answering and commonsense reasoning. RACE は中高生向けの英語の試験問題と関連する質問からなるデータで、推論を要求するものが多いため長距離コンテキストの性能を測るのに適している。Story Cloze は複数文のストーリーに対して正しい結末を2つの選択肢から選ぶもので、こちらも長距離コンテキストが重要になる。従来のモデルを上回り、長距離コンテキストの取り扱いが得意であることを示している。
Semantic Similarity. 2つの文が意味的に同等かどうかを予測するタスク。
Classification. Corpus of Linguistic Acceptability (CoLA) [65] は、文が文法的かどうかについての専門家の判断を再現できるかで、Stanford Sentiment Treebank (SST-2) [54] は、標準的な二値分類タスク。
semantic similarity も classification も良い性能を示している。
全体をまとめると、12のデータセットのうち9つで SOTA を達成し、様々なタスクやデータセットサイズのものに対して単一のモデルアーキテクチャで高い性能を発揮したというところが特筆すべき点である。現代では当たり前になりつつある一つのモデルでなんでもできるというものだが、2018 はまだまだ task-specific な側面が強かったのでそれを考えると凄い結果である。
モデルの分析として、層の数と target task の性能の関係を調べ、層を増やすと target task の性能が良くなる → 各層が有効に機能している(性能に効いてない無駄な層はない)と分かる。
また、ゼロショットの振る舞いとして、教師なしの事前学習のみでの target task の評価もしている。 fine-tuning はしないので、事前学習したモデルでヒューリスティックスを入れて target task の予測をしている。
これはテキストだけではちょっとわかりづらいが、ヒューリスティックスの内容自体がめちゃくちゃ本質的ということではなく、一定の妥当性のある予測方法を構築できれば、教師なしの事前学習をすることで target task が結構解けるということが重要な点である。
ゼロショットが機能するということは、シンプルな言語モデルの学習が自然言語処理に重要な様々な能力を獲得することに役立っていることを示している。これは次のトークンを予測するという言語モデルの学習がトークン間の関係性や言語理解を本質的に効いていて、分布仮説の重要性・強力さを物語っている。 GPT-1 のこの段階では結構解けてすごいというレベルだが、知っての通りこれが将来的にどえらいレベルまで発展していくことになる。ゼロショットの性能を調べた、というところは偉いね。
最後は Ablation study で、教師あり fine-tuning の際に補助的な目的関数としての言語モデルの目的関数を除いた場合、LSTM の場合、事前学習なしで 教師あり学習だけした場合、を試している。
補助的な目的関数に関しては大規模なデータセットでは有効で小規模だとそんなに有効でないという方向性で良し悪しという感じだが、LSTM や事前学習なしの場合は殆どの場合で圧倒的に上回っている。 これは Transformer と言語モデルの事前学習の強力さをまざまざと物語っている。実際 LSTM とこれだけ性能差がつくというのは驚きであった。コンテキストを捉えるにはごちゃごちゃモデリングせずに attention でデータから学習させる!という方向性を決定づけた。
ということで一通り読み終わった。
改めて読んでみると、半教師あり学習のところは新しいことは特にないけど、Transformer decoder 使いましたというのがやはりポイントであったことを強く感じた。 zero-shot の性能はこの段階ではモデルの分析として見てみたら結構凄そうというくらいの話だが、これが大きく発展していくわけでやはりここに言及しているというのは GPT-1 論文の重要な点だね。
論文リンク
https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf
公開日(yyyy/mm/dd)
2018/06/11
概要
いわゆる GPT-1 の論文。 言語モデルの教師なし事前学習がその後の教師あり fine-tuning の性能を高めることは過去から知られているが、モデルとして Transformer decoder を使うことで、LSTM と比べて自然言語処理タスクに対して著しい向上があったという論文。特に、モデルアーキテクチャ自体は変えずに様々なタスクを単一のモデルで扱えるので、高い汎用性と性能を発揮しているところがポイントで、これは Transformer decoder の attention 構造による長距離コンテキストの把握が効いていると見られる。 また、教師あり fine-tuning をせずに言語モデルの教師なし事前学習(zero-shot)だけでも後続の自然言語処理タスクにおいて結構高い性能を発揮することを示し、言語モデルの事前学習が自然言語の様々な理解を促進していることが確認された。
公式実装: https://github.com/openai/finetune-transformer-lm/tree/master