Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2018] Improving Language Understanding by Generative Pre-Training [paper-reading] #70

Open
yoheikikuta opened this issue Sep 19, 2024 · 11 comments

Comments

@yoheikikuta
Copy link
Owner

yoheikikuta commented Sep 19, 2024

論文リンク

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

@yoheikikuta
Copy link
Owner Author

yoheikikuta commented Sep 19, 2024

今で言うところの GPT-1 つまり GPT の始祖たる論文。
過去に軽く目を通したことはあるけどちゃんと読もうと思い読んでみる。

この論文、arXiv とか conference にはなくて OpenAI のウェブサイト https://openai.com/index/language-unsupervised/ に掲載されていて、こういうところが OpenAI だなって感じ。
全然どうでもいい話だが、Google scholar で調べると公式ウェブサイトの情報をうまく取れておらず、個人の HP にアップされている pdf ファイルにリンクが貼られていて笑ってしまう。

@yoheikikuta
Copy link
Owner Author

2018 年の論文であり、モチベーションはラベルありのデータは作るのが大変なのでラベルなしのデータも使って自然言語の種々のタスクの性能を向上させたい、というもの。

教師なし学習で事前学習された単語の埋め込みはよく使われているが、この単語レベルから超えて教師なし学習を活用していくのは 2 つの困難がある。

  1. 解きたいタスクに転移させることを考えた時に、教師なし学習としてどのような目的関数を設定すればいいかが非自明である
  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 タスクに有効な言語知識を獲得している(つまり事前知識で汎用的な言語知識を学んでいる)ことも調べている。

@yoheikikuta
Copy link
Owner Author

関連研究としての視点は主に 3 つ。

1 つ目は NLP における半教師あり学習。word2vec をはじめとする単語埋め込みの教師なし事前学習を使うという話と、最近では単語レベルを超えてフレーズレベルや文レベルの情報を使うというものになっている、というもの。

2 つ目は教師なしの事前学習。これは半教師あり学習の特殊なケースで教師あり学習をする前に良い初期値を見つけるためのもので、この論文と同様のアプローチだが LSTM でしかやられていない。この論文は Transformer 使っているぞということでモデルを変えただけではあるが、それでも圧倒的に高い性能を出せば勝ちという世界である。

3 つ目は auxiliary objective (補助的な目的関数)。これは教師あり学習の目的関数に、教師なしで使える目的関数を足して学習が望む方向に進みやすくするためのものなので、auxiliary という名がついている。NLP タスクにおいてもアイデア自体は 10 年以上前からあり、この論文でも補助的な目的関数を使う。大きなポイントは補助的な目的関数そのものではなく、教師なし事前学習で既に後続のタスクについてのいくつかの言語的側面を学習していることが分かった、ということ(この話自体は補助的な目的関数と完全に独立だけど、後の歴史を踏まえても重要なインサイトである)。

@yoheikikuta
Copy link
Owner Author

yoheikikuta commented Sep 20, 2024

教師なし事前学習の以下の通り。

教師なしの言語モデル学習は典型的なもの。トークンを u、コンテキストウィンドウを k、モデルパラメタを Θ としたときに以下。
コンテキストウィンドウが k なので、直前の k 個のトークンをインプットにして次のトークンを予測する言語モデルになっている。

$$ L_1(U) = \sum_i \log P(u_i \mid u_{i-k}, \dots, u_{i-1}; \Theta) $$

この論文では Transformer decoder を言語モデルとして採用する。これは後から見ると歴史の 1 ページという感じが凄いね。
以下のように定式化しているが、これは特別なところはない。

$$ \begin{align} h_0 = U W_e + W_p \\ h_l = \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 を足している。

https://github.com/openai/finetune-transformer-lm/blob/a69b5c43b0452462890bca8ff92fb75dee9290cf/train.py#L164-L170

@yoheikikuta
Copy link
Owner Author

yoheikikuta commented Sep 20, 2024

教師あり学習は以下の通り。

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$ のペアのデータセットである。

$$ L_2(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/ というデータでの学習・検証コードが提供されている。

@yoheikikuta
Copy link
Owner Author

yoheikikuta commented Sep 20, 2024

ラベルの予測確率のところをさらりと書いたが、実際には質問応答や含意関係認識(texutual entailment)など様々なタスクが存在する。タスクごとにモデルアーキテクチャを変えるのは高コストだし汎用性に乏しくなるので、ここでは traversal-style approach という、事前学習したモデルが上手く扱えるようにタスクごとに構造化された入力を順序づけられた sequence に変換する方法を採用する。

言葉で書かれるとちょっと意味が取りにくいが、以下の図のようにタスクごとにどのように一列の sequence として扱うかを Transformer decoder が扱える形で定めて、同じアーキテクチャで複数のタスクを解けるようにするということである。
例えば、entailment であれば、, premise の部分のトークン列, , hypothesis の部分のトークン列, と special token を 3 つ使った上で、一つの sequence 列として扱い、extract 部分のトークン列が教示ありでラベルと比較するための要素であり、この部分のみを切り出して線形層に繋いで(切り出しているという意味で extract という単語を用いている)予測にしている。

論文では extract という special token になっているが、実装では classify という名前が充てられている: https://github.com/openai/finetune-transformer-lm/blob/a69b5c43b0452462890bca8ff92fb75dee9290cf/train.py#L372-L374

細かいところとして、similarity を対照的にしているのは similarity が text1,2 を入れ替えても同一ということを陽に制限するためにこのようにしている。これはいかにも無駄だが、モデルアーキテクチャを一つにして様々なタスクを取り扱えるようにするための工夫である。データを dupliacate して text1,2 を入れ替えたデータを作るという手もあるが、ここでは目的関数の計算時に陽に対称性を入れる方法を選んでいる。

@yoheikikuta
Copy link
Owner Author

実験のセットアップについて。

教師なし事前学習に用いるのは https://arxiv.org/abs/1506.06724 で収集された BookCorpus という様々なジャンルを含む本のデータ。この論文で収集したものは duplicated なものも含まれていて、その辺は hugging face のデータセット https://huggingface.co/datasets/bookcorpus/bookcorpus の方でも解説されている。本論文では 7000 以上の unique なデータと書いてあるので重複を適宜排除したものを用いていそう。

モデルの詳細は以下。

  • 12層の Transformer Decoder
  • マスク付き self-attention head で 768次元の状態と12個の head
  • feedforwardは3072次元
  • Adam で最大学習率は2.5e-4
  • 最初の2000ステップで学習率を線形に0から増加させ、その後 cosine スケジュールで0まで減衰
  • 512トークンの連続 sequence をランダムに64個サンプリングしたミニバッチで100エポック訓練
  • LayerNorm をモデル全体で用いているので、重みの初期化は N(0,0.02) で十分とのこと
  • BPE で語彙数は 40,000
  • residual、embedding、attention に対して dropout 率 0.1 で適用
  • 非バイアスまたはゲイン重み(layernorm とか batchnorm とかでスケーリングするパラメタのこと)に対して https://arxiv.org/abs/1711.05101 の論文で提案されたL2正則化を modify して w=0.01 で適用
  • 活性化関数はGELU(Gaussian Error Linear Unit) https://arxiv.org/abs/1606.08415
  • sinusoidal ではなく学習可能な位置埋め込み
  • BooksCorpusのテキストを ftfy https://ftfy.readthedocs.io/en/latest/ でクリーンアップし、句読点と空白を標準化、spaCyトークナイザーを使用 https://spacy.io/

モデルとしては特筆すべきところはなくて、この時点で知られているプラクティスを適宜盛り込んだというものになっている。
https://arxiv.org/abs/1711.05101 は読んでないのでどこかで読んでみるかもしれない。

fine-tuning に関しては、特に指定がない限り、教師なし事前学習で使用したハイパーパラメータ設定を再利用している。
分類器には0.1の dropout 栗を追加している。ほとんどのタスクでは、学習率は6.25e-5、バッチサイズは32を使用していて、ほとんどの場合3エポックの訓練で十分だったとのこと。
こういう収束の具合とかは肌感覚とも合ってるね。
学習率のスケジュールには、線形な減衰スケジュールを使用し、訓練の0.2%でウォームアップを行いました。正則化パラメータ λ は0.5に設定している。

@yoheikikuta
Copy link
Owner Author

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 な側面が強かったのでそれを考えると凄い結果である。

@yoheikikuta
Copy link
Owner Author

モデルの分析として、層の数と target task の性能の関係を調べ、層を増やすと target task の性能が良くなる → 各層が有効に機能している(性能に効いてない無駄な層はない)と分かる。

また、ゼロショットの振る舞いとして、教師なしの事前学習のみでの target task の評価もしている。
fine-tuning はしないので、事前学習したモデルでヒューリスティックスを入れて target task の予測をしている。

  • CoLAでは、モデルが割り当てたトークンの対数確率の平均で例にスコアを付け、しきい値を用いて予測をする
  • SST-2では、各例に「very」というトークンを追加し、モデルの出力分布を「positive」と「negative」の2語に制限し、より高い確率を割り当てた方を予測をする
  • RACEでは、モデルが文章と回答が与えられた条件で、最も高いトークンの対数確率の平均を割り当てた回答を選ぶ
  • DPRDでは、定冠詞代名詞を2つの可能な参照先で置き換え、モデルが代名詞置換後の残りのシーケンスに対してより高いトークンの対数確率の平均を割り当てた解決策を予測する

これはテキストだけではちょっとわかりづらいが、ヒューリスティックスの内容自体がめちゃくちゃ本質的ということではなく、一定の妥当性のある予測方法を構築できれば、教師なしの事前学習をすることで target task が結構解けるということが重要な点である。

ゼロショットが機能するということは、シンプルな言語モデルの学習が自然言語処理に重要な様々な能力を獲得することに役立っていることを示している。これは次のトークンを予測するという言語モデルの学習がトークン間の関係性や言語理解を本質的に効いていて、分布仮説の重要性・強力さを物語っている。
GPT-1 のこの段階では結構解けてすごいというレベルだが、知っての通りこれが将来的にどえらいレベルまで発展していくことになる。ゼロショットの性能を調べた、というところは偉いね。

@yoheikikuta
Copy link
Owner Author

最後は Ablation study で、教師あり fine-tuning の際に補助的な目的関数としての言語モデルの目的関数を除いた場合、LSTM の場合、事前学習なしで 教師あり学習だけした場合、を試している。

補助的な目的関数に関しては大規模なデータセットでは有効で小規模だとそんなに有効でないという方向性で良し悪しという感じだが、LSTM や事前学習なしの場合は殆どの場合で圧倒的に上回っている。
これは Transformer と言語モデルの事前学習の強力さをまざまざと物語っている。実際 LSTM とこれだけ性能差がつくというのは驚きであった。コンテキストを捉えるにはごちゃごちゃモデリングせずに attention でデータから学習させる!という方向性を決定づけた。

@yoheikikuta
Copy link
Owner Author

yoheikikuta commented Sep 20, 2024

ということで一通り読み終わった。

改めて読んでみると、半教師あり学習のところは新しいことは特にないけど、Transformer decoder 使いましたというのがやはりポイントであったことを強く感じた。
zero-shot の性能はこの段階ではモデルの分析として見てみたら結構凄そうというくらいの話だが、これが大きく発展していくわけでやはりここに言及しているというのは GPT-1 論文の重要な点だね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant