GPT-1を読む⑦入力変換
前回までに、OpenAIが2018年に発表したGPTの最初のバージョンの論文「Improving Language Understanding by Generative Pre-Training」のセクション3.2「教師ありファインチューニング」(Supervised fine-tuning)を読み終えました。
これによって、事前学習されたモデルを特定のタスクへと微調整するための目的関数を数学的に理解しました。
よって、これまでに、事前学習とファインチューニングの枠組みがわかったのですが、より具体的な言語タスクに対するイメージは、まだ湧いてきません。
例えば、2つの入力文があるようなタスクに対してどのように対応できるのでしょうか。
そこで、今回はセクション3.3「タスク特有の入力変換」(Task-specific input transformations)を読み進めていきます。事前学習されたモデルを微調整するためのタスク特有の入力の仕方について解説しています。
下図の右側が今回フォーカスされる部分となります。

今回のセクションでは、モデル自体を大幅に変更することなく、特有の言語タスクに対応できることが理解できます。
これまでに登場した数式のおさらい
前回までに、この論文にある全ての数式が登場しました。これらの数式は、目的関数やモデルの構造を表すものです。次に、モデルをファインチューニングする際の入力の形式の話になるのですが、その前にこれまでの数式をざっくりとおさらいします。
教師なしの事前学習
事前学習は、ラベルなしのデータセットを利用します。その中からたくさんのシーケンスを作ることができます。例えば、あるトークンが現れる確率をその直前のシーケンスを条件として予測するという訓練を大量に行うことでモデルが言語の構造やパターンを学習します。
これを数学的に表現すると、事前学習の目的は次の尤度を最大化することです。
$$
L_1(\mathcal{U}) = \sum\limits_i \log P(u_i \mid u_{i-k}, \dots, u_{i-1}; \Theta)
$$
上式では、データセットを$${\mathcal{U} = \{u_1, \dots, u_n\}}$$としています。また、この中のあるトークン$${u_i}$$から$${k}$$個のトークンまで遡ったシーケンス$${u_{i-k}, \dots, u_{i-1}, u_k}$$を条件として、その次に来るトークン$${u_i}$$の確率を予測します。
また、ここで$${\Theta}$$とあるのは、モデルのパラメータの集まりを意味します。
よって、観測されたデータが出現する確率の予測はモデルとパラメータによって決まります。GPTのモデルは、トランスフォーマーのデコーダを基本としており、パラメータは学習によって調節されます。

このモデル構造は、数式として次のように表現されていました。
$$
\begin{aligned}
h_0 &= UW_e + W_p \\
h_l &= \text{transformer\_block}(h_{l-1}) \quad \forall l \in [1, n] \\
P(u) &= \text{softmax}(h_n W_e^\top)
\end{aligned}
$$
まず、$${h_0}$$は、条件となるシーケンス$${U = (u_{-k}, \dots, u_{-1})}$$を埋め込みへと変換($${W_e}$$)し、位置情報を追加($${W_p}$$)したものです。
$$
h_0 = UW_e + W_p
$$
上図の一番下にある「Text & Position Embed」の部分に相当します。
次に、トランスフォーマーのデコーダをベースにしたトランスフォーマー・ブロック(transformer_block)によって、アテンション機構などによる特徴量の抽出を行っています。
$$
h_l = \text{transformer\_block}(h_{l-1}) \quad \forall l \in [1, n]
$$
これが$${n=12}$$段の階層構造になっており、上図の真ん中の水色の長方形の部分です。
念の為に、ここのでの$${n}$$は、$${\mathcal{U} = \{u_1, \dots, u_n\}}$$にあるコーパスの総数$${n}$$とは関係ありません。
最後のトランスフォーマー・ブロックからの出力$${h_n}$$が線形変換($${W_e^\top}$$)しています。この変換は埋め込み行列$${W_e}$$を転置したもので、トランスフォーマー・ブロックを通過して計算された埋め込みベクトルがどのトークンの埋め込みと関係が強いのかの内積を計算しています。これをソフトマックスに通すことで、確率分布へと変換されます。
$$
P(u) = \text{softmax}(h_n W_e^\top)
$$
以上より、モデルはトークン$${u}$$の確率$${P(u)}$$を直前のシーケンス$${U = (u_{-k}, \dots, u_{-1})}$$を条件として予測できるようになります。
教師ありのファインチューニング
事前学習の後は、特定のタスクに対して教師あり学習を行いモデルのパラメータを微調整(ファインチューニング)します。
よって、ラベル付きのデータセット$${\mathcal{C}}$$を使います。このデータセットには、入力シーケンス$${x^1, \dots, x^m}$$とそのラベル$${y}$$が準備されています。
なお、ラベル$${y}$$はタスク特有の値なので、事前学習のように必ずしもトークンとは限りません。
これらの入力を条件として事前学習されたモデルはラベルの確率を予測します。
$$
P(y \mid x^1, \dots, x^m) = \text{softmax}(h_l^m W_y)
$$
ただし、線形変換$${W_y}$$はタスク特有の答えを出すための変換です。例えば、分類するクラスが10個だとしたら、10個の値を出力するような変換となります。
ファインチューニングでは、以下の尤度を最大化するのが目標です。
$$
L_2(\mathcal{C}) = \sum\limits_{(x, y)} \log P(y \mid x^1, \dots, x^m)
$$
なお、$${\sum\limits_{(x, y)}}$$とは、全ての(入力$${x}$$、ラベル$${y}$$)のペアに対して尤度の和を計算するという意味です。
さらに、補助的な目的として、事前学習と同様の言語モデリングを追加しています。これは、ラベル付きのデータセット$${\mathcal{C}}$$のラベルを使わずに、入力文章のシーケンスを利用したものです。よって、タスク特有の語彙を学習することができます。
事前学習の目的関数$${L_1}$$を流用できるので、全体としての目的関数は次になります。
$$
L_3(\mathcal{C}) = L_2(\mathcal{C}) + \lambda * L_1(\mathcal{C})
$$
$${\lambda}$$は、$${L_1}$$と$${L_2}$$のバランスを取るためのハイパーパラメータです。
また、教師あり学習と教師なし学習を合わせているので、ここのでのファインチューニングを半教師あり学習とも呼びます。
タスク特有の入力変換
これまでの話では、事前学習とファインチューニングの一般的なアプローチを数学的な表現を通して理解しました。
ただし、言語に関連したタスクにはさまざまなものがあり、上述の説明だけでは、具体的なタスクに対するイメージが湧きません。
では、セクション3.3「タスク特有の入力変換」(Task-specific input transformations)を読み進めましょう。
テキスト分類
まず、テキスト分類のタスクについて次のように述べています。
いくつかのタスク、例えばテキスト分類では、上述のように直接モデルをファインチューニングすることができます。
For some tasks, like text classification, we can directly fine-tune our model as described above.
これは、入力文章に特別な形式を導入する必要がないという意味です。ただし、出力部分は次に来るトークンの確率ではなく、クラスの確率を計算しているので出力部分の線形変換は異なります。
構造化された入力
次に、論文は他の言語タスクについて述べています。
「質問応答」や「テキスト含意」のようなタスクでは、入力文章を2つ順番に並べたり、(文書、質問、回答)の3つの組など、構造化された入力が含まれます。
Certain other tasks, like question answering or textual entailment, have structured inputs such as ordered sentence pairs, or triplets of document, question, and answers.
「質問応答」や「テキスト含意」に関しては、後に詳細がありますが、ここでは、これらのタスクが(一つの入力文章だけでなく)複数の要素を持つ構造化された入力を使うと言っています。
では、どうするのでしょうか。続きを読みます。
私たちの事前訓練モデルは連続するテキストのシーケンスで訓練されているため、これらのタスクに適用するにはいくつかの修正が必要です。
Since our pre-trained model was trained on contiguous sequences of text, we require some modifications to apply it to these tasks.
そもそも事前学習されたモデルは、1つのシーケンスを入力としているので、複数の要素を持つ入力に対応するには何らかの修正が必要だと言っています。
何を変更するのかはまだ具体的には述べられていません。続きを読みます。
以前のアプローチ
以前の研究では、タスク固有のアーキテクチャが提案されていました。これは、転移学習によって得られた表現の上に別に構築されるものです。このやり方では、タスクごとにモデルの構造に大幅なカスタマイズを導入することになります。また、追加された構造では転移学習を使用することはできません。
Previous work proposed learning task specific architectures on top of transferred representations [44]. Such an approach re-introduces a significant amount of task-specific customization and does not use transfer learning for these additional architectural components.
ここでは、以前に提案されたアプローチについて述べています。それは、タスクごとに特有のモデル構造を追加することで、異なる入力構造に対応する手法であり、簡単に言うと手間がかかります。また、追加されたモデル構造は転移学習を利用できないので、新たに学習する必要が有ります。
この論文のアプローチ
そこで、この論文では異なるアプローチを取っています。
代わりに、構造化された入力の要素を順番に並べることで、事前学習モデルが処理できるシーケンスに変換します。この入力変換により、タスクごとにモデル構造への大きな変更を加える必要がなくなります。
Instead, we use a traversal-style approach [52], where we convert structured inputs into an ordered sequence that our pre-trained model can process. These input transformations allow us to avoid making extensive changes to the architecture across tasks.
事前学習されたモデルは入力として一つのシーケンスを扱うようになっているので、モデル構造をタスクに合わせたくなかったら、入力構造を変えるしかありません。
タスク固有の入力構造に複数の要素がある場合は、全ての入力要素を含んだ一つのシーケンスとして変換するということです。これが「タスク特有の入力変換」(Task-specific input transformations)となります。
これらの入力変換について簡単に説明します。図1には視覚的な説明があります。すべての変換には、ランダムに初期化された開始トークンと終了トークン($${\braket{s}, \braket{e}}$$)を追加することが含まれます。
We provide a brief description of these input transformations below and Figure 1 provides a visual illustration. All transformations include adding randomly initialized start and end tokens ($${\braket{s}, \braket{e}}$$).

上図には、分類(Classification)、含意(Entailment)、類似性(Similarity)、選択問題(Multiple Choice)のタスクに対する入力が示されています。
「すべての変換には、ランダムに初期化された開始トークンと終了トークン($${\braket{s}, \braket{e}}$$)を追加する」とあります。
「Start」と表示されているのが開始トークン($${\braket{s}}$$)で、「Extract」(抽出)と表示されているのが終了トークンに($${\braket{e}}$$)相当します。
上図からもわかるようにどの入力も開始と終了トークンが有ります。また、「Delim」と表示されているトークンもありますが、これは後に述べられています。
では、論文の続きを読んで、タスク特有の入力変換の説明を見ていきましょう。
テキスト含意
まず、論文では、「含意」(entailment)あるいは「テキスト含意」(text entailment)の意味が書かれていないので、ここで簡単に説明します。
テキスト含意では、あるテキスト(前提文)と別のテキスト(仮説文)の関係を扱います。具体的には、前提文が真であるときに仮説文も真であるならば、前提文は仮説文を含意すると言います。
つまり、前提文が仮説文を論理的に含んでいるかどうかを判断するタスクです。いかにいくつかの具体例を挙げます。
前提文: 猫はベッドの上で寝ています。
仮説文: 動物がベッドの上にいます。
この場合、前提文が真であるならば、仮説文も真なので、前提文は仮説文を含意しています。
前提文: 太郎は毎日ジョギングをします。
仮説文: 太郎は運動が好きです。
太郎は痩せるために嫌々でも毎日ジョギングしているかもしれないので、前提文は仮説文を含意していません。
では、テキスト含意のタスクに対して、どのように入力変換するのでしょうか。論文を読み続けます。
テキスト含意
含意タスクでは、前提文 (premise、p) と仮説文 (hypothesis、h) のトークン化されたシーケンスを
連結して一つのシーケンスにします。その際に、前提文 (p) と仮説文 (h)の間に区切り(デリミター)のトークン($)を挟んで連結します。
Textual entailment
For entailment tasks, we concatenate the premise p and hypothesis h token sequences, with a delimiter token ($) in between.

「Delim」(Delimiter)が区切りのトークン$に相当します。これが前提文(Premise)と仮説文(Hypothesis)を区切っています。全体として、一つのシーケンスになっているので、事前学習されたモデルはその特徴量を抽出することができます。
最後の線形変換では、テキスト含意の分類を出力します。例えば、次のような3つのクラスがよく使われます。
含意 (Entailment): 前提文が仮説文を含意する
矛盾 (Contradiction): 前提文が仮説文と矛盾する
中立 (Neutral): 前提文が仮説文を含意も矛盾もしない
テキスト類似性
テキスト類似性のタスクは、2つのテキスト間の意味的な類似性を評価するものです。具体的には、与えられた2つのテキストがどれだけ似ているか、あるいは異なるかを定量的に評価します。
その出力は通常、0から1の範囲のスコアとして計算されます。1に近いほどテキストが類似していることを示します。例えば、0.8や0.9といった高いスコアは高い類似性を示し、0.1や0.2といった低いスコアは低い類似性を示します。
類似性
類似性タスクでは、比較される2つの文に特定の順序はありません。このため、2つの文を前後に(デリミタを挟んで)並べた入力シーケンスを2つ準備し、それぞれのシーケンスを独立に処理して2つの出力ベクトル$${h_l^m}$$を生成します。これらは要素ごとに加算され、線形出力層に入力されます。
Similarity
For similarity tasks, there is no inherent ordering of the two sentences being compared. To reflect this, we modify the input sequence to contain both possible sentence orderings (with a delimiter in between) and process each independently to produce two sequence representations $${h_l^m}$$ which are added element-wise before being fed into the linear output layer.
テキスト含意と異なり、テキスト類似性のタスクでは、2つのテキストの前後関係に特別な意味がありません。つまり、2つのテキストが似ているかどうかだけが重要なので、モデルが不必要にテキストの前後関係を基準に評価しないようにする必要が有ります。
よって、テキスト1とテキスト2があるとして、モデルがそれらの並び順に依存しないように、「テキスト1$テキスト2」と「テキスト2$テキスト1」($は区切りトークン)の二つの入力シーケンスを用意します。
それぞれのシーケンスをモデルに別々に入力して得た2つの出力ベクトルを要素ごとに加算し、その結果に対して最終的な線形変換とシグモイド関数を適用します。

以上より、モデルは2つのテキスト間の類似性を(テキストの順序に依存するバイアスを排除して)評価できるようになります。
質問応答と常識推論
質問応答(Question Answering)と常識推論(Commonsense Reasoning)のタスクは、次のようなタスクになります。
質問応答: 文脈文書(例えば、記事や段落)とその文脈に関連する質問を受け取り、その質問に対する適切な回答を生成します。回答は文脈文書内の情報に基づいています。
常識推論: 日常的な常識や背景知識を用いて質問に答えます。このタスクは、文脈から明示的に答えが得られない場合でも、一般的な知識や論理を駆使して正しい回答を導き出すことを要求されます。
では、これらのタスクに対しての入力変換はどうなっているのでしょうか。論文を読み進めます。
質問応答および常識推論
これらのタスクでは、文脈文書$${z}$$、質問$${q}$$、および複数の可能な回答 $${\{ a_k \}}$$ が与えられます。文脈文書と質問をそれぞれの可能な回答と連結し、デリミタートークンを挟んで $${[z; q; \$; a_k ]}$$ というシーケンスを作成します。これらのシーケンスをモデルで独立して処理し、その後ソフトマックス層を通して正規化し、可能な回答に対する出力分布を生成します。
Question Answering and Commonsense Reasoning
For these tasks, we are given a context document $${z}$$, a question $${q}$$, and a set of possible answers $${\{ a_k \}}$$. We concatenate the document context and question with each possible answer, adding a delimiter token in between to get $${[z; q; \$; a_k ]}$$. Each of these sequences are processed independently with our model and then normalized via a softmax layer to produce an output distribution over possible answers.
どちらのタスクも、文脈$${z}$$、質問$${q}$$、回答のための複数の選択肢$${\{a_k\}=\{a_1, \dots, a_n\}}$$が与えられます。
上述の入力方式では、各回答に対して別々のシーケンスを準備します。これは図を見るのが一番わかりやすいです。

つまり、「Context」にあたる部分は、文脈$${z}$$と質問$${q}$$をつなげたもので、その次にデリミターを挟んで、N個ある回答の一つを連結しています。よって、N個の入力シーケンスを準備します。
その一つ一つを$${[z; q; \$; a_k ]}$$と表現しています。ここでのセミコロンは読みやすいように要素を区切っているだけで、特別なトークンではありません。
最終的に、それぞれの入力シーケンスを独立に処理したもの(スコア、数値)を集めて、ソフトマックスを通すことで確率分布へと変換します。予測される回答は、出力分布から確率の高いもの選ばれます。ただし、確率分布が必要ないならば、単純にスコアが一番高い回答を選びます。
次回予告
今回で、GPT-1の論文のセクション3「フレームワーク」を読み終えました。これによって、モデルの構造と学習の方法が理論的に理解できました。
以前に定めたこの論文を読む方針は、「教師なしの事前学習」と「ファインチューニング」などの仕組みや効果をさらに深く理解したいので、「フレームワーク」を重点的に読むということでした。
よって、その目標は達成したのですが、この論文にはまだ続きがあり、実験の設定、結果、分析などへと続きます。モデルの理論が実際にどのような成果を達成したのか、何か新しい発見や問題などが議論されていないかを確認していきましょう。ただし、これらを一字一句追う必要はないので、いくつかの点をピックアップして読んでいきます。
お楽しみに!
