ブログ

デノイジングスコアマッチング(DSM; Denoising Score Matching)

スコアを用いる生成モデルであるスコアベースモデル(SBM; Score Based Model)ではスコアの学習にあたってスコアマッチング(Score Matching)を行います。当記事ではデノイジングスコアマッチング(DSM; Denoising Score Matching)について取りまとめを行いました。
「拡散モデル ーデータ生成技術の数理(岩波書店)」の$1$章の「生成モデル」を参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提知識

多次元正規分布

多次元正規分布の直感的な理解については下記で取り扱った。

多次元正規分布・ベイズの定理・周辺確率

$$
\large
\begin{align}
p(\mathbf{x}) &= \mathcal{N}(\mathbf{x}|\mathbf{\mu},\mathbf{\Lambda}^{-1}) \\
p(\mathbf{y}|\mathbf{x}) &= \mathcal{N}(\mathbf{y}|\mathbf{A}\mathbf{x}+\mathbf{b},\mathbf{L}^{-1})
\end{align}
$$

上記のような確率分布$p(\mathbf{x})$と条件付き確率分布$p(\mathbf{y}|\mathbf{x})$を定義するとき、周辺分布$p(\mathbf{y})$は下記のように得られる。
$$
\large
\begin{align}
p(\mathbf{y}) = \mathcal{N}(\mathbf{x}|\mathbf{A}\mathbf{\mu} + \mathbf{b},\mathbf{L}^{-1}+\mathbf{A}\mathbf{\Lambda}^{-1}\mathbf{A}^{\mathrm{T}}) \quad (1.1)
\end{align}
$$

上記の詳しい導出は下記で取り扱った。

デノイジングスコアマッチング(DSM)

摂動後分布

サンプルに対応するベクトル$\mathbf{x}$に正規分布からのノイズベクトル$\epsilon \sim \mathcal{N}(\mathbf{0},\sigma^{2}I)$を加えた変数$\tilde{\mathbf{x}}$を下記のように定義する。
$$
\large
\begin{align}
\tilde{\mathbf{x}} = \mathbf{x} + \epsilon, \quad \epsilon \sim \mathcal{N}(\mathbf{0}, \sigma^{2}I) \quad (2.1)
\end{align}
$$

上記のノイズベクトル$\epsilon$を摂動、$\sigma$をノイズのスケールという。ここで条件付き確率$p_{\sigma}(\tilde{\mathbf{x}}|\mathbf{x})$を下記のように定義する。
$$
\large
\begin{align}
p_{\sigma}(\tilde{\mathbf{x}}|\mathbf{x}) = \mathcal{N}(\tilde{\mathbf{x}};\mathbf{x},\sigma^{2}I) = \frac{1}{(2 \pi \sigma^{2})^{d/2}} \exp{ \left[ -\frac{1}{2 \sigma^{2}}||\tilde{\mathbf{x}}-\mathbf{x}||^{2} \right] } \quad (2.2)
\end{align}
$$

さらに摂動後分布$p_{\sigma}(\bar{\mathbf{x}}$を周辺分布の式に基づいて下記のように定義する。
$$
\large
\begin{align}
p_{\sigma}(\tilde{\mathbf{x}}) = \int_{\mathbf{x} \in \mathbb{R}^{d}} p_{\sigma}(\tilde{\mathbf{x}}|\mathbf{x}) p(\mathbf{x}) d \mathbf{x}
\end{align}
$$

上記の摂動後分布$p_{\sigma}(\tilde{\mathbf{x}})$は元の分布$p(\mathbf{x})$をぼかした分布になる。直感的には画像に平均フィルタを適用してぼかすのと同様に理解するとわかりやすい。

摂動後分布の解釈:$p(\mathbf{x})$が正規分布の場合

前項の解釈にあたって、$p(\mathbf{x})=\mathcal{N}(\mu,\Sigma)$を仮定する。このとき$(1.1)$式を用いて摂動後分布$p_{\sigma}(\tilde{\mathbf{x}})$は下記のように得られる。
$$
\large
\begin{align}
p_{\sigma}(\tilde{\mathbf{x}}) = \mathcal{N}(\mathbf{x}|\mu,\sigma^{2}I+\Sigma)
\end{align}
$$

上記より摂動後分布$p_{\sigma}(\tilde{\mathbf{x}})$は元の分布$p(\mathbf{x})$をぼかした分布であることが確認できる。

DSMの目的関数

デノイジングスコアマッチング(DSM; Denoising Score Matching)では下記のように定義する目的関数$J_{DSM_{p_{\sigma}}}(\theta)$を用いて学習を行う。
$$
\large
\begin{align}
J_{DSM_{p_{\sigma}}}(\theta) = \frac{1}{2} \mathbb{E}_{p_{\sigma}(\tilde{\mathbf{x}}|\mathbf{x}) p(\mathbf{x})} \left[ || \nabla_{\tilde{\mathbf{x}}} \log{p_{\sigma}(\tilde{\mathbf{x}}|\mathbf{x})} – s_{\theta}(\tilde{\mathbf{x}},\sigma)||^{2} \right] \quad (2.3)
\end{align}
$$

ここで$(2.2)$式より、$\nabla_{\tilde{\mathbf{x}}} \log{p_{\sigma}(\tilde{\mathbf{x}}|\mathbf{x})}$は下記のように計算できる。
$$
\large
\begin{align}
\nabla_{\tilde{\mathbf{x}}} \log{p_{\sigma}(\tilde{\mathbf{x}}|\mathbf{x})} &= \nabla_{\tilde{\mathbf{x}}} \log{ \left( \frac{1}{(2 \pi \sigma^{2})^{d/2}} \exp{ \left[ -\frac{1}{2 \sigma^{2}}||\tilde{\mathbf{x}}-\mathbf{x}||^{2} \right] } \right) } \\
&= \nabla_{\tilde{\mathbf{x}}} \left( \log{ \frac{1}{(2 \pi \sigma^{2})^{d/2}} } – \nabla_{\tilde{\mathbf{x}}} \left[ \frac{1}{2 \sigma^{2}}||\tilde{\mathbf{x}}-\mathbf{x}||^{2} \right] \right) \\
&= 0 – \frac{1}{\sigma^{2}} (\tilde{\mathbf{x}}-\mathbf{x}) = -\frac{1}{\sigma^{2}} \epsilon \quad (2.4)
\end{align}
$$

$(2.1), \, (2.4)$式などを元に、$(2.3)$式は下記のように書き換えることができる。
$$
\large
\begin{align}
J_{DSM_{p_{\sigma}}}(\theta) = \frac{1}{2} \mathbb{E}_{\epsilon \sim \mathcal{N}(\mathbf{0},\sigma^{2}I), \, \mathbf{x} \sim p(\mathbf{x})} \left[ \left|\middle| -\frac{1}{\sigma^{2}} – s_{\theta}(\tilde{\mathbf{x}},\sigma) \middle|\right|^{2} \right] \quad (2.5)
\end{align}
$$

上記のように定義した$J_{DSM_{p_{\sigma}}}(\theta)$について下記が成立する。
$$
\large
\begin{align}
J_{ESM_{p_{\sigma}}}(\theta) = J_{DSM_{p_{\sigma}}}(\theta) + C \quad (2.6)
\end{align}
$$

$(2.6)$式の導出は当記事では省略しますが、「拡散モデル ーデータ生成技術の数理(岩波書店)」が詳しいので下記を参照ください。

スコアベースモデルと暗黙的スコアマッチング(Implicit Score Matching)

スコアを用いる生成モデルであるスコアベースモデル(SBM)ではスコアの学習にあたってスコアマッチング(Score Matching)を行います。当記事ではシンプルなスコアマッチングの手法である明示的スコアマッチングと暗黙的スコアマッチングについて取りまとめを行いました。
「拡散モデル ーデータ生成技術の数理(岩波書店)」の$1$章の「生成モデル」を参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

概要

スコアベースモデル(SBM)

確率分布のスコアが得られるとき、ランジュバン・モンテカルロ法(Langevin Monte Carlo)法を用いることで確率分布からのサンプリングを行うことができる。

このように学習した確率分布のスコアを用いて実現される生成モデルをスコアベースモデル(SBM; Score Based Model)という。よって、SBMを用いるにあたってはスコアの値を得る必要があり、このスコアを得るプロセスをスコアマッチング(Score Matching)という。

明示的スコアマッチング

明示的スコアマッチング(ESM; Explicit Score Matching)はスコアマッチングの手法の一つである。ニューラルネットワークのようなパラメータ$\theta$に基づくスコア関数を$s_{\theta}(\mathbf{x}):\mathbb{R}^{d} \longrightarrow \mathbb{R}^{d}$で近似を行うにあたって、明示的スコアマッチングでは下記のように目的関数の$J_{ESM_{p}}(\theta)$を目標分布$p(\mathbf{x})$の期待値の形式で定義する。
$$
\large
\begin{align}
J_{ESM_{p}}(\theta) = \frac{1}{2} \mathbb{E}_{p(\mathbf{x})} \left[ || \nabla_{\mathbf{x}} \log{p(\mathbf{x})} – s_{\theta}(\mathbf{x}) ||^{2} \right] \quad (1)
\end{align}
$$

上記のように定義される$J_{ESM_{p}}(\theta)$は二乗和誤差関数の最小化と同様に解釈できる一方で、多くの生成モデルではスコアの$\nabla_{\mathbf{x}} \log{p(x)}$が未知であり、式をそのまま用いることができない。

このような場合の解決策の$1$つが暗黙的スコアマッチング(ISM; Implicit Score Matching)であり、次項で取り扱う。

暗黙的スコアマッチング

暗黙的スコアマッチング(ISM; Implicit Score Matching)ではスコア関数$s_{\theta}(\mathbf{x})$の学習にあたっての目的関数に下記を用いる。
$$
\large
\begin{align}
J_{ISM_{p}}(\theta) = \mathbb{E}_{p(\mathbf{x})} \left[ \frac{1}{2} ||s_{\theta}(\mathbf{x})||^{2} + \mathrm{tr}(\nabla_{\mathbf{x}} s_{\theta}(\mathbf{x})) \right] \quad (2)
\end{align}
$$

暗黙的スコアマッチングの式理解

数式の解釈

$$
\large
\begin{align}
J_{ISM_{p}}(\theta) = \mathbb{E}_{p(\mathbf{x})} \left[ \frac{1}{2} ||s_{\theta}(\mathbf{x})||^{2} + \mathrm{tr}(\nabla_{\mathbf{x}} s_{\theta}(\mathbf{x})) \right] \quad (2)
\end{align}
$$

$(2)$式は目標分布の$p(\mathbf{x})$を用いて期待値が定義されるが、実際の生成問題では$p(\mathbf{x})$は未知である代わりに訓練データ$D={ \mathbf{x}^{(1)}, \cdots , \mathbf{x}^{(N)} }$を元に下記のように近似する。
$$
\large
\begin{align}
J_{ISM_{p}}(\theta) \simeq \frac{1}{N} \sum_{i=1}^{N} \left[ \frac{1}{2} ||s_{\theta}(\mathbf{x}^{(i)})||^{2} + \mathrm{tr}(\nabla_{\mathbf{x}} s_{\theta}(\mathbf{x}^{(i)})) \right]
\end{align}
$$

上記の第$1$項の$\displaystyle ||s_{\theta}(\mathbf{x}^{(i)})||^{2}$は「訓練データ$\mathbf{x}^{(i)}$の位置におけるスコアの絶対値」に対応し、この値が$\mathbf{0}$になれば対数尤度が$\mathbf{x}^{(i)}$で停留点(極小値・鞍点・極大値)を持つ。

第$2$項は入力ベクトルの各成分の$2$次微分に対応し、この値が最小(負の値)であれば$1$次微分が単調減少であり、対数尤度の停留点が極大値を持つ。

$J_{ESM_{p}}(\theta) = J_{ISM_{p}}(\theta)+C_1$の導出

$(1)$式で定義した明示的スコアマッチングの目的関数$J_{ESM_{p}}(\theta)$と$(2)$式で定義した暗黙的スコアマッチングの目的関数$J_{ISM_{p}}(\theta)$間にはパラメータ$\theta$に関係ない項の$C_1$を用いて下記のような式が成立する。
$$
\large
\begin{align}
J_{ESM_{p}}(\theta) = J_{ISM_{p}}(\theta)+C_1 \quad (3)
\end{align}
$$

以下、$(3)$式の導出を行う。導出にあたっては下記の$4$つの仮定をおく。
仮定$1. \,$ $p(\mathbf{x})$が微分可能
仮定$2. \,$ $\mathbb{E}_{p(\mathbf{x})}[||\nabla_{\mathbf{x}} \log{p(\mathbf{x})}||^{2}]$が有限
仮定$3. \,$ 任意の$\theta$について$\mathbb{E}_{p(\mathbf{x})}[||s_{\theta}(\mathbf{x})]$が有限
仮定$4. \,$ $\displaystyle \lim_{||\mathbf{x}|| \to \infty} [p(\mathbf{x})s_{\theta}(\mathbf{x})]=0$

まず、$(1)$式は下記のように変形できる。
$$
\large
\begin{align}
J_{ESM_{p}}(\theta) &= \frac{1}{2} \mathbb{E}_{p(\mathbf{x})} \left[ || \nabla_{\mathbf{x}} \log{p(\mathbf{x})} – s_{\theta}(\mathbf{x}) ||^{2} \right] \quad (1) \\
&= \mathbb{E}_{p(\mathbf{x})} \left[ \frac{1}{2}||\nabla_{\mathbf{x}} \log{p(\mathbf{x})}||^{2} + \frac{1}{2}||s_{\theta}(\mathbf{x})||^{2} – \nabla_{\mathbf{x}} \log{p(\mathbf{x})}^{\mathrm{T}} s_{\theta}(\mathbf{x}) \right] \\
&= \mathbb{E}_{p(\mathbf{x})} \left[ \frac{1}{2}||s_{\theta}(\mathbf{x})||^{2} – \nabla_{\mathbf{x}} \log{p(\mathbf{x})}^{\mathrm{T}} s_{\theta}(\mathbf{x}) \right] + C_1 \quad (4)
\end{align}
$$

上記の変形にあたっては仮定$2.$を用いた。ここで$(4)$式の第$1$項は$(2)$式の第$1$項と一致するので、以下では下記の$(5)$式が成立することを示す。
$$
\large
\begin{align}
\mathbb{E}_{p(\mathbf{x})} \left[ \mathrm{tr}(\nabla_{\mathbf{x}} s_{\theta}(\mathbf{x})) \right] = -\mathbb{E}_{p(\mathbf{x})} \left[ \nabla_{\mathbf{x}} \log{p(\mathbf{x})}^{\mathrm{T}} s_{\theta}(\mathbf{x}) \right] \quad (5)
\end{align}
$$

ここで$(5)$式の右辺は下記のように変形できる。
$$
\large
\begin{align}
-\mathbb{E}_{p(\mathbf{x})} \left[ \nabla_{\mathbf{x}} \log{p(\mathbf{x})}^{\mathrm{T}} s_{\theta}(\mathbf{x}) \right] &= -\int_{\mathbf{x} \in \mathbb{R}^{d}} p(\mathbf{x}) \left[ \nabla_{\mathbf{x}} \log{p(\mathbf{x})}^{\mathrm{T}} s_{\theta}(\mathbf{x}) \right] d \mathbf{x} \\
&= -\sum_{i=1}^{d} \int_{\mathbf{x} \in \mathbb{R}^{d}} p(\mathbf{x}) \left[ (\nabla_{\mathbf{x}} \log{p(\mathbf{x})})_{i} s_{\theta}(\mathbf{x})_{i} \right] d \mathbf{x} \quad (6)
\end{align}
$$

上記の$(\nabla_{\mathbf{x}} \log{p(\mathbf{x})})_{i}$、$s_{\theta}(\mathbf{x})_{i}$はそれぞれ$(\nabla_{\mathbf{x}} \log{p(\mathbf{x})})$と$s_{\theta}(\mathbf{x})$の$i$番目の成分に一致する。$(6)$式はさらに下記のように変形できる。
$$
\large
\begin{align}
& -\mathbb{E}_{p(\mathbf{x})} \left[ \nabla_{\mathbf{x}} \log{p(\mathbf{x})}^{\mathrm{T}} s_{\theta}(\mathbf{x}) \right] \\
&= -\sum_{i=1}^{d} \int_{\mathbf{x} \in \mathbb{R}^{d}} p(\mathbf{x}) \left[ (\nabla_{\mathbf{x}} \log{p(\mathbf{x})})_{i} s_{\theta}(\mathbf{x})_{i} \right] d \mathbf{x} \quad (6) \\
&= -\sum_{i=1}^{d} \int_{\mathbf{x} \in \mathbb{R}^{d}} p(\mathbf{x}) \left[ \frac{\partial \log{p(\mathbf{x})}}{\partial x_i} s_{\theta}(\mathbf{x})_{i} \right] d \mathbf{x} \\
&= -\sum_{i=1}^{d} \int_{\mathbf{x} \in \mathbb{R}^{d}} \frac{\cancel{p(\mathbf{x})}}{\cancel{p(\mathbf{x})}} \left[ \frac{\partial p(\mathbf{x})}{\partial x_i} s_{\theta}(\mathbf{x})_{i} \right] d \mathbf{x} \\
&= -\sum_{i=1}^{d} \int_{\mathbf{x} \in \mathbb{R}^{d}} \frac{\partial p(\mathbf{x})}{\partial x_i} s_{\theta}(\mathbf{x})_{i} d \mathbf{x} \quad (7)
\end{align}
$$

同様に$(5)$式の左辺は下記のように表せる。
$$
\large
\begin{align}
\mathbb{E}_{p(\mathbf{x})} \left[ \mathrm{tr}(\nabla_{\mathbf{x}} s_{\theta}(\mathbf{x})) \right] &= \int_{\mathbf{x} \in \mathbb{R}^{d}} p(\mathbf{x}) \mathrm{tr}(\nabla_{\mathbf{x}} s_{\theta}(\mathbf{x})) d \mathbf{x} \\
&= \sum_{i=1}^{d} \int_{\mathbf{x} \in \mathbb{R}^{d}} p(\mathbf{x}) \frac{\partial s_{\theta}(\mathbf{x})_{i}}{\partial x_i} d \mathbf{x} \quad (8)
\end{align}
$$

$(7)$式と$(8)$式より、下記の$(9)$式を示せば$(3)$式が成立することが示される。
$$
\large
\begin{align}
\int_{\mathbf{x} \in \mathbb{R}^{d}} \frac{\partial p(\mathbf{x})}{\partial x_i} s_{\theta}(\mathbf{x})_{i} d \mathbf{x} = \int_{\mathbf{x} \in \mathbb{R}^{d}} p(\mathbf{x}) \frac{\partial s_{\theta}(\mathbf{x})_{i}}{\partial x_i} d \mathbf{x} \quad (9)
\end{align}
$$

$(9)$式は部分積分の公式などを活用することによって示すことができる。

$(9)$式の詳細は当記事では省略しますが、「拡散モデル ーデータ生成技術の数理(岩波書店)」が詳しいので詳しくは下記を参照ください。

スコア関数の定義とランジュバン・モンテカルロ(Langevin Monte Carlo)法

ランジュバン・モンテカルロ(Langevin Monte Carlo)法は対数尤度の勾配であるスコア(score)を用いたサンプリング手法(MCMC)です。当記事ではスコア関数の定義とランジュバン・モンテカルロ法の数式について取りまとめを行いました。
「拡散モデル ーデータ生成技術の数理(岩波書店)」の$1$章やランジュバン・モンテカルロ法の論文などを参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

・ランジュバン・モンテカルロ法論文

前提の確認

最尤法と対数尤度

パラメータ$\theta$に基づく同時確率密度関数が$p_{\theta}(\mathbf{x}) = P(x_1, \cdots , x_n|\theta)$のように表される時、同時確率密度関数を$\theta$に着目した関数を尤度$L(\theta) = p_{\theta}(\mathbf{x})$のように定義する。

この時、対数尤度$\log{L(\theta)}$は下記のように表される。
$$
\large
\begin{align}
\log{L(\theta)} = \log{p_{\theta}(\mathbf{x})}
\end{align}
$$

最尤法では上記の対数尤度$\log{L(\theta)}$を最大にする$\theta$を元の確率分布のパラメータの推定値であるとみなす。詳しくは下記などでも取り扱った。

・Python実装を通して学ぶ、統計モデリング入門(筆者作成)

スコア関数の定義

対数尤度$\log{L(\theta)} = \log{p_{\theta}(\mathbf{x})}$の勾配をスコア(score)という。統計学では一般的に対数尤度の$\theta$に関する勾配をスコアと定義するが、拡散モデルなどでランジュバン・モンテカルロ法を取り扱う際は入力値$\mathbf{x}$についての勾配を計算する。

入力値$\mathbf{x}$に関するスコア関数を$s(\mathbf{x})$とおくと、$s(\mathbf{x})$は下記のように定義される。
$$
\large
\begin{align}
s(\mathbf{x}) & \equiv \nabla_{\mathbf{x}} \log{p_{\theta}(\mathbf{x})}: \mathbb{R}^{d} \longrightarrow \mathbb{R}^{d} \\
\nabla_{\mathbf{x}} &= \left( \begin{array}{c} \displaystyle \frac{\partial}{\partial x_1} \\ \vdots \\ \displaystyle \frac{\partial}{\partial x_d} \end{array} \right)
\end{align}
$$

また、対数関数の微分の公式に基づいてスコア関数について下記が成立する。
$$
\large
\begin{align}
s(\mathbf{x}) = \nabla_{\mathbf{x}} \log{p_{\theta}(\mathbf{x})} = \frac{\nabla_{\mathbf{x}} p_{\theta}(\mathbf{x})}{p_{\theta}(\mathbf{x})}
\end{align}
$$

上記より、スコア関数は「勾配ベクトルを確率で割ったベクトル」であることが確認できるので、「確率の小さい領域では大きくなり、確率の小さい点では小さくなる」という特徴を持つ。ランジュバン・モンテカルロ法ではこの特徴に基づいて、確率(尤度)の大きな領域を優先的に探索できる。

MCMC法の概要

下記などで詳しく取り扱った。

・Python実装を通して学ぶ、統計モデリング入門(筆者作成)

ランジュバン・モンテカルロ法

ランジュバン・モンテカルロ法の数式

ランジュバン・モンテカルロ法では正規乱数ベクトル$\mathbf{u}_{k} \sim \mathcal{N}(\mathbf{0},\mathbf{I})$を用いてベクトル$\mathbf{x}_{k}$を下記の漸化式に基づいてサンプリングを行う。
$$
\large
\begin{align}
\mathbf{x}_{k+1} &= \mathbf{x}_{k} + \alpha \nabla_{\mathbf{x}} \log{p(\mathbf{x}_{k})} + \sqrt{2 \alpha} \mathbf{u}_{k} \\
&= \mathbf{x}_{k} + \alpha s(\mathbf{x}) + \sqrt{2 \alpha} \mathbf{u}_{k} \\
&= \mathbf{x}_{k} + \alpha \frac{\nabla_{\mathbf{x}} p_{\theta}(\mathbf{x})}{p_{\theta}(\mathbf{x})} + \sqrt{2 \alpha} \mathbf{u}_{k}
\end{align}
$$

ランジュバン・モンテカルロ法の解釈

ランジュバン・モンテカルロ法の漸化式ではスコア関数の値に基づいてベクトル$\mathbf{x}_{k}$の値をUpdateし、サンプリングを行う。

上記に基づいてランジュバン・モンテカルロ法では確率の大きな領域を中心にサンプリングを行うことができる。

『仕組みから理解するChatGPT』サポートページ【印刷版】

『直感的に理解するTransformerの仕組み』の続編である『仕組みから理解するChatGPT』の印刷版のサポートページです。主に追加コンテンツや誤植が見つかった場合の正誤表の作成、カラー画像の確認が行えるように作成を行いました。誤植につきましては見つかり次第都度追加いたしますので、お気づきの方は気軽にご指摘ください。

・サポートページ:直感的に理解するTransformerの仕組み
・仕組みから理解するChatGPT

追加コンテンツ

$(\mathrm{o.xx})$形式の式番号は『仕組みから理解するChatGPT』の式番号に対応しますのでご注意ください。

Transformer decoder

『仕組みから理解するChatGPT』ではGPT$3$に用いられるTransformer decoderの詳細は取り扱わなかったので、以下では詳しく確認を行う。

ChatGPTのベースに用いられるGPT$3$の主要な処理はTransformerに基づく一方で、Encoder-Decoder形式のTransformerではなくDecoder-onlyのTransformerが用いられる。このようなDecoder-onlyのTransformerはTransformer decoder論文の処理に基づく。

Transformer decoder論文:Section.$4.2.3$

上記に出てくる$(m^{1}, \cdots , m^{n}) \mapsto (y^{1}, \cdots , y^{\eta})$は入力の$(m^{1}, \cdots , m^{n})$を出力の$(y^{1}, \cdots , y^{\eta})$に変換するタスクを表す。このタスクをそのまま取り扱うにはオーソドックスなTransformerのようにEncoder-Decoder形式のDeepLearningを用いる必要があるので、Transformer decoderの論文では$(m^{1}, \cdots , m^{n}) \mapsto (y^{1}, \cdots , y^{\eta})$を$(w^{1}, \cdots , w^{n+\eta+1}) = (m^{1}, \cdots , m^{n}, \delta , y^{1}, \cdots , y^{\eta})$のように置き換え、下記のように定義する同時確率の最大化のタスクの最大化に基づくパラメータの学習を行う。
$$
\large
\begin{align}
p(w^{1}, \cdots , w^{n+\eta+1}) = \prod_{j=1}^{n+\eta} p(w^{j+1}|w^{1}, \cdots , w^{j})
\end{align}
$$

上記に基づいてタスクの定義を行うことで、Encoderを省略し、Decoderのみを用いた処理が可能になる。このような処理を行うことで、必要なパラメータを半分にすることができる。

Decoder onlyのTransformerについては下記でも詳しく取り扱った。

モンテカルロ法と確率分布

InstructGPTで用いる方策勾配法では勾配の期待値の近似にあたってサンプリングに基づくモンテカルロ法を用いる。モンテカルロ法による期待値の近似については$(2.27)$式で簡単に取り扱った。
$$
\large
\begin{align}
\mu = \mathbb{E}[X] \simeq \frac{1}{n} \sum_{i=1}^{n} x_i \quad (2.27)
\end{align}
$$

上記のモンテカルロ法による近似計算は『仕組みから理解するChatGPT』では下記のようにサンプリングを行った結果に基づいて定義した。
$$
\large
\begin{align}
x_1, x_2, \cdots , x_n \sim \mathcal{N}(\mu, \sigma^{2}), \quad \mathrm{i.i.d.}
\end{align}
$$

ここで注意が必要なのが、「期待値計算で用いられる確率分布とサンプリングに用いる確率分布が一致する必要がある」ということである。$(2.27)$式の期待値$\mathbb{E}[X]$は正規分布$\mathcal{N}(\mu, \sigma^{2})$の確率密度関数$f(x)$を用いて下記のように定義される。
$$
\large
\begin{align}
\mathbb{E}[X] = \int_{-\infty}^{\infty} x f(x) dx \quad (1)
\end{align}
$$

上記の$(1)$式に用いる確率密度関数$f(x)$と$(2.27)$式に用いるサンプルの$x_1, x_2, \cdots , x_n$は同一の確率分布$\mathcal{N}(\mu, \sigma^{2})$に対応する。

「期待値計算で用いられる確率分布とサンプリングに用いる確率分布が一致する必要がある」ことを逆に考えると、「モンテカルロ法に基づく近似を行うにあたってはサンプリングを行う確率分布に基づく期待値の式を得る必要がある」と解釈できる。$3$-$2$-$3$節の「方策勾配法における勾配の計算」や$5$-$2$-$3$節の「Reinforcement learning」でLog-Derivative Trickを逆に用いて期待値の式を得るのは「サンプリングを行う分布の期待値の式を得ることでモンテカルロ法による近似を行う」というのが主な狙いである。

ここまでは「サンプリングに用いる確率分布」と「期待値の定義式に出てくる確率関数・確率密度関数に対応する確率分布」が一致する場合を確認したが、一致しない場合に用いられるのが重点サンプリング(Importance Sampling)である。重点サンプリングでは下記のような式が出てくる。
$$
\large
\begin{align}
\mathbb{E}_{\pi}[x] &= \sum x \pi(x) \\
&= \sum x \frac{b(x)}{b(x)} \pi(x) \\
&= \sum x \frac{\pi(x)}{b(x)} b(x) = \mathbb{E}_{b} \left[ \frac{\pi(x)}{b(x)} x \right]
\end{align}
$$

重点サンプリングは上記の式変形に基づいて「特定の確率分布の期待値を別の確率分布からサンプリングした値に基づいて計算する手法」である。式変形の解釈については詳しくは下記で取りまとめたので当項では省略する。

InstructGPTでは重点サンプリングは出てこないが、TRPOやPPOの論文では重点サンプリングが出てくる。たとえば『仕組みから理解するChatGPT』の$(3.28)$式には重点サンプリングの式が用いられる。
$$
\large
\begin{align}
L^{KLPEN}(\theta) = \mathbb{E}_{t} \left[ \frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{\mathrm{old}}}(a_t|s_t)} A_t – \mathrm{KL_term} \right] \quad (3.28)
\end{align}
$$

上記に出てくる$\displaystyle \frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{\mathrm{old}}}(a_t|s_t)}$は重点サンプリングに基づいて用いられる。「InstructGPTでは重点サンプリングが出てこないのに対してPPOでは重点サンプリングが用いられる」のは、InstructGPTでは$\pi_{\phi}^{RL}$を用いてサンプリングを行っているのに対し、PPOでは$\pi_{\theta_{\mathrm{old}}}$を用いてサンプリングを行うからである。

InstructGPTの強化学習における目的関数の式をPPOの式の形式を元に解釈するにあたっては、当項で取り扱ったように「サンプリングをどの確率分布に基づいて行ったか」の視点が重要である。

a per-token KL penaltyの勾配

$$
\large
\begin{align}
\mathbb{E}_{(x,y) \sim D_{\pi_{\phi}^{RL}}} \left[ \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] = \sum_{y_i \in \mathcal{Y}} \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i}) \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \quad (5.12)’
\end{align}
$$

上記は概ね参照元の$(5.12)$式に対応するが、$\displaystyle \sum$がわかりやすくなるように出力層に対応する語彙の集合$\mathcal{Y}$を用いて$\displaystyle \sum_{y_i \in \mathcal{Y}}$のように表した。

この$\displaystyle \sum_{y_i \in \mathcal{Y}}$の中の項の$\phi$に関する勾配は下記のように得られる。
$$
\begin{align}
\nabla_{\phi} \left[ \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i}) \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] = \nabla_{\phi} \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i}) \left[ 1 + \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] \quad (5.13)
\end{align}
$$

ここで$(5.13)$式にLog-Derivative Trickを用いると、$(5.12)$式の勾配は下記のように変形できる。
$$
\large
\begin{align}
& \nabla_{\phi} \mathbb{E}_{(x,y) \sim D_{\pi_{\phi}^{RL}}} \left[ \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] \\
&= \nabla_{\phi} \sum_{y_i \in \mathcal{Y}} \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i}) \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \quad (5.12)’ \\
&= \sum_{y_i \in \mathcal{Y}} \nabla_{\phi} \left[ \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i}) \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] \\
&= \sum_{y_i \in \mathcal{Y}} \nabla_{\phi} \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i}) \left[ 1 + \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] \quad (5.13) \\
&= \sum_{y_i \in \mathcal{Y}} \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i}) \frac{\nabla_{\phi} \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})} \left[ 1 + \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] \\
&= \mathbb{E}_{(x,y) \sim D_{\pi_{\phi}^{RL}}} \left[ \frac{\nabla_{\phi} \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})} \left( 1 + \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right) \right] \\
&= \mathbb{E}_{(x,y) \sim D_{\pi_{\phi}^{RL}}} \left[ \nabla_{\phi} \log{[\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})]} \left( 1 + \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right) \right] \quad (2)
\end{align}
$$

ここでさらに$(5.10)$式を用いることで、$(5.8)$式のKL penaltyに関する項の勾配は下記のように得ることができる。
$$
\large
\begin{align}
& \nabla_{\phi} \mathbb{E}_{(x,y) \sim D_{\pi_{\phi}^{RL}}} \left[ – \beta \log{ \frac{\pi_{\phi}^{RL}(y|x)}{\pi_{\phi}^{SFT}(y|x)} } \right] = -\beta \nabla_{\phi} \mathbb{E}_{(x,y) \sim D_{\pi_{\phi}^{RL}}} \left[ \log{ \frac{\pi_{\phi}^{RL}(y|x)}{\pi_{\phi}^{SFT}(y|x)} } \right] \\
&= -\beta \nabla_{\phi} \mathbb{E}_{(x,y) \sim D_{\pi_{\phi}^{RL}}} \left[ \sum_{i=1}^{n} \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] \quad (5.10) \\
&= -\beta \nabla_{\phi} \sum_{i=1}^{n} \mathbb{E}_{(x,y_i) \sim D_{\pi_{\phi}^{RL}}} \left[ \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] \\
&= -\beta \nabla_{\phi} \sum_{i=1}^{n} \sum_{y_i \in \mathcal{Y}} \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i}) \left[ \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] \\
&= -\beta \sum_{i=1}^{n} \sum_{y_i \in \mathcal{Y}} \nabla_{\phi} \left[ \pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i}) \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right] \\
&= -\beta \sum_{i=1}^{n} \mathbb{E}_{(x,y_i) \sim D_{\pi_{\phi}^{RL}}} \left[ \nabla_{\phi} \log{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})} \left( 1 + \log{ \frac{\pi_{\phi}^{RL}(y_i|x,\mathbf{y}_{:i})}{\pi_{\phi}^{SFT}(y_i|x,\mathbf{y}_{:i})} } \right) \right] \quad (3)
\end{align}
$$

上記の$(3)$式がKL penaltyに関する項の勾配に対応する。

一方、「DeepLearningによって方策が計算できるのだからサンプリングを行わずに期待値の勾配を$\displaystyle \sum$で展開した式から計算できるのではないか」という見方も可能であるように一見見える。しかしながら、この計算にあたっては$y$の全パターンについて確率を計算する必要があり、$y$の構成にあたっては組合せ爆発が生じることから現実的ではない。たとえば単語が$30,000$種類かつ$y$の長さが$10$であるだけで$30,000^{10}$通りであり、サンプリングを用いる意義について理解できる。

正誤表

初版第1刷

【上級】データサイエンス 数学ストラテジスト 公式問題集 解答例まとめ Q.71〜80

「データサイエンス 数学ストラテジスト 上級」はデータサイエンスの基盤である、確率・統計、線形代数、微積分、機械学習、プログラミングなどを取り扱う資格試験です。当記事では「日本数学検定協会」作成の「公式問題集」の演習問題$71$〜$80$の解答例を取り扱いました。

・数学検定まとめ
https://www.hello-statisticians.com/math_certificate

演習問題

Q.71

「有効求人倍率=有効求人数 $\div$ 有効求職者数」なので下記のように計算できる。
$$
\large
\begin{align}
\frac{3035+537}{2356+352} &= \frac{3572}{2708} \\
&= 1.319 \cdots
\end{align}
$$

よって$(4)$が正しい。

Q.72

期待効果の和はそれぞれ下記のように計算できる。
$$
\large
\begin{align}
(1) \, 2+3+5 &= 10 \\
(2) \, 5+2+5 &= 12 \\
(3) \, 5+5+3 &= 13 \\
(4) \, 3+2+2 &= 7 \\
(5) \, 3+3+3 &= 9
\end{align}
$$

$(3)$の期待効果の和が最も大きいので$(3)$が正しい。

Q.73

下記のような計算を行うことで安全在庫を計算できる。

import numpy as np

sd = np.array([20., 12., 16.])
day = np.array([11., 15., 14.])

print(1.65*sd*np.sqrt(day))

・実行結果

[ 109.44861808   76.68507025   98.77975501]

よって$(1)$が正しい。

Q.74

需要曲線は商品の価格$q$が高くなるときに需要$q$が減少する曲線であるので、①、③、⑤は需要曲線ではない。また、需要$q$は$q>0$であるので⑥も需要曲線ではない。よって②、④が需要曲線になり得るので$(2)$が正しい。

Q.75

$$
\large
\begin{align}
\mathrm{PV} = \frac{C_1}{1+r} + \frac{C_2}{(1+r)^{2}} + \frac{C_3}{(1+r)^{3}} + \cdots + \frac{C_n}{(1+r)^{n}} + \cdots
\end{align}
$$

上記に$C_n=100, \, r=0.05$を代入すると等比数列の公式に基づいて下記のように$\mathrm{PV}$を計算できる。
$$
\large
\begin{align}
\mathrm{PV} &= \lim_{n \to \infty} \sum_{i=1}^{n} \frac{100}{(1+0.05)^{i}} \\
&= \lim_{n \to \infty} \frac{\displaystyle 100 \cdot \frac{20}{21} \left[ 1 – \left( \frac{20}{21} \right)^{n} \right]}{\displaystyle 1 – \frac{20}{21}} \\
&= 100 \cdot \frac{20}{\cancel{21}} \cdot \cancel{21} = 2000
\end{align}
$$

よって$(2)$が正しい。

Q.76

$10^{4}=10{,}000$であるので$(3)$が正しい。

Q.77

製品$X, Y, Z$の製造コストはそれぞれ下記のように計算できる。
$$
\large
\begin{align}
X &: 4.5 \times 4 + 6 \times 2 + 5 \times 3 = 45 \\
Y &: 4.5 \times 6 + 6 \times 3 + 5 \times 1 = 50 \\
Z &: 4.5 \times 2 + 6 \times 4 + 5 \times 4 = 53
\end{align}
$$

よって$(2)$が正しい。

Q.78

$p=1000, p’=800, q=7000, q’=10000$なので需要の価格弾力性は下記のように計算できる。
$$
\large
\begin{align}
-\frac{p}{q} \cdot \frac{q’-q}{p’-p} &= -\frac{1000}{7000} \cdot \frac{10000-7000}{800-1000} \\
&= \frac{1}{7} \cdot 15 = 2.14 \cdots
\end{align}
$$

上記より$(3)$が正しい。

Q.79

価格が$p$のときの利益を$f(p)$とおくと、$f(p)$は下記のように表せる。
$$
\large
\begin{align}
f(p) &= (p-400)(600-0.5p) \\
&= -0.5(p-400)(p-1200)
\end{align}
$$

上記は上に凸の二次関数であるので$x=800$のとき下記のような最大値$f(800)$を取る。
$$
\large
\begin{align}
f(800) &= -0.5 \cdot 400 \cdot -400 \\
&= 80000
\end{align}
$$

よって$(3)$が正しい。

Q.80

$U(x)=\log{x}$であるので、$U'(x), U^{”}(x)$は下記のように得られる。
$$
\large
\begin{align}
U'(x) &= \frac{1}{x} \\
U^{”}(x) &= -\frac{1}{x^2}
\end{align}
$$

よって絶対的リスク回避係数$a(x)$と相対的リスク回避係数$\mu(x)$はそれぞれ下記のように計算できる。
$$
\large
\begin{align}
a(x) &= -\frac{U^{”}(x)}{U'(x)} = \frac{1}{x} \\
\mu(x) &= -\frac{xU^{”}(x)}{U'(x)} = 1
\end{align}
$$

よって$(1)$が正しい。

「一様分布」と「Softmax関数による確率化」間のKLダイバージェンスの計算

確率分布の類似度を計算するにあたってKLダイバージェンスが用いられることが多いですが、式の解釈は抽象的で理解が難しいです。当記事ではKLダイバージェンスの概略が把握できるように通常の確率化とSoftmax関数による確率化を題材に一様分布とのKLダイバージェンスの計算を行いました。
「パターン認識と機械学習」の$1.6$節の「Information Theory」などを主に参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提の確認

KLダイバージェンスの式定義

確率変数の取り得る値の集合を$X$とおくと、離散型確率分布$p(x), q(x)$のKLダイバージェンスは下記のような式で定義される。
$$
\large
\begin{align}
KL(p||q) = \sum_{x \in X} p(x) \log{ \left[ \frac{p(x)}{q(x)} \right] }
\end{align}
$$

上記で定義されたKLダイバージェンスはイェンセンの定理に基づいて$KL(p||q) \geq 0$が成立する。

ソフトマックス関数

$\mathbf{a} = (a_1, \cdots , a_K)$が与えられたとき、ソフトマックス関数$\mathrm{Softmax}(a_k)$は下記のように定義できる。
$$
\large
\begin{align}
\mathrm{Softmax}(a_k) = \frac{\exp{(a_k)}}{\displaystyle \sum_{j=1}^{K} \exp{(a_j)}}
\end{align}
$$

上記の定義より、ソフトマックス関数について下記の式が成立する。
$$
\large
\begin{align}
\mathrm{Softmax}(a_k) & \geq 0 \\
\sum_{j=1}^{K} \mathrm{Softmax}(a_j) &= 1
\end{align}
$$

KLダイバージェンスの計算

以下、$\mathbf{a} = (2, 7, 6)$が得られた際に「割り算による確率化」と「ソフトマックス関数による確率化」を行い、それぞれ一様分布とのKLダイバージェンスの計算を行う。まず下記のようなプログラムを実行することで$\mathbf{a} = (2, 7, 6)$の確率化を行うことができる。

import numpy as np

a = np.array([2., 7., 6.])

p_1 = a/np.sum(a)
p_2 = np.exp(a)/np.sum(np.exp(a))

print(p_1)
print(p_2)

・実行結果

[ 0.13333333  0.46666667  0.4       ]
[ 0.00490169  0.72747516  0.26762315]

計算結果を確認すると、ソフトマックス関数の結果が[ 0.00490169 0.72747516 0.26762315]であり、「緩やかなmax関数」のように解釈することができる。次に一様分布とのKLダイバージェンスは下記のようなプログラムを実行することで計算できる。

p_u = np.ones(3)/3.

KL_1 = np.sum(p_1 * np.log(p_1/p_u))
KL_2 = np.sum(p_2 * np.log(p_2/p_u))

print(KL_1)
print(KL_2)

・実行結果

0.155489202361
0.704475577074

上記より、ソフトマックス関数を適用することで一様分布とのKLダイバージェンスが大きくなることが確認できる。

【上級】データサイエンス 数学ストラテジスト 公式問題集 解答例まとめ Q.41〜50

「データサイエンス 数学ストラテジスト 上級」はデータサイエンスの基盤である、確率・統計、線形代数、微積分、機械学習、プログラミングなどを取り扱う資格試験です。当記事では「日本数学検定協会」作成の「公式問題集」の演習問題$41$〜$50$の解答例を取り扱いました。

・数学検定まとめ
https://www.hello-statisticians.com/math_certificate

演習問題

Q.41

$CBAx$を計算するにあたって、$C$が$4$行$2$列、$A$が$3$行$3$列の行列であるので、$B$は$2$行$3$列の行列でなければならない。よって$(2)$が正しい。

Q.42

$$
\large
\begin{align}
\frac{1}{N} \sum_{i=1}^{N} (y_{i} – \hat{y}_{i})^{2}
\end{align}
$$

$\displaystyle \sum$の定義に基づいて、上記の式は下記のように表すことができる。
$$
\large
\begin{align}
\frac{1}{N} \sum_{i=1}^{N} (y_{i} – \hat{y}_{i})^{2} = \frac{(y_{1} – \hat{y}_{1})^{2} + \cdots (y_{N} – \hat{y}_{N})^{2}}{N}
\end{align}
$$

よって$(4)$が正しい。

Q.43

$$
\large
\begin{align}
f(x) = \frac{1}{1 + \exp{[-(a+bx)]}}
\end{align}
$$

$a=-2, b=0.1$を代入すると、$f(x)$は下記のように表せる。
$$
\large
\begin{align}
f(x) = \frac{1}{1 + \exp{[-(0.1x-2)]}}
\end{align}
$$

ここで$x=20$のとき$\exp{[-(0.1x-2)]} = e^{0} = 1$より、$f(20)=0.5$が成立する。また、$x \to -\infty$のとき$f(x) \to 0$、$x \to \infty$のとき$f(x) \to 1$が成立する。よって$(2)$が正しい。

・解説
$\displaystyle g(y) = \frac{1}{1 + \exp{(-y)}}$がシグモイド関数に着目すると、シグモイド関数のグラフの形状より$(2)$を選ぶことができます。解答例では検算も兼ねて計算によってグラフの選択を行いました。

Q.44

$(A)$の値を$n_A$とおくと、再現率$p_{r}$、適合率$p_{pre}$はそれぞれ下記のように計算できる。
$$
\large
\begin{align}
p_{r} &= \frac{1236}{1384} \\
p_{pre} &= \frac{1236}{1236 + n_A}
\end{align}
$$

ここで$F$値を$F$とおくと、$F^{-1}$は下記のように表すことができる。
$$
\large
\begin{align}
F^{-1} &= \frac{1}{2} \left( \frac{1}{p_{r}} + \frac{1}{p_{pre}} \right) \\
&= \frac{1}{2} \left( \frac{1384}{1236} + \frac{1236+n_A}{1236} \right) \\
&= \frac{2620 + n_A}{2 \cdot 1236}
\end{align}
$$

ここで$F \geq 0.8$が成立するとき、$n_A$の範囲は下記のように得られる。
$$
\large
\begin{align}
F & \geq 0.8 \\
\left( \frac{2620 + n_A}{2 \cdot 1236} \right)^{-1} & \geq 0.8 \\
\frac{2 \cdot 1236}{2620 + n_A} & \geq 0.8 \\
2 \cdot 1236 & \geq 0.8(2620 + n_A) \\
0.8 n_A & \leq 2 \cdot 1236 – 0.8 \cdot 2620 \\
n_A & \leq \frac{2 \cdot 1236 \cdot 10}{8} – 2620 \\
n_A & \leq 470
\end{align}
$$

よって$(5)$が正しい。

Q.45

BとD、AとCの順にクラスタの作成が行われるので$(5)$が正しい。

Q.46

$f(x,y)=\log{(x^{2}+2y^{2})}$の点$(4,3)$における勾配ベクトル$\displaystyle \nabla f(x,y) |_{x=4,y=3}$は下記のように計算できる。
$$
\large
\begin{align}
\nabla f(x,y) |_{x=4,y=3} &= \left( \begin{array}{c} \displaystyle \frac{\partial f(x,y)}{\partial x} \\ \displaystyle \frac{\partial f(x,y)}{\partial y} \end{array} \middle) \right|_{x=4,y=3} \\
&= \left( \begin{array}{c} \displaystyle \frac{2x}{x^{2}+2y^{2}} \\ \displaystyle \frac{4y}{x^{2}+2y^{2}} \end{array} \middle) \right|_{x=4,y=3} \\
&= \frac{1}{16+18} \left( \begin{array}{c} 8 \\ 12 \end{array} \right) = \left( \begin{array}{c} \displaystyle \frac{4}{17} \\ \displaystyle \frac{6}{17} \end{array} \right)
\end{align}
$$

上記より$(3)$が正しい。

Q.47

それぞれの式の定義より$(4)$が正しい。

Q.48

左上に重ねて計算した際に$(4)$の計算結果のみ$-3$が得られる。よって$(4)$が正しい。

Q.49

$(5)$が正しい。

Q.50

単語の出現回数はそれぞれ下記のような表で表される。

単語 文書A 文書B 文書C
people $3$ $1$ $0$
of $1$ $2$ $0$
you $0$ $0$ $2$
by $1$ $0$ $0$
this $0$ $0$ $0$
all $10$ $13$ $9$

$2$つの文書で出現する場合、IDFの値が$\displaystyle \log_{2}{\frac{3}{2+1}}=0$となる。よって、$1$つの文書にしか出現しないかつTFの値が$\displaystyle \frac{2}{9}$である$(3)$が正しい。

【GPT-3】Language Models are Few-Shot Learners まとめ

GPT-$3$はTransformerに基づくLLMの$1$つであり、近年大きな注目を集めるChatGPTなど、幅広く用いられます。当記事ではGPT-$3$の論文である、Language Models are Few-Shot Learnersの取りまとめを行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

・GPT-$3$

前提の確認

Transformer

下記で詳しく取り扱った。
・直感的に理解するTransformer

Transformer Decoder

オリジナルのTransformerではEncoder Decoderに基づいて構成されるが、GPT-$3$ではTransformerのDecoderのみを用いる。この構成の元になったのがTransformer Decoderの論文である。

GPT論文のFigure$1$:左の図がDecoderに基づくアーキテクチャである

Pre-training

GPT、GPT-$2$、GPT-$3$ではトークン列$x_0, \cdots x_n$が得られたとき、下記のように定義する対数尤度を元に教師なし事前学習(Unsupervised Pre-Training)を行う。
$$
\large
\begin{align}
\log{L(\Theta)} &= \log{ P(x_0|\Theta) \prod_{i=1}^{n} P(x_i|\mathbf{x}_{:(i-1)},\Theta) } \\
&= \log{P(x_0|\Theta)} + \sum_{i=1}^{n} \log{P(x_i|\mathbf{x}_{:(i-1)},\Theta)} \\
\mathbf{x}_{:0} &= (x_0), \quad \mathbf{x}_{:(i-1)} = (x_0, \cdots , x_{i-1}), \, i \geq 1
\end{align}
$$

上記の対数尤度の最大化は教師なし学習であり単にテキストがあれば良いので、Wikipediaのような巨大なコーパスを用いて学習を行うことができる。

ここではGPT論文(Improving Language Understanding by Generative Pre-Training)に基づいて数式を定義したが、BERTの事前学習であるMLM(Masked Lauguage Model)と基本的には同様なカテゴリで理解しておくと良い。

GPT-$3$

Fine-Tuning

Pre-trainingによって得られた学習済みモデルのパラメータ(weights)を特定のタスクの教師ありデータセットに基づいて追加学習を行う一連のプロセスをFine-Tuningという。

Fine-TuningはDeepLearningの多くの分野で広く用いられているテクニックである一方で、GPT-$3$ではFine-Tuningを用いる代わりに次項で取り扱うZero-Shot・One-Shot・Few-Shotを元に追加学習を行う。

Zero-Shot・One-Shot・Few-Shot

GPT-$3$論文 Figure $2.1$

ここで”Shot”は推論の際に入力する”Example”に相当し、Zero-Shotはタスクのみ、One-Shotはタスク+$1$例、Few-Shotはタスク+数例の入力にそれぞれ対応する。具体的には下記のような入力と出力が対応するように学習を行う。

GPT-$3$論文 Figure $G.1$ ~Formatted dataset example for RACE-h~

【上級】データサイエンス 数学ストラテジスト 公式問題集 解答例まとめ Q.61〜70

「データサイエンス 数学ストラテジスト 上級」はデータサイエンスの基盤である、確率・統計、線形代数、微積分、機械学習、プログラミングなどを取り扱う資格試験です。当記事では「日本数学検定協会」作成の「公式問題集」の演習問題$61$〜$70$の解答例を取り扱いました。

・数学検定まとめ
https://www.hello-statisticians.com/math_certificate

演習問題

Q.61

製品ABCDEFG
重量(g)$150$$170$$180$$200$$200$$240$$250$
電源容量(mAh) $3000$ $4000$ $5000$ $7000$ $8000$ $8000$$9000$

「電源容量 $\div$ 重量」は下記のように計算できる。

製品ABCDEFG
電源容量 $\div$ 重量 $20$ $23.5$ $27.8$ $35$ $40$ $33.3$ $36$

上記が大きい順にD、E、F、Gを選ぶと合計は$32000$であり、$(4)$か$(5)$に絞られる。ここでFをB、Cに入れ替えたB、C、D、E、Gも$1$kg以下であり、この合計は$33000$である。よって、$(5)$が正しい。

Q.62

①〜⑥の処理手順は下記のプログラムに対応する。

a = 1

for i in range(1,5):
    a = 3*a+4

print(a)

・実行結果

241

上記より$(4)$が正しい。

・解説
for文でなくwhile文を用いるのが厳密には正しい一方で、while文は基本的にfor文で代用できるのでここではfor文を用いました。

Q.63

各基数について下記のような計算を行うことで用意するマークの数を計算することができる。

import numpy as np

n = np.array([2, 3, 4, 8, 16])

for i in n:
    num_mark = 0
    y, m, d = 0, 0, 0
    count = 0
    while y < 2099:
        count += 1
        y = i**count - 1
    num_mark += (i*(count-1) + 2099//i**(count-1) + 1)
    count = 0
    while m < 12:
        count += 1
        m = i**count - 1
    if i<12:
        num_mark += (i*(count-1) + 12//i**(count-1) + 1)
    else:
        num_mark += (i*(count-1) + 12//i**(count-1))
    count = 0
    while d < 31:
        count += 1
        d = i**count - 1
    num_mark += (i*(count-1) + 31//i**(count-1) + 1)
    print("n: {}, mark: {}".format(i, num_mark))

・実行結果

n: 2, mark: 42
n: 3, mark: 40
n: 4, mark: 41
n: 8, mark: 51
n: 16, mark: 71

実行結果より基数が$3$のときマークの数が最小になるので$(2)$が正しい。

・解説
基数が$16$の場合、月の$12$を上回りますが、このときだけ処理を変える必要があることに注意しておくと良いです。

Q.64

$n \to \infty$のとき$n \log{n} << n^{2}$なので$(2)$が正しい。

Q.65

$1$$0$$0$$1$$\mathbf{1}$$1$$0$$0$
$0$$1$$0$$0$$\mathbf{1}$$0$$1$$1$
$1$$1$$0$$0$$\mathbf{1}$$0$$0$$1$
$\mathbf{1}$$\mathbf{0}$$\mathbf{0}$$\mathbf{1}$$\mathbf{1}$$\mathbf{0}$$\mathbf{1}$$\mathbf{1}$
$1$$1$$0$$0$$\mathbf{1}$$0$$1$$0$
$0$$0$$1$$0$$\mathbf{0}$$0$$1$$0$
$0$$1$$0$$1$$\mathbf{1}$$0$$0$$1$
$0$$0$$1$$1$$\mathbf{1}$$1$$0$$0$

上記より$4$行目と$5$列目の和が奇数であることが確認できるので$(3)$が正しい。

Q.66

$n=16$の場合:$1,3,5,7,9,11,13,15,2,6,10,14,4,12,8,16$
$n=30$の場合:$1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,2,6,10,14,18,22,26,30,8,16,24,4,20,12,28$

上記より$(4)$の組み合わせが正しい。

Q.67

逆ポーランド記法の仕組みより$(3)$が正しい。

Q.68

$a$と$\sqrt{a^{2}-4b}$の差の$a-\sqrt{a^{2}-4b}$はそれぞれの値について下記のような計算で得られる。

import numpy as np

a = np.array([2., 1.00001, 1.1, -1., -1.00001])
b = np.array([1., 0.00001, -1.1, -2., -1.00001])

print(a-np.sqrt(a**2-4*b))

・実行結果

[  2.00000000e+00   2.00000000e-05  -1.26854386e+00  -4.00000000e+00
  -3.23609139e+00]

上記より$(2)$が正しい。

Q.69

下記のような計算によって結果を得ることができる。

import numpy as np

n_st = np.array([500., 300., 200., 100.])

for i in [100, 125, 150, 175, 200]:
    n_candi = np.ceil(n_st/i)
    print("i: {}, n_sum: {}, n_candi: {}".format(i, np.sum(n_candi), n_candi))

・実行結果

i: 100, n_sum: 11.0, n_candi: [ 5.  3.  2.  1.]
i: 125, n_sum: 10.0, n_candi: [ 4.  3.  2.  1.]
i: 150, n_sum: 9.0, n_candi: [ 4.  2.  2.  1.]
i: 175, n_sum: 8.0, n_candi: [ 3.  2.  2.  1.]
i: 200, n_sum: 7.0, n_candi: [ 3.  2.  1.  1.]

上記より$175$で割ったときの結果を考えればよく、$(4)$が正しいことが確認できる。

Q.70

$$
\large
\begin{align}
c_1 &= x_1 + x_2 + x_3 \, (\mathrm{mod} \, 2) \\
c_2 &= x_1 + x_2 + x_4 \, (\mathrm{mod} \, 2) \\
c_3 &= x_1 + x_3 + x_4 \, (\mathrm{mod} \, 2)
\end{align}
$$

$x_1=1, x_2=1, x_3=0, x_4=1$の場合、$c_1=0, c_2=1, c_3=0$が得られる。

ここで実際は$c_1=1, c_2=0, c_3=0$であるが、$x_2$を$0$に変えたときのみ$c_1=1, c_2=0, c_3=0$に一致する。よって、$(2)$の$1001100$が正しい。

【softmax関数】ガンベル最大トリック(Gumbel-max trick)を用いたサンプリング

ソフトマックス関数に基づく確率分布に基づいてサンプリングを行うにあたって、$\exp(x)$がオーバーフローを起こす場合があります。当記事ではこのような際に有用なガンベル最大トリック(Gumbel-max trick)の仕組みとPythonプログラムの作成を取り扱いました。
当記事の作成にあたっては「深層学習による自然言語処理」の$7.3.2$項の「ガンベル最大トリック」を参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

ガンベル最大トリックのアルゴリズム

ガンベル分布

位置パラメータ$0$、尺度パラメータ$1$のガンベル分布の累積分布関数を$F(x)$、確率密度関数を$f(x)$とおくと、それぞれ下記のように表すことができる。
$$
\large
\begin{align}
F(x) &= \exp{[-\exp{(-x)}]} \\
f(x) &= \frac{d}{dx}F(x) = \exp{[-\exp{(-x)}]} \times -\exp{(-x)} \times (-1) \\
&= \exp{(-x)} \exp{[-\exp{(-x)}]} = \exp{(-x)} F(x)
\end{align}
$$

累積分布関数$F(x)$のグラフは下記のように描くことができる。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme()

x = np.arange(-5., 5.01, 0.01)
F_x = np.exp(-np.exp(-x))

plt.plot(x, F_x)
plt.show()

・実行結果

また、下記のように$F(x)$の$x \to -\infty, \, x \to \infty$の極限や、$F(0)$の値を計算することもできる。
$$
\large
\begin{align}
\lim_{x \to -\infty} F(x) &= \lim_{x \to -\infty} \exp{[-\exp{(-x)}]} \\
&= \lim_{s \to \infty} \exp{[-s]} = 0 \\
F(0) &= \exp{[-\exp{(0)}]} \\
&= \exp{(-1)} = \frac{1}{e} = 0.367879 \cdots \\
\lim_{x \to \infty} F(x) &= \lim_{x \to \infty} \exp{[-\exp{(-x)}]} \\
&= \exp{(0)} = 1
\end{align}
$$

ガンベル分布と逆関数法

逆関数法は一様乱数$u \sim \mathrm{Uniform}(0,1)$を累積分布関数$F(x)$の逆関数$F^{-1}(u)$に代入することで$F(x)$に対応する分布に基づく乱数生成を行う手法である。詳しくは下記などで取り扱った。

ここで$u = F(x) = \exp{[-\exp{(-x)}]}$を$x$について解くと下記が得られる。
$$
\large
\begin{align}
u &= \exp{[-\exp{(-x)}]} \\
\log{u} &= -\exp{(-x)} \\
-\log{u} &= \exp{-x} \\
\log{(-\log{u})} &= -x \\
x &= -\log{(-\log{u})}
\end{align}
$$

上記よりガンベル分布の累積分布関数の逆関数$F^{-1}(u)$は$F^{-1}(u)=-\log{(-\log{u})}$である。よって得られた一様乱数に対し、$F^{-1}(u)=-\log{(-\log{u})}$を計算することでガンベル分布に従う乱数を得ることができる。

ガンベル最大トリックのアルゴリズム・プログラム

$$
\large
\begin{align}
p_{k} = \mathrm{softmax}(a_k) = \frac{\exp{(a_{k})}}{\displaystyle \sum_{i=1}^{N} \exp{a_{i}}}
\end{align}
$$

$a_1, \cdots a_N$が与えられた際に上記の確率$p_k$に基づいて無作為サンプリングを行う際に、$a_1, \cdots a_N$の値によっては$\exp$を計算することで値がオーバーフローを起こす場合がある。

ガンベル最大トリックは「位置パラメータ$0$、尺度パラメータ$1$のガンベル分布に基づいて得られた乱数$G_i$を元に$Z_i=a_i+G_i$とおくとき、$Z_k$が最大である確率が$p_k$に一致すること」に基づく手法である。下記のプログラムを用いることでガンベル最大トリックを用いたサンプリングを行える。

import numpy as np

np.random.seed(0)

a = np.array([3., 7., 5.])
z = np.zeros(len(a))

for n in range(10):
    for i in range(len(a)):
        u_i = np.random.rand()
        g_i = -np.log(-np.log(u_i))
        z[i] = a[i] + g_i
    k = np.argmax(z)+1
    print(k)

・実行結果

2
2
2
2
2
3
2
2
2
2

上記では$i=2$が多く得られる結果が観測された。ここで$i=1$〜$i=3$のそれぞれの確率は下記のように計算できる。

import numpy as np

a = np.array([3., 7., 5.])
p = np.exp(a)/np.sum(np.exp(a))

print(p)
[ 0.01587624  0.86681333  0.11731043]

上記より$p_1=0.01587624, \, p_2=0.86681333, \, p_3=0.11731043$であるので、サンプリング結果は概ね適切であることが確認できる。

ガンベル最大トリックの導出

$G_k=g_k$のとき$Z_k$が最大である条件付き確率

$G_k$を$G_k=g_k$で固定するとき、$Z_k=a_k+g_k$が$Z_i$より大きい確率$P(Z_i<Z_k)$は下記のように表せる。
$$
\large
\begin{align}
P(Z_i < a_k+g_k) &= P(a_i+G_i < a_k+g_k) \\
&= P(G_i < a_k-a_i+g_k) \quad (1)
\end{align}
$$

このとき$G_i$がガンベル分布に従うので$(1)$式は下記のように表せる。
$$
\large
\begin{align}
P(Z_i < Z_k) &= P(G_i < a_k-a_i+g_k) \quad (1) \\
&= F(a_k – a_i + g_k) \quad (2)
\end{align}
$$

ここで$G_i$は独立同分布($\mathrm{i.i.d.}$)に基づいてサンプリングされるので、$i \neq k$のすべての$i$について$Z_i < Z_k$が成立する確率は下記のように表せる。
$$
\large
\begin{align}
P(\max{(Z_1, \cdots , Z_N)}=Z_k|G_k=g_k) = \prod_{i \neq k} F(a_k – a_i + g_k) \quad (3)
\end{align}
$$

$G_k$に関する周辺化

以下、$(3)$式を$G_k=g_k$について周辺化を行う。
$$
\begin{align}
P(\max{(Z_1, \cdots , Z_N)}=Z_k) &= \int_{-\infty}^{\infty} P(\max{(Z_1, \cdots , Z_N)}=Z_k|G_k=g_k) P(G_k=g_k) d g_k \\
&= \int_{-\infty}^{\infty} f(g_k) \prod_{i \neq k} F(a_k-a_i+g_k) d g_k \\
&= \int_{-\infty}^{\infty} \exp{(-g_k)} F(g_k) \prod_{i \neq k} F(a_k-a_i+g_k) d g_k \\
&= \int_{-\infty}^{\infty} \exp{(-g_k)} F(a_k-a_k+g_k) \prod_{i \neq k} F(a_k-a_i+g_k) d g_k \\
&= \int_{-\infty}^{\infty} \exp{(-g_k)} \prod_{i=1}^{N} F(a_k-a_i+g_k) d g_k \\
&= \int_{-\infty}^{\infty} \exp{(-g_k)} \prod_{i=1}^{N} \exp{(-\exp{[-(a_k-a_i+g_k)]})} d g_k \\
&= \int_{-\infty}^{\infty} \exp{(-g_k)} \exp{ \left( – \sum_{i=1}^{N} \exp{[-(a_k-a_i+g_k)]} \right)} d g_k \\
&= \int_{-\infty}^{\infty} \exp{(-g_k)} \exp{ \left( – \sum_{i=1}^{N} \frac{\exp{a_i}\exp{(-g_k)}}{\exp{a_k}} \right)} d g_k \\
&= \int_{-\infty}^{\infty} \exp{(-g_k)} \exp{ \left( – \exp{(-g_k)} \frac{\sum_{i=1}^{N} \exp{a_i}}{\exp{a_k}} \right)} d g_k \\
&= \int_{-\infty}^{\infty} \exp{(-g_k)} \exp{ \left( – \frac{\exp{-g_k}}{p_k} \right)} d g_k \\
&= \int_{-\infty}^{\infty} \exp{(-x)} \exp{ \left( – \frac{\exp{-x}}{p_k} \right)} dx \\
&= \left[ p_{k} \exp{\left( -\frac{\exp{(-x)}}{p_{k}} \right)} \right]_{-\infty}^{\infty} \\
&= p_{k} \exp{(0)} = p_k
\end{align}
$$

上記より、$Z_k$が最大である確率が$p_k$に一致することが確認できる。また、積分にあたっては下記が成立することを用いた。
$$
\large
\begin{align}
\frac{d}{dx} \left[ p_{k} \exp{\left( -\frac{\exp{(-x)}}{p_{k}} \right)} \right] &= \cancel{p_{k}} \exp{\left( -\frac{\exp{(-x)}}{p_{k}} \right)} \times -\frac{\exp{(-x)}}{\cancel{p_{k}}} \times (-1) \\
&= \exp{(-x)} \exp{ \left( – \frac{\exp{-x}}{p_k} \right)}
\end{align}
$$