自分の復習用と、アウトプットのため。
逐一更新していくつもりです!
暇な時に見るもの。興味があるセッションを見ます。
またところどころにプログラムの実習を作ってみたので一緒にやってみましょう!
こちらは、https://stanford-cs324.github.io/winter2022/lectures/introduction/#what-is-a-language-model
の講義資料を参考にしています。必要であれば参照してください。
目標
数学が苦手でもLLMを理解する!
第1章:LLMのLMとは 〜基礎知識〜
古典的には 『トークン列に対する確率分布』 と定義される。
理解するために数式として出します。
LMにおける確率分布の例として 集合「語彙」を$ V $ として定義します。(*1)
LMをpとして、各トークン列 $ x_1, \dots , xL \in V$ に確率を割り当てます。(*2)
この確率は0から1の間で解を出します。下記に確率分布の数式を記載。
p(x_1 , \dots , xL)
(*1) VはVocabularyの頭文字からとっている。
(*2) $ x1, ..., xL $ は $V$ の要素である。
$ p(x_1 , \dots , xL) $の理解を深めるために、例を出しながら理解してみます。
例えば集合$ V $の中身をこのようにします。
V = { ネズミ, チーズ, が, を, 食べた }
確率は直感的にその トークン列を『良いかどうか』 判断する。
\begin{gather}
p(ネズミ, が, チーズ, を, 食べた) = 0.02 \\
p(チーズ, が, ネズミ, を, 食べた) = 0.01 \\
p(を, が, 食べた, ネズミ, チーズ) = 0.0001 \\
\end{gather}
例えば、「ネズミがチーズを食べた」は文法的にも意味的にも正解であるため確率が高く設定される。
「チーズがネズミを食べた」は意味的に不正解であるため、確率が少し下がるが、文法的には正解である。
「をが食べたネズミチーズ」は文法、意味両方間違えているため、極端に確率が下がる。
数学的に単純な数式ではある。この単純さには実は裏がある。
LMは確率を割り当てるために「言語能力と世界の知識」が必要である。
・文法的に正解であるかどうか(言語能力)
・意味的に正解であるかどうか(世界知識)
この二つが暗黙的に必要である。LMは、文法規則や「ネズミはチーズを食べる」という常識を教わったわけではないが、確率をうまく割り当てようとして、暗黙的に獲得している。
英語は語順で意味を決定するが、日本語では「助詞」が意味を決定する。
実際はどう確率を割り当てるのか?気になる場合は第3章まで飛んで欲しいです。
次章では、モデル自身が文章を「生成」(列を作る)する過程を見ていきます。
第2章:生成AIの「生成」とは、LMの確率分布の観点から考える
今まで、文章を「評価」する視点で理解をしていきました。昨今の生成AIは自分から文章を生成しているが、あれはなんなのだろうか。
少し視点を変えて、「生成」の視点から考えていきます。
LMは実は、文章を自分自身で作成することができる。
つまりモデルから列そのものを作り出すということだ。
最も純粋な方法として、確率$ p(x_1:L) $ を抽選する際の 重み として トークン列 $ x_1:L $をくじ引きで選ぶことです。これを $x_{1:L} \sim p$ と書きます。
これをコンピューターなどで効率よく実行できるかは、確率$ p $がどういう形をしているかによります。
効率よく実行するための問題として以下の二つが挙げられる。
問題1:くじを引くにはありうる列すべてに確率を割り当てた抽選箱が必要であること。
語彙5語・長さ5でも$ 5^5 $ = 3125通りになる。
先ほど挙げた3つは、ありうる列3125通りのうちのごく一部です。本来はこの3125通りすべてに確率がついています。
これがもっと増えると天文学的数字になるため、箱そのものが用意できなくなるためです。
問題2:言語モデルからそのままくじを引くことは、あまり行われないから。
理由は2つある。
- 言語モデルには限界がある。
- 「平均的な列」ではなく「最良の列」が私たちが欲しいものだから
第1章の$ V = { ネズミ, チーズ, が, を, 食べた } $ を例に考えてみます。
先ほどのありうる列すべてに確率が生成されていました。(下記参照)
\begin{gather}
p(ネズミ, が, チーズ, を, 食べた) = 0.02 \\
p(チーズ, が, ネズミ, を, 食べた) = 0.01 \\
p(を, が, 食べた, ネズミ, チーズ) = 0.0001 \\
\end{gather}
例えば$p(を, が, 食べた, ネズミ, チーズ) = 0.0001$これは確率的には0ではないため、くじを引き続ければいつか必ずと言っていいほど、この支離滅裂な文がでてきます。
ではどうするのか?
巨大なくじ引きをするのはやめて、小さなくじ引きをすればいいのです。
それが次章の「自己回帰」という考え方です。
第3章: 自己回帰言語モデル
列$x_{1:L*}$の同時分布$p(x_{1:L})$を描き表す一般的な方法として、 確率の連鎖律 を使うやり方がある。
確率の連鎖律の数式
\begin{aligned}
p(x_{1:L}) &= p(x_1)\,p(x_2 \mid x_1)\,p(x_3 \mid x_1, x_2) \cdots p(x_L \mid x_{1:L-1}) \\
&= \prod_{i=1}^{L} p(x_i \mid x_{1:i-1})
\end{aligned}
小難しく見えますが、この数式は「文全体の確率は、1単語ずつの確率を掛け算したもの」という意味です。
これのおかげで、1単語ずつ5回選ぶという作業になるため、5通り x 5回になる。
少し難しいと思うので例で見てみましょう。
\begin{aligned}
p(ネズミ, が, チーズ, を, 食べる) = \;
& p(ネズミ) \\
& p(が|ネズミ) \\
& p(チーズ| ネズミ, が) \\
& p(を| ネズミ, が, チーズ) \\
& p(食べる| ネズミ, が, チーズ, を)
\end{aligned}
ここで $p(x_i \mid x_{1:i-1})$ は、それまでのトークン $x_{1:i-1}$ が与えられたときの、次のトークン $x_i$ の条件付き確率分布です。
もちろん、どんな同時分布も数学的にはこのように書ける。しかし 自己回帰言語モデル とは、各条件付き分布$p(x_i \mid x_{1:i-1})$を効率よく計算できるものです。
同時分布とは、「複数のことが同時に起きる確率」をまとめたものです。
$p(x_1, \dots, x_L)$ は「1個目がこれで、かつ2個目がこれで……」と
すべてをセットで指定した確率なので、同時分布にあたります。
実は第1章からずっと扱っていたものに、名前がついただけです。
$\prod$とは全て掛け算するという意味である。
第4章へ続きますが、後日公開します。実習パートも準備中