GPT-1を読む⑥微調整
前回までに、OpenAIが2018年に発表したGPTの最初のバージョンの論文「Improving Language Understanding by Generative Pre-Training」のセクション3.1「教師なし事前学習」(Unsupervised pre-training)を読み終えました。
これでGPT-1における事前学習の数学的な枠組みが理解できました。
よって、今回はセクション3.2「教師ありファインチューニング」(Supervised fine-tuning)を読み進めていきます。ここでは、事前学習されたモデルを特定のタスクへと微調整するための目的関数を数学的に説明しています。
また、これまでに登場した「教師なし学習、教師あり学習、自己教師あり学習」といった用語に加えて「半教師あり学習」が登場します。
事前学習の目的関数
セクション3.2は次のように始まります。
Eq. 1 の目的に基づいてモデルを訓練した後、パラメータを教師ありのタスクに適応させます。
After training the model with the objective in Eq. 1, we adapt the parameters to the supervised target task.
「Eq. 1の目的」とは、事前学習の目的関数のことです。ここに再掲します。
$$
L_1(\mathcal{U}) = \sum\limits_i \log P(u_i | u_{i-k}, \dots, u_{i-1}; \Theta)
$$
これは、観測されたデータに対するモデルによる尤度を表しており、これを最大化することが事前学習の目的でした。
$${k}$$は、文脈を与えるシーケンスの長さで、$${\Theta}$$はモデルのパラメータ(例えば、ニューラルネットワークの重み、バイアスなど)を意味します。
つまり、確率$${P}$$は、長さ$${k}$$のシーケンスを条件として与えられた時に、パラメータ$${\Theta}$$を持つモデルが次に続くトークン$${u_i}$$に与える確率です。
実際にシーケンスはラベルなしのデータセットから得たもので、$${u_{i-k}, \dots, u_{i-1}, u_i}$$であり、その最後のトークンは実際に観測されたデータから来ているます。よって、モデルが次に続くトークンとして$${u_i}$$に一番大きな確率を与えることは、モデルの予測が実際のデータにマッチしていることになります。
ここで、我々はモデルのパラメータ$${\Theta}$$を調節することで現実に起きた事象に対する確率を大きくなるようにしているわけです。これは、実際のデータから単に統計を取っているのとは異なります。あくまでもモデルが入力データを使って計算した確率です。そのため、大量の訓練データによって学習がうまく行われれば、訓練データセットに存在しないシーケンスを条件として判断することが可能となります。
なので、尤度という言葉を使うときは、モデルがデータをどのくらい尤もらしいと考えているかという意味合いがあります。
なお、対数(log)が使われているのは、計算が簡単になったり数値計算が安定したりするからです。詳しくは、こちらの記事を参照してください。
この事前学習によって、トランスフォーマー・ブロックを含んだGPT-1モデルのパラメータが調整されました。GPT-1のモデルを数式で表したものを以下に再掲します。
$$
\begin{aligned}
h_0 &= UW_e + W_p \\
h_l &= \text{transformer\_block}(h_{l-1}) \ \forall l \in [1, n] \\
P(u) &= \text{softmax}(h_nW_e^\top)
\end{aligned}
$$
事前学習されたパラメータをさらに特定のタスクに対して微調整するのがファインチューニングの目的となります。
ファインチューニングの目的関数
ラベル付きデータセット
論文は次のように進みます。
ラベル付きデータセット $${C}$$ は、入力のトークンのシーケンス $${x_1, \dots, x_m}$$ とラベル $${y}$$ から構成されているとします。
We assume a labeled dataset $${C}$$, where each instance consists of a sequence of input tokens, $${x_1, \dots, x_m}$$, along with a label $${y}$$.
要するに、教師あり学習のためのデータセットは、入力シーケンスとラベル(正解データ)が準備されるということです。これらは以下に続く数式に対する前提です。
ラベルに対する条件確率
ラベルありのデータセットからの入力が事前学習されたモデルによってどのように処理されるのでしょうか。論文を読み続けましょう。
入力は事前学習されたモデルを通過し、最終トランスフォーマー・ブロックの活性化 $${h_l^m}$$ が得れれます。これが、追加された線形出力層(パラメータ $${W_y}$$を持つ)に渡され、$${y}$$ が予測されます。
$${P(y|x^1, \dots, x^m) = \text{softmax}(h_l^m W_y)}$$
The inputs are passed through our pre-trained model to obtain the final transformer block’s activation $${h_l^m}$$, which is then fed into an added linear output layer with parameters $${W_y}$$ to predict $${y}$$:
$${P(y|x^1, \dots, x^m) = \text{softmax}(h_l^m W_y)}$$
「入力は事前学習されたモデルを通過し、最終トランスフォーマー・ブロックの活性化 $${h_l^m}$$ が得れれます」における$${h_l^m}$$を解説します。
最後のトランスフォーマーを$${l}$$番目と表現していますが、これは$${n}$$版目の間違えだと思われます。というのも、トランスフォーマー・ブロックの定義は以下のようになっており、ブロックの番号$${l}$$は、$${1}$$から$${n}$$まであるからです。
$$
h_l = \text{transformer\_block}(h_{l-1}) \ \forall l \in [1, n]
$$
ここでは気にせずに$${h_l}$$が最終ブロックとします。なお、さらに$${m}$$がついて$${h_l^m}$$となっているのはなぜでしょうか。これは、ファインチューニングにおける確率の式をよく見るとわかります。
$$
P(y|x^1, \dots, x^m) = \text{softmax}(h_l^m W_y)
$$
つまり、$${m}$$は、シーケンスの最後のトークン$${x^m}$$に対応します。よって、$${h_l^m}$$は、最後のトランスフォーマー・ブロックの出力シーケンスの最後のトークンの埋め込みベクトルを意味します。
このため、この手のファインチューニングでは、最後のトークンにタスクのための情報が集まるようにパラメータが微調整されることになります。
また、追加された線形変換$${W_y}$$によって、埋め込みベクトルの次元(要素数)からラベルの数だけの要素があるベクトルに変換されます。尤も大きな要素が予測されるラベルとなるのでソフトマックスが使われています。
なお、ここでのラベル$${y}$$は、タスクによって異なります。分類ならばクラスを意味します。これについては、セクション3.3「タスク特有の入力変換」(Task-specific input transformations)がより詳しく扱っています。
尤度の最大化
ファインチューニングの目的は上記の条件確率を正解のラベルに対してより大きくなるようにモデルのパラメータを微調整することです。
これによって、以下を最大化することが目的となります。
$${L_2(\mathcal{C}) = \sum\limits_{(x,y)} \log P(y|x^1, \dots, x^m)}$$
This gives us the following objective to maximize:
$${L_2(\mathcal{C}) = \sum\limits_{(x,y)} \log P(y|x^1, \dots, x^m)}$$
パラメータの明示はありませんが、これも尤度です。
$${L_2(\mathcal{C})}$$は、ラベル付きデータセット$${\mathcal{C}}$$をもとに計算した尤度を意味します。尤度の和を$${\sum\limits_{(x,y)}}$$で表現しているのは、すべての入力$${x}$$とそれに付随するラベル$${y}$$に対して尤度を計算して足し合わせているからです。
これは、確率の掛け算の対数を計算していることで可能となってます。
$$
\log \prod\limits_{(x,y)} P(y|x^1, \dots, x^m) = \sum\limits_{(x,y)} \log P(y|x^1, \dots, y^m)
$$
$${\prod\limits_{(x,y)}}$$は、すべての$${(x,y)}$$ペアに対する確率の積を計算するという意味です。確率の値は1以下なので、たくさんの確率を掛け合わせると非常に小さな値になり、コンピュータが扱える数値精度の限度を超える可能性があります。
そこで、対数を取ることで、データセット全体に対する確率の和を計算する式へと置き換えています。また、これによってバッチによる訓練も可能となります。
半教師あり学習
論文は次のように続きます。
さらに、ファインチューニングにおいて言語モデリングを補助目的として含めることが、(a) 教師ありモデルの汎化性能を向上させ、(b) 収束を速めるのに役立つことがわかりました。
We additionally found that including language modeling as an auxiliary objective to the fine-tuning helped learning by (a) improving generalization of the supervised model, and (b) accelerating convergence.
ここで補助の目的として、言語モデリング(言語モデルの標準的な目的で訓練すること)を追加すると、次のような効果があることが分かったと述べています。
(a) 教師ありモデルの汎化性能が向上する
(b) 学習の収束(損失値が小さくなること)が速くなる
これは、ある意味当然かと思われます。
なぜなら、データセット$${\mathcal{C}}$$には、事前学習で扱われていないシーケンスがたくさんあるので、そのデータを使って言語モデリングを行うことはモデルの汎化性能を向上するでしょう。また、タスクで実際に使われるシーケンスから学ぶことはタスクそのものに役に立つからです。よって、学習の収束は速くなります。
論文を読み進めます。
これは以前の研究[50, 43]とも一致しており、彼らもこのような補助目的を用いることで性能が向上することを観察しています。具体的には、次の目的関数を最適化します(重み $${\lambda}$$ を用いて):
$${L_3(\mathcal{C}) = L_2(\mathcal{C}) + \lambda * L_1(\mathcal{C})}$$
This is in line with prior work [50, 43], who also observed improved performance with such an auxiliary objective. Specifically, we optimize the following objective (with weight λ):
$${L_3(\mathcal{C}) = L_2(\mathcal{C}) + \lambda * L_1(\mathcal{C})}$$
[50, 43]とは、参照された論文の番号です。今回は辿りませんが、以前の研究に興味のある場合は、以下の論文に目を通してみてください。
[43] M. E. Peters, W. Ammar, C. Bhagavatula, and R. Power. Semi-supervised sequence tagging with bidirectional language models. ACL, 2017.
[50] M. Rei. Semi-supervised multitask learning for sequence labeling. ACL, 2017.
なお、これらの論文では、「semi-supervised」(半教師あり)という言葉を使っています。半教師あり学習は、ラベル付きデータとラベルなしデータの両方を使用してモデルを訓練する方法を意味します。
事前学習では、教師なし学習(あるいは自己教師あり学習)を行いましたが、ファインチューニングでは教師あり学習と教師なし学習(自己教師あり学習)を組み合わせた半教師あり学習となっています。
さて、、半教師学習を数式にすると次の目的関数となります。
$$
L_3(\mathcal{C}) = L_2(\mathcal{C}) + \lambda * L_1(\mathcal{C})
$$
半教師あり学習の目的関数$${L_3}$$は、教師あり学習$${L_2}$$と教師なし学習$${L_1}$$の組み合わせです。$${L_1}$$は前述した通り、言語モデルの標準的な目的です。また、$${\lambda}$$は、$${L_1}$$と$${L_2}$$のバランスを取るためのハイパーパラメータです。
数式にしておくとこのように簡潔に表現できるのが素晴らしいですね。
このサブセクションは次のように結ばれています。
全体として、ファインチューニング中に必要な追加のパラメータは $${W_y}$$ と、区切りトークンの埋め込み(セクション3.3で説明)だけです。
Overall, the only extra parameters we require during fine-tuning are W y , and embeddings for delimiter tokens (described below in Section 3.3).
これは、ファインチューニングを行う際にモデルや訓練の方法などに大きな変更が必要ないという主張を改めて述べています。モデルへの変更は、線形変換$${W_y}$$が追加されただけですし、訓練データをモデルに入力する際に「区切りトークンの埋め込み」が追加されただけです。
ただし、「区切りトークンの埋め込み」についてはセクション3.3で解説されています。
次回予告
次回は、セクション3.3「タスク特有の入力変換」(Task-specific input transformations)を読み進んでいきましょう。
ここでやっと、この図が登場します。

お楽しみに!
