見出し画像

GPT-1を読む④事前1

前回は、OpenAIが2018年に発表したGPTの最初のバージョンの論文「Improving Language Understanding by Generative Pre-Training」を読む方針を決めました。

まずは、「3 Framework」(セクション3「フレームワーク」)を重点的に読むことにしました。これによって、GPT-1における「教師なしの事前学習」と「ファインチューニング」などの理解を深めるのが目的です。

今回からの数記事で、このセクションの全体を読み、最終的には、この論文において代表的な以下の図を理解することを目指します。

論文図1

今記事では、セクション3「フレームワーク」から読み始めます。最初のサブセクションであるセクション3.1「教師なしの事前学習」で登場する目的関数を中心に解説します。


GPT-1の訓練

2つの段階

セクション3の「フレームワーク」は次のように始まります。

訓練の手順には二つの段階があります。第一段階は、大規模なテキスト・コーパスで高容量の言語モデルの訓練をすることです。その次の段階は、モデルを識別タスクに適応させるために行う、ラベル付きのデータを用いるファインチューニングです。

Our training procedure consists of two stages. The first stage is learning a high-capacity language model on a large corpus of text. This is followed by a fine-tuning stage, where we adapt the model to a discriminative task with labeled data.

language_understanding_paper.pdf (openai.com)

つまり、訓練は2つの段階(ステップ)に分かれています。

  1. 高容量の言語モデルの訓練(大規模なテキスト・コーパス使用)

  2. ファインチューニング(識別タスク特有のラベル付きのデータ)

このセクション全体がこの二つのステップについての解説になっています。

セクション3の全体を見渡すと、最初のサブセクションのタイトルが「3.1 Unsupervised pre-training」(教師なし事前学習)となっているので、第一ステップがすでに何度か言及している教師なし(ラベルなし)の事前学習であることは想像がつきます。ここでキーワードとして登場する「テキスト・コーパス」と「高容量モデル」について簡単に説明します。

テキスト・コーパス

最初の高容量の言語モデルの訓練で使用されるテキスト・コーパスとは、テキスト(自然言語)データを大量に集めたものを指します。書籍、記事、ウェブページなどの多様なソースから収集されたテキストのデータベースです。ラベル付けされていないのですが、大量に得ることができます。

簡単に言うと、テキスト・コーパスは、たくさんの文章が入っているデータセットです。

高容量とは

高容量(high-capacity)とは、多くのパラメータを持ち、複雑なパターンや情報を学習できる能力を指します。これは、大量のデータを使って訓練され多様な表現や知識を抽出することができるモデルを形容する言葉です。

画像系のモデルで例えると、ResNetなどの畳み込み層の部分がよくバックボーンとして使われたのに似ています。様々な特徴量を抽出する能力があるモデルをさして高容量と形容します。

よって、第一ステップでは、大量のラベルなしテキスト・コーパスを利用した教師なし事前学習で高容量のモデルを訓練することを目指します。

教師なしの事前学習

セクション3.1「教師なしの事前学習」(3.1 Unsupervised pre-training)は次のように始まります。

教師なし(ラベルなし)のトークン・コーパス $${\mathcal{U} = \{u_1, \dots , u_n\}}$$ が与えられた場合、標準的な言語モデルの目的は、次の尤度を最大化することです:

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

ここで、$${k}$$ はコンテキストウィンドウのサイズを表し、条件付き確率 $${P}$$ はパラメータ $${\Theta}$$ を持つニューラルネットワークを使用してモデル化されます。これらのパラメータは確率的勾配降下法を用いて訓練されます【51】。

Given an unsupervised corpus of tokens $${\mathcal{U} = \{u_1, \dots , u_n\}}$$, we use a standard language modeling objective to maximize the following likelihood:

$${L_1(\mathcal{U}) = \sum\limits_i \log P(u_i | u_{i-k}, \dots, u_{i-1}; \Theta)}$$

where $${k}$$ is the size of the context window, and the conditional probability $${P}$$ is modeled using a neural network with parameters $${\Theta}$$. These parameters are trained using stochastic gradient descent [51].

language_understanding_paper.pdf (openai.com)

式もありちょっと長いので、分解して解説します。

トークン・コーパスとは

先ほど「テキスト・コーパス」という言葉がありましたが、ここでは「トークン・コーパス」となっています。これは、言語モデルの入力データは、生のテキストではなく、トークンとして処理されたものだからです。なので、テキストの集まりというより、トークン化されたテキストの集まりという意味でトークン・コーパスと呼んでいます。

文章にある言語の基本要素を分解したものをトークンと呼びます。テキストからトークンへと変換することをトークン化と呼びます。

通常、トークンは整数値で、その値に対応する多次元の埋め込みベクトルが、そのトークンの特徴量を表しています。よって、トークンは埋め込みベクトルを取得するためのインデックスの役割を果たします。

この辺りは、トランスフォーマーなどを含めた一般の言語モデルと同じアプローチです。

論文では、トークン・コーパスを数式で$${\mathcal{U} = \{u_1, \dots, u_n \}}$$と表現しています。これはトークン化されたテキストが文章内の順番通りに、たくさん入っているデータセットだと考えてください。

極端な例として、「犬と犬と犬と」と言う文章がトークンの順列として「100、25、100、25、100、25」だとします。この文章がトークン・コーパスの最初の文章の始まりだとすると、$${u_1 = 100, u_2 = 25, u_3 = 100, u_4 = 25, u_5 = 100, u_6 = 25}$$となる、といった具合です。

なお、文章をトークン化したものをよく「シーケンス」(順番に並んだもの)と呼びます。

よって、シーケンスの頭から順番にトークンを辿っていくと文章を読んでいることに相当します。もちろん、人間には意味のない整数値の羅列ですが、対応するトークンをテキストに戻すことができれば元の文章になります。

一方で、言語モデルは、トークンから対応する埋め込みベクトルを引き出してアテンションなどを使ってトークン間の関係から文脈(特徴量)を抽出します。

このようなトークン・コーパスの話をしているのは、次に論文が述べる言語モデルの標準的な目的を数式として表現するためです。なので、現実のトークン・コーパスの構造が単純なトークンの順列になっているとは限りません。

言語モデリング

言語モデリングとは、ある文脈に基づいて次に来る単語や現在の単語の確率を予測することで学習することです。

最近はよく知られていることですが、言語モデルを訓練するための標準的な目的は、「与えられたシーケンスに続く、次に来るトークンを予測する」モデルを訓練することです。

「標準的な」という表現は「よくある」「みんながやる」という意味です。つまり、多くの研究者や実践者が一般的に採用する方法や手法を指します。ただし、そうでなくてはならないという基準があるわけではありません。

平たく言うと、与えられた文章に続く言葉を予測することが言語モデルでよく使われる目的です。つまり、条件として与えられる文章は不完全で続きがあるものです。

例えば、「足元にサッカーボールが」と言う文章に続く次の言葉はなんでしょうという質問に対して、「ある」と続くのか、「ない」となるのか、それとも「あれば」となるのか、それぞれの確率を計算するようなイメージです。

ある意味、言語モデルの目的は非常に単純です。ただし、この目的を達成するためには、言語モデルは与えられた文章からの文脈を読み取って、あらゆる可能性(確率)を計算する必要があります。

そのために大量のトークン・コーパスによる教師なし学習が行われます。

教師なし学習である理由

このような言語モデルの訓練では、ラベル付が必要ありません。大量のトークン・コーパスの一部を取り出してきて、その次に続く言葉を予測するという訓練をすれば良いからです。よって、教師なし学習となります。見方を変えると、そもそものデータセットの中にラベルがあるので自己教師あり学習とも呼ばれます。

つまり、やっていることの本質は、教師あり学習です。ラベル付をする手間が掛からないだけです。それでも大量のトークン・コーパスを利用できるので非常に効果的な学習方法です。

このようにして、言語モデルは言語を理解する能力をつけます。ただし、モデルを訓練するには目的関数の数式化が必要です。

目的関数の数式化

論文では、「標準的な言語モデルの目的は、次の尤度ゆうどを最大化することです」と述べ、最大化するべき目的関数を次のように数学で表現しています。

$$
L_1(\mathcal{U}) = \sum\limits_i \log P(u_i | u_{i-k}, \dots, u_{i-1}; \Theta)
$$

$${L1(\mathcal{U})}$$は対数尤度(log likelihood)ですが、論文では単に尤度(likelihood)と呼んでいます。この尤度を最大化するのが言語モデルの標準的な目的だというわけです。

ちょっと遠回りかもしれませんが、条件確率や対数尤度について復習しましょう。

条件確率について

条件確率の概念を、天気予報で説明すると、「風や湿度などのデータが与えられた時に、1時間後に雨が降る確率」といった具合に、ある条件のもとで起こり得る事象の確率のことです。

上述の言語モデルの目的関数では、あるシーケンス$${u_{i-k}, \dots, u_{i-1}}$$が与えられた時に、次に続くトークン$${u_i}$$の確率を考えています。

条件として与えられるシーケンスが、$${u_{i-k}, \dots, u_{i-1}}$$となっているのは、$${u_i}$$の手前のトークンである$${u_{i-1}}$$から$${k}$$個さかのぼった位置から始まるからです。つまり、$${k}$$は条件として与えられるシーケンスの長さです。

ここまでの説明だと、トークンのシーケンスの表現が抽象的で、ちょっと分かりずらいので、具体的に$${i}$$や$${k}$$の値を設定しみましょう。

例えば、$${i = 12}$$、$${k = 5}$$とします。すると、$${i = 12}$$の一つ手前の$${11}$$から5個遡《さかのぼ》った$${7}$$番目のトークンから始まるシーケンスが条件となります。

$$
u_{7}, u_{8}, u_{9}, u_{10}, u_{11}
$$

つまり、7番目のトークンから11番目のトークンまでの5個のトークンが含まれたシーケンスが条件となります。これを条件として$${u_{i=12}}$$のトークンが次に来る確率は次のように表現できます。

$$
P(u_{12}|u_{7}, \dots, u_{11}; \Theta)
$$

このような条件確率を、一般的に$${P(u_i | u_{i-k}, \dots, u_{i-1}; \Theta)}$$と表現しているわけです。

なお、$${\Theta}$$については、次の尤度の説明で触れます。

尤度とは

目的関数の式をここに再掲します。

$$
L_1(\mathcal{U}) = \sum\limits_i \log P(u_i | u_{i-k}, \dots, u_{i-1}; \Theta)
$$

ここで$${\Theta}$$とあるのは、あるモデルのパラメータの集まりを意味します。例えば、トランスフォーマーのニューラルネットワークで使われる重みやバイアスなどのパラメータの集合です。

つまり、モデルが予測する確率は、パラメータの値によって決まることを明示しています。ここで、尤度ゆうどという概念が登場します。

尤度とは、統計学や機械学習において、ある観測データが特定のモデルやそのパラメータのもとでどれだけ起こりやすいか(確率が高いか)を示す尺度です。つまり、そのモデル(とパラメータ)が観測されたデータをどれだけ「尤もらしい」かを評価していることになります。

これは、過去のデータから単に統計を取って計算した条件確率と必ずしも一致しません。あくまでも、モデルが持つ関数(ニューラルネットワークなど)によって解釈された上での予測です。

その関数は、複雑である意味ブラックボックスです。しかし、みたこともないパターンにも対応できる柔軟性があります。その意味で、人間の脳と似ています。よって、「言語モデルはただの統計でしょ」的な単純化は当てはまらないと思います。

個人の感想です

この尤度の概念を、上述の目的関数にあてはめると、ある観測されたデータとは、トークン・コーパスにあるシーケンスのことです。そこからモデルは$${u_i}$$の確率を与えられたデータ$${u_{i-k}, \dots, u_{i-1}}$$に対して予測するわけです。

よって、このモデルを訓練して、そのパラメータをうまく調節してやれば、より正確な予測が可能となります。つまり、尤度を最大化することが目的となります。

しかし、実際には尤度ではなく対数尤度を使っています。これはどうしてでしょうか。

対数尤度を使う理由

機械学習やディープラーニングで対数尤度を使うのは言語モデルに限ったことではなく、その理由は色々とあります。

まず、尤度は確率であり、値として0から1の範囲をとります。複数のシーケンスをバッチでまとめて訓練する場合、各シーケンスに対してモデルが予測した確率の積を最大化することにるので、小さい値を掛け合わせることになり、尤度の積が非常に小さくなることがあります。コンピュータの扱える数値精度には限界があるのでこれは問題です。

そこで尤度の対数を取ることで、これらの小さな数値をより扱いやすい対数の範囲に変換します。具体的には、対数尤度の範囲は、負の無限大から0になります。なぜなら、確率は、0から1の間の値を取りますが、対数を取ると次のように変換されるからです。

  • $${P = 1}$$の場合、対数尤度は$${log(1) = 0}$$ になります。

  • $${P}$$が$${0}$$に近づくほど、対数尤度は負の無限大に近づきます。

また、対数を使うと確率の積が対数確率の和になります。すなわち、確率の積を最大化することは対数確率の和を最大化することなので数値も安定し計算も簡単です。

つまり、確率の積 $${ P(u_1) \times P(u_2) \times \cdots \times P(u_n)}$$ を最大化する代わりに、対数を取ることで、対数確率の和 $${ \log P(u_1) + \log P(u_2) + \cdots + \log P(u_n) }$$ を最大化します。なお、条件の部分は省略しています。

ここでもう一度、目的関数の式をここに再掲します。

$$
L_1(\mathcal{U}) = \sum\limits_i \log P(u_i | u_{i-k}, \dots, u_{i-1}; \Theta)
$$

ここで、論文の訳も再掲します。

教師なし(ラベルなし)のトークン・コーパス $${\mathcal{U} = \{u_1, \dots , u_n\}}$$ が与えられた場合、標準的な言語モデルの目的は、次の尤度を最大化することです:

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

ここで、$${k}$$ はコンテキストウィンドウのサイズを表し、条件付き確率 $${P}$$ はパラメータ $${\Theta}$$ を持つニューラルネットワークを使用してモデル化されます。これらのパラメータは確率的勾配降下法を用いて訓練されます【51】。

Given an unsupervised corpus of tokens $${\mathcal{U} = \{u_1, \dots , u_n\}}$$, we use a standard language modeling objective to maximize the following likelihood:

$${L_1(\mathcal{U}) = \sum\limits_i \log P(u_i | u_{i-k}, \dots, u_{i-1}; \Theta)}$$

where $${k}$$ is the size of the context window, and the conditional probability $${P}$$ is modeled using a neural network with parameters $${\Theta}$$. These parameters are trained using stochastic gradient descent [51].

language_understanding_paper.pdf (openai.com)

初見で複雑に見えたとしても、今ではわかりやすくなっているでしょう。

なお、最後のところに「これらのパラメータは確率的勾配降下法を用いて訓練されます」というのは、通常のディープラーニングの誤差逆伝播による訓練を意味します。対数は勾配の計算も簡単なので、これも対数尤度を使う利点となります。

次回予告

ここまで、ニューラルネットワークによる言語モデルの目的関数に関して論文を読んできました。まだ、セクション3.1の途中で、割と一般論的な話になりましたが、この後トランスフォーマーのデコーダなどの話が登場します。

よって、次回もセクション3.1「教師なしの事前学習」の続きを読み進めます。

お楽しみに!

いいなと思ったら応援しよう!