コンテンツにスキップ

言語モデルの学習:次トークン予測・パープレキシティ・AdamW・LoRA

対象読者: 本テーマ第 1〜4 章の内容と、勾配降下法、逆伝播、確率の基礎(条件付き確率・期待値・対数尤度)を学んだ人。Adam や LoRA は仮定しません。

前提となる記事:Transformer ブロック:残差接続・層正規化・MLP とパラメータ数、勾配降下法:勾配はなぜ「最も急な坂」なのか、ニューラルネットワークと逆伝播:連鎖律を計算グラフの上で逆向きに走らせる

生 Markdown

文章を途中まで読んで、次に来る言葉を予想する遊びを思い浮かべてください。言語モデルは、この予想を確率で答える仕組みです。この記事では、その仕組みの中にある数値(重み)を、大量の文章からどう決めるかを扱います。読み終えると、予想の外れ具合を表す損失とパープレキシティの読み方、学習で標準的に使われる Adam と AdamW の更新の性質、重みの一部だけを小さな部品で調整する LoRA が何を表せるかを、証明つきで説明できるようになります。

  • 言語モデルは「これまでのトークン列から次のトークンの確率分布を出す関数」です。その積 ∏tpθ(xt∣x<t)\prod_t p_\theta(x_t \mid x_{<t}) は列全体の上の確率分布になり、逆にどんな同時分布もこの形に分解できます(定理 3.2)。したがって次トークン予測の損失を最小にすることは、コーパスの尤度を最大にすること(最尤推定)と同じです(命題 3.5)。
  • パープレキシティは平均交差エントロピーの指数で、正解に割り当てた確率の幾何平均の逆数です。11 以上で、一様に当てずっぽうなら語彙の大きさ ∣V∣|V| に一致し、対数の底に依りません(定理 4.2)。データの分布のエントロピーが下限を決めます(命題 4.4)。
  • Adam の 1 次モーメント(勾配の移動平均)は過去の勾配の重みつき和で、重みの合計が 1−β1t1 - \beta_1^t しかないので、それで割ると不偏になります(命題 5.2)。更新量 ∣mt∣/vt|m_t| / \sqrt{v_t} は勾配の大きさに依らない定数で抑えられます(命題 5.5)。この定数は 11 より大きくなりえて、(β1,β2)=(0.9,0.999)(\beta_1, \beta_2) = (0.9, 0.999) では約 7.277.27 です。
  • L2 正則化と重み減衰は、素の SGD では同じ更新ですが、Adam では違う更新になります(命題 5.8)。重み減衰を勾配の外で掛けるのが AdamW です。
  • LoRA は重みの更新を ΔW=BA\Delta W = BA の形に限る微調整です。パラメータ数は r(d+k)r(d + k) で、表せる更新は「階数 rr 以下の行列」全体にちょうど一致します(定理 8.4)。実際の更新が低階数で足りるかどうかは定理ではなく、経験的な事柄です。

Transformer ブロックまでで、トークン列を受け取って各位置のロジット(語彙の大きさ ∣V∣|V| の実数ベクトル)を返す関数が組み上がりました。この関数は数多くの重みを持ちますが、その値はまだ決まっていません。この章の問いは、その重みを何を基準に、どういう手続きで決めるかです。

基準は 1 つだけです。文章の続きを当てること、すなわちコーパスに現れた各位置で、実際に次に来たトークンに高い確率を割り当てることです。正解のラベルを人が付ける必要はありません。文章そのものが、入力(これまでの列)と正解(次のトークン)の組を大量に含んでいます。この考え方は、ニューラルネットワークによる言語モデルの出発点となった Bengio らの研究(2003)ですでに採られています。

この基準を採ると、次の問いが順に出てきます。

  1. 「次のトークンの確率」を掛け合わせたものは、本当に文章全体の確率になっているのか。
  2. 損失の値をどう読むのか。損失が 2.32.3 というのは良いのか悪いのか。
  3. 損失を下げる手続きとして、なぜ素の勾配降下法ではなく Adam や AdamW が使われるのか。その更新式について何が証明できるのか。
  4. 学習済みの重みを別の用途に合わせ直すとき、重みを全部動かさずに済ませる方法(LoRA)は、何を表せて何を表せないのか。

勾配降下法そのものの性質(降下補題、凸の場合の収束、ミニバッチ勾配の不偏性)は勾配降下法で、勾配の計算方法は誤差逆伝播法で扱いました。ここでは繰り返さず、言語モデルに固有の損失・指標・最適化手法・低階数の微調整を、証明できる命題として切り出します。

語彙を有限集合 VV とし、その大きさを ∣V∣|V| と書きます。トークン列を x=(x1,…,xn)∈Vnx = (x_1, \ldots, x_n) \in V^n、その接頭辞を x<t=(x1,…,xt−1)x_{<t} = (x_1, \ldots, x_{t-1})、x≤t=(x1,…,xt)x_{\le t} = (x_1, \ldots, x_t) と書きます。x<1x_{<1} は空列です。実際のモデルでは列の先頭に開始を表す特殊トークンを置くので、x1x_1 の予測にも入力があります。

モデルの重みをまとめて θ∈RP\theta \in \mathbb{R}^P と書きます。前章のモデルは、接頭辞 x<tx_{<t} に対してロジット zt(θ)∈R∣V∣\boldsymbol{z}_t(\theta) \in \mathbb{R}^{|V|} を返し、softmax で確率に直します。

pθ(v∣x<t)=softmax(zt)v=ezt,v∑u∈Vezt,u(v∈V).p_\theta(v \mid x_{<t}) = \mathrm{softmax}(\boldsymbol{z}_t)_v = \frac{e^{z_{t,v}}}{\sum_{u \in V} e^{z_{t,u}}} \qquad (v \in V).

softmax の値はすべて正で、和が 11 です(命題 3.1[自己注意])。対数は自然対数 log⁡\log を既定とし、底を 22 にするときは log⁡2\log_2 と明記します。行列のフロベニウスノルムを ∥⋅∥F\|\cdot\|_F、ベクトルのユークリッドノルムを ∥⋅∥\|\cdot\| と書きます。

3. 自己回帰言語モデルと次トークン予測の損失

Section titled “3. 自己回帰言語モデルと次トークン予測の損失”

定義 3.1(自己回帰言語モデル)↗

各 t=1,…,nt = 1, \ldots, n と各接頭辞 x<t∈Vt−1x_{<t} \in V^{t-1} に対して、VV 上の確率分布 pθ(⋅∣x<t)p_\theta(\cdot \mid x_{<t})(各 v∈Vv \in V で pθ(v∣x<t)≥0p_\theta(v \mid x_{<t}) \ge 0、∑v∈Vpθ(v∣x<t)=1\sum_{v \in V} p_\theta(v \mid x_{<t}) = 1)を定める規則を、長さ nn の自己回帰言語モデルといいます。これに対して列 x∈Vnx \in V^n の確率を

pθ(x)=∏t=1npθ(xt∣x<t)p_\theta(x) = \prod_{t=1}^{n} p_\theta(x_t \mid x_{<t})

で定めます。

定義の時点では pθ(⋅∣x<t)p_\theta(\cdot \mid x_{<t}) という記号は「接頭辞ごとに与えた分布」という意味しかなく、何かの同時分布の条件付き確率であるとは言っていません。次の定理が、この記法を正当化します。

定理 3.2(自己回帰の積は列の上の確率分布であり、任意の同時分布はこの形に書ける)✓

VV を有限集合、n≥1n \ge 1 とします。

  1. 定義 3.1 の pθ(x)p_\theta(x) は VnV^n 上の確率分布です。すなわち、すべての xx で pθ(x)≥0p_\theta(x) \ge 0 で、∑x∈Vnpθ(x)=1\sum_{x \in V^n} p_\theta(x) = 1 です。さらに、この分布に従う確率変数の列 (X1,…,Xn)(X_1, \ldots, X_n) について、P(X<t=x<t)>0P(X_{<t} = x_{<t}) > 0 のとき P(Xt=v∣X<t=x<t)=pθ(v∣x<t)P(X_t = v \mid X_{<t} = x_{<t}) = p_\theta(v \mid x_{<t}) です。
  2. 逆に、VnV^n 上の任意の確率分布 PP に対して、ある自己回帰言語モデル qq があって、すべての x∈Vnx \in V^n で P(x)=∏t=1nq(xt∣x<t)P(x) = \prod_{t=1}^{n} q(x_t \mid x_{<t}) が成り立ちます。

証明の方針です。1 は、最後の成分について和を取るたびに因子 11 が出ることを使う帰納法です。2 は、同時分布から「接頭辞の確率の比」として条件付き分布を作り、それを掛け合わせると、隣り合う分子と分母が打ち消し合って元の確率に戻る、という計算です。

証明(定理 3.2)

1. 非負性は、非負の数の積なので成り立ちます。和が 11 であることを nn についての帰納法(定理 3.2[証明の技術])で示します。n=1n = 1 のとき ∑x1pθ(x1∣x<1)=1\sum_{x_1} p_\theta(x_1 \mid x_{<1}) = 1 は定義そのものです。n−1n - 1 まで成り立つとします。長さ nn の列についての和を、最後の成分についての和と残りについての和に分けると

∑x∈Vn∏t=1npθ(xt∣x<t)=∑x<n∈Vn−1(∏t=1n−1pθ(xt∣x<t))∑xn∈Vpθ(xn∣x<n).\sum_{x \in V^n} \prod_{t=1}^{n} p_\theta(x_t \mid x_{<t}) = \sum_{x_{<n} \in V^{n-1}} \Bigl(\prod_{t=1}^{n-1} p_\theta(x_t \mid x_{<t})\Bigr) \sum_{x_n \in V} p_\theta(x_n \mid x_{<n}).

内側の和は、pθ(⋅∣x<n)p_\theta(\cdot \mid x_{<n}) が確率分布なので 11 です。残った和は長さ n−1n - 1 の自己回帰言語モデルの確率の総和で、帰納法の仮定により 11 です。

同じ計算を tt 番目より後ろの成分についてだけ行うと、周辺分布が P(X≤t=x≤t)=∏s=1tpθ(xs∣x<s)P(X_{\le t} = x_{\le t}) = \prod_{s=1}^{t} p_\theta(x_s \mid x_{<s}) であることが分かります(xt+1,…,xnx_{t+1}, \ldots, x_n についての和を後ろから順に取ると、そのたびに因子 11 が出ます)。したがって P(X<t=x<t)>0P(X_{<t} = x_{<t}) > 0 のとき、条件付き確率の定義(定義 5.1[確率])から

P(Xt=v∣X<t=x<t)=P(X<t=x<t, Xt=v)P(X<t=x<t)=∏s<tpθ(xs∣x<s)⋅pθ(v∣x<t)∏s<tpθ(xs∣x<s)=pθ(v∣x<t)P(X_t = v \mid X_{<t} = x_{<t}) = \frac{P(X_{<t} = x_{<t},\ X_t = v)}{P(X_{<t} = x_{<t})} = \frac{\prod_{s<t} p_\theta(x_s \mid x_{<s}) \cdot p_\theta(v \mid x_{<t})}{\prod_{s<t} p_\theta(x_s \mid x_{<s})} = p_\theta(v \mid x_{<t})

です。

2. PP に従う確率変数の列を (X1,…,Xn)(X_1, \ldots, X_n) とし、接頭辞の確率を πt(x≤t)=P(X≤t=x≤t)\pi_t(x_{\le t}) = P(X_{\le t} = x_{\le t}) と書きます(π0=1\pi_0 = 1 と約束します)。qq を

q(v∣x<t)={πt(x<t,v)/πt−1(x<t)(πt−1(x<t)>0)1/∣V∣(πt−1(x<t)=0)q(v \mid x_{<t}) = \begin{cases} \pi_t(x_{<t}, v) / \pi_{t-1}(x_{<t}) & (\pi_{t-1}(x_{<t}) > 0) \\ 1 / |V| & (\pi_{t-1}(x_{<t}) = 0) \end{cases}

で定めます。∑vπt(x<t,v)=πt−1(x<t)\sum_{v} \pi_t(x_{<t}, v) = \pi_{t-1}(x_{<t})(事象 {X<t=x<t}\{X_{<t} = x_{<t}\} を XtX_t の値で分割したもの)なので、どちらの場合も q(⋅∣x<t)q(\cdot \mid x_{<t}) は VV 上の確率分布です。

x∈Vnx \in V^n を取ります。すべての tt で πt−1(x<t)>0\pi_{t-1}(x_{<t}) > 0 なら、乗法定理(定理 5.3[確率] の 1)を繰り返し使った形として

∏t=1nq(xt∣x<t)=∏t=1nπt(x≤t)πt−1(x<t)=πn(x)π0=P(x)\prod_{t=1}^{n} q(x_t \mid x_{<t}) = \prod_{t=1}^{n} \frac{\pi_t(x_{\le t})}{\pi_{t-1}(x_{<t})} = \frac{\pi_n(x)}{\pi_0} = P(x)

が成り立ちます(隣り合う分子と分母が打ち消し合います)。そうでないとき、πt(x≤t)=0\pi_{t}(x_{\le t}) = 0 となる最小の t≥1t \ge 1 を取ります。πt−1(x<t)>0\pi_{t-1}(x_{<t}) > 0 なので q(xt∣x<t)=0/πt−1(x<t)=0q(x_t \mid x_{<t}) = 0 / \pi_{t-1}(x_{<t}) = 0 で、積は 00 です。一方 {X=x}⊂{X≤t=x≤t}\{X = x\} \subset \{X_{\le t} = x_{\le t}\} なので P(x)≤πt(x≤t)=0P(x) \le \pi_t(x_{\le t}) = 0 で、やはり一致します。

この定理の 2 は、自己回帰という形に分解しても表現力を失わないことを言っています。制約になるのは分解の形ではなく、条件付き分布を「重み θ\theta を持つ決まった形の関数」で表すところです。

注意 3.3

実際の文章は長さが決まっていません。終端を表す特殊トークンを語彙に入れ、それが出たら列が終わると約束すれば、長さの違う列の全体の上の分布も同じ積の形で定義できます。この章の命題は、列の長さ nn を固定した形で述べます。

定義 3.4(次トークン予測の損失と教師強制)↗

コーパスを列の有限の集まり x(1),…,x(M)x^{(1)}, \ldots, x^{(M)}(x(m)∈Vnmx^{(m)} \in V^{n_m})とし、総トークン数を T=∑mnmT = \sum_{m} n_m とします。

L(θ)=−1T∑m=1M∑t=1nmlog⁡pθ(xt(m)∣x<t(m))\mathcal{L}(\theta) = -\frac{1}{T} \sum_{m=1}^{M} \sum_{t=1}^{n_m} \log p_\theta\bigl(x^{(m)}_t \mid x^{(m)}_{<t}\bigr)

を次トークン予測の損失(平均負対数尤度)といいます。各位置の条件には、モデル自身が出力したトークンではなく、コーパスにある正しい接頭辞 x<t(m)x^{(m)}_{<t} を入れます。これを教師強制といいます。

因果マスクつきの Transformer では、長さ nn の列を 1 回順伝播するだけで、nn 個の位置すべての pθ(⋅∣x<t)p_\theta(\cdot \mid x_{<t}) が、接頭辞だけを入力したときと同じ値で得られます(系 6.4[自己注意])。教師強制の損失を 1 回の順伝播と 1 回の逆伝播(定理 4.3[ニューラルネットワークと逆伝播])で計算できるのは、このためです。

命題 3.5(次トークン予測の損失の最小化は最尤推定である)✓

定義 3.4 の設定で、すべての θ\theta とすべての m,tm, t について pθ(xt(m)∣x<t(m))>0p_\theta(x^{(m)}_t \mid x^{(m)}_{<t}) > 0 とします(softmax の出力ならつねに成り立ちます)。コーパスの尤度を Lik(θ)=∏m=1Mpθ(x(m))\mathrm{Lik}(\theta) = \prod_{m=1}^{M} p_\theta(x^{(m)}) とします。

  1. L(θ)=−1Tlog⁡Lik(θ)\mathcal{L}(\theta) = -\dfrac{1}{T} \log \mathrm{Lik}(\theta) です。したがって L\mathcal{L} の最小点の集合と Lik\mathrm{Lik} の最大点の集合は一致します(どちらも空集合である場合を含みます)。
  2. コーパスに現れた接頭辞 cc ごとに、その出現回数を NcN_c、直後のトークンが vv であった回数を Nc,vN_{c,v} とし、経験分布を p^(v∣c)=Nc,v/Nc\hat{p}(v \mid c) = N_{c,v} / N_c とします。このとき
L(θ)=∑cNcT H(p^(⋅∣c), pθ(⋅∣c))\mathcal{L}(\theta) = \sum_{c} \frac{N_c}{T}\, H\bigl(\hat{p}(\cdot \mid c),\ p_\theta(\cdot \mid c)\bigr)

です。ここで H(p,q)=−∑vpvlog⁡qvH(p, q) = -\sum_v p_v \log q_v は交差エントロピー(定義 5.1[数学を学び直す意義])で、和はコーパスに現れた接頭辞の全体にわたります。 3. 1 つの位置の損失 ℓ=−log⁡softmax(z)y\ell = -\log \mathrm{softmax}(\boldsymbol{z})_y のロジットについての勾配は ∇zℓ=softmax(z)−ey\nabla_{\boldsymbol{z}} \ell = \mathrm{softmax}(\boldsymbol{z}) - \boldsymbol{e}_y です(ey\boldsymbol{e}_y は正解 yy の one-hot ベクトル)。

証明(命題 3.5)

1. 定義 3.1 から log⁡pθ(x(m))=∑t=1nmlog⁡pθ(xt(m)∣x<t(m))\log p_\theta(x^{(m)}) = \sum_{t=1}^{n_m} \log p_\theta(x^{(m)}_t \mid x^{(m)}_{<t}) です(仮定により各因子は正なので、対数が定義されます)。mm について足すと log⁡Lik(θ)=∑m∑tlog⁡pθ(xt(m)∣x<t(m))=−TL(θ)\log \mathrm{Lik}(\theta) = \sum_m \sum_t \log p_\theta(x^{(m)}_t \mid x^{(m)}_{<t}) = -T \mathcal{L}(\theta) です。T>0T > 0 で、log⁡\log は狭義単調増加なので、L(θ)≤L(θ′)\mathcal{L}(\theta) \le \mathcal{L}(\theta') と Lik(θ)≥Lik(θ′)\mathrm{Lik}(\theta) \ge \mathrm{Lik}(\theta') は同値です。したがって最小点と最大点は一致します。これは 2 値の場合の 命題 4.2[ロジスティック回帰] と同じ議論で、違いはクラスの数が ∣V∣|V| であることと、1 つの列が nmn_m 個の予測を含むことだけです。

2. L\mathcal{L} の和の TT 個の項を、接頭辞 cc と次のトークン vv の組ごとにまとめます。組 (c,v)(c, v) に対応する項はどれも −log⁡pθ(v∣c)-\log p_\theta(v \mid c) で、Nc,vN_{c,v} 個あります。したがって

L(θ)=−1T∑c∑v∈VNc,vlog⁡pθ(v∣c)=∑cNcT(−∑v∈VNc,vNclog⁡pθ(v∣c))\mathcal{L}(\theta) = -\frac{1}{T} \sum_{c} \sum_{v \in V} N_{c,v} \log p_\theta(v \mid c) = \sum_{c} \frac{N_c}{T} \Bigl(-\sum_{v \in V} \frac{N_{c,v}}{N_c} \log p_\theta(v \mid c)\Bigr)

で、括弧の中が H(p^(⋅∣c),pθ(⋅∣c))H(\hat{p}(\cdot \mid c), p_\theta(\cdot \mid c)) です。

3. ℓ\ell は、正解の分布を y=ey\boldsymbol{y} = \boldsymbol{e}_y としたときの交差エントロピー −∑iyilog⁡softmax(z)i-\sum_i y_i \log \mathrm{softmax}(\boldsymbol{z})_i です。命題 7.1[ニューラルネットワークと逆伝播] により、その勾配は softmax(z)−y\mathrm{softmax}(\boldsymbol{z}) - \boldsymbol{y} です。

2 の式は、損失が「接頭辞ごとに、実際に続いたトークンの頻度分布とモデルの分布の交差エントロピー」の重みつき平均であることを示しています。同じ接頭辞のあとに複数の続き方があるかぎり、損失は 00 になりません。その下限は次の節で求めます。

3 の式は、逆伝播の出発点です。出力層に入ってくる誤差信号は「モデルの確率から正解の位置の 11 を引いたもの」で、正解に確率 11 を与えたときにだけ 0\boldsymbol{0} になります。

損失の値は対数の単位(ナット)で測った量で、そのままでは大きさを掴みにくいものです。指数を取って「選択肢がいくつあるのと同じ程度に迷っているか」に直したものがパープレキシティです。

定義 4.1(パープレキシティ)↗

列 x∈Vnx \in V^n に対して、モデルが各位置の正解に割り当てた確率を qt=pθ(xt∣x<t)q_t = p_\theta(x_t \mid x_{<t}) とし、すべて正とします。平均負対数尤度を ℓ=−1n∑t=1nlog⁡qt\ell = -\frac{1}{n} \sum_{t=1}^{n} \log q_t とするとき、

PPL=exp⁡(ℓ)\mathrm{PPL} = \exp(\ell)

を、このモデルの xx に対するパープレキシティといいます。

定理 4.2(パープレキシティの基本性質)✓

定義 4.1 の記号のもとで、次が成り立ちます。

  1. PPL=(∏t=1nqt)−1/n=pθ(x)−1/n\mathrm{PPL} = \Bigl(\prod_{t=1}^{n} q_t\Bigr)^{-1/n} = p_\theta(x)^{-1/n} です。すなわち、正解に割り当てた確率の幾何平均の逆数です。
  2. PPL≥1\mathrm{PPL} \ge 1 で、等号はすべての tt で qt=1q_t = 1 のとき、かつそのときに限ります。
  3. すべての tt で qt=1/∣V∣q_t = 1 / |V|(一様分布のモデル)なら PPL=∣V∣\mathrm{PPL} = |V| です。
  4. b>1b > 1 を任意の底とし、ℓb=−1n∑tlog⁡bqt\ell_b = -\frac{1}{n} \sum_t \log_b q_t とすると、bℓb=PPLb^{\ell_b} = \mathrm{PPL} です。とくに、ビットで測った平均負対数尤度 ℓ2\ell_2 とナットで測った ℓ\ell は ℓ=ℓ2log⁡2\ell = \ell_2 \log 2 の関係にあり、2ℓ2=eℓ2^{\ell_2} = e^{\ell} です。
  5. PPL≤1n∑t=1n1qt\mathrm{PPL} \le \dfrac{1}{n} \sum_{t=1}^{n} \dfrac{1}{q_t} です。
証明(定理 4.2)

1. 指数関数と対数の関係から

exp⁡(−1n∑t=1nlog⁡qt)=exp⁡(log⁡(∏t=1nqt)−1/n)=(∏t=1nqt)−1/n\exp\Bigl(-\frac{1}{n} \sum_{t=1}^{n} \log q_t\Bigr) = \exp\Bigl(\log \Bigl(\prod_{t=1}^{n} q_t\Bigr)^{-1/n}\Bigr) = \Bigl(\prod_{t=1}^{n} q_t\Bigr)^{-1/n}

で、∏tqt=pθ(x)\prod_t q_t = p_\theta(x) は 定義 3.1 です。

2. 0<qt≤10 < q_t \le 1 なので −log⁡qt≥0-\log q_t \ge 0 で、ℓ≥0\ell \ge 0、したがって PPL=eℓ≥e0=1\mathrm{PPL} = e^{\ell} \ge e^0 = 1 です。等号は ℓ=0\ell = 0 のときで、非負の項の和が 00 になるのは各項が 00、すなわちすべての tt で qt=1q_t = 1 のときに限ります。

3. ℓ=−1n⋅nlog⁡(1/∣V∣)=log⁡∣V∣\ell = -\frac{1}{n} \cdot n \log (1 / |V|) = \log |V| なので PPL=elog⁡∣V∣=∣V∣\mathrm{PPL} = e^{\log |V|} = |V| です。

4. 底の変換 log⁡bq=log⁡q/log⁡b\log_b q = \log q / \log b から ℓb=ℓ/log⁡b\ell_b = \ell / \log b です。したがって bℓb=exp⁡(ℓblog⁡b)=exp⁡(ℓ)=PPLb^{\ell_b} = \exp(\ell_b \log b) = \exp(\ell) = \mathrm{PPL} です。b=2b = 2 とすれば後半です。

5. f(u)=euf(u) = e^{u} は凸関数です。ut=−log⁡qtu_t = -\log q_t、λt=1/n\lambda_t = 1/n として Jensen の不等式(定理 5.2[式と証明])を使うと

PPL=exp⁡(∑t=1n1nut)≤∑t=1n1neut=1n∑t=1n1qt\mathrm{PPL} = \exp\Bigl(\sum_{t=1}^{n} \frac{1}{n} u_t\Bigr) \le \sum_{t=1}^{n} \frac{1}{n} e^{u_t} = \frac{1}{n} \sum_{t=1}^{n} \frac{1}{q_t}

です。

2 と 3 が、パープレキシティの目盛りを与えます。11 が「まったく迷っていない」、∣V∣|V| が「語彙全体から一様に選ぶのと同じ」です。その間の値 kk は、「毎回 kk 個の選択肢から一様に選ぶモデルと同じ損失」と読めます。softmax の出力はつねに 11 未満なので、ニューラル言語モデルのパープレキシティは 11 には到達せず、11 は下限です。

例 4.3(語彙 4・長さ 5 の列のパープレキシティ)

∣V∣=4|V| = 4 とし、あるモデルが長さ 55 の列の各位置の正解に割り当てた確率が

(q1,…,q5)=(12, 14, 12, 18, 14)(q_1, \ldots, q_5) = \Bigl(\tfrac{1}{2},\ \tfrac{1}{4},\ \tfrac{1}{2},\ \tfrac{1}{8},\ \tfrac{1}{4}\Bigr)

だったとします。底 22 の対数は −log⁡2qt=1,2,1,3,2-\log_2 q_t = 1, 2, 1, 3, 2 で、和は 99、平均は ℓ2=9/5=1.8\ell_2 = 9 / 5 = 1.8 ビットです。定理 4.2 の 4 により

PPL=21.8≈3.482\mathrm{PPL} = 2^{1.8} \approx 3.482

です。積で確かめると ∏tqt=2−9=1/512\prod_t q_t = 2^{-9} = 1/512 で、5121/5≈3.482512^{1/5} \approx 3.482 と一致します。ナットで測った損失は ℓ=1.8log⁡2≈1.248\ell = 1.8 \log 2 \approx 1.248 で、e1.248≈3.482e^{1.248} \approx 3.482 です。

一様分布のモデルのパープレキシティは 44 なので、このモデルは当てずっぽうよりは良いものの、差は大きくありません。4 番目の位置の q4=1/8q_4 = 1/8 は一様分布の 1/41/4 より小さく、全体を押し上げています。定理 4.2 の 5 の右辺は (2+4+2+8+4)/5=4(2 + 4 + 2 + 8 + 4) / 5 = 4 で、確かに 3.482≤43.482 \le 4 です。

では、損失とパープレキシティはどこまで下げられるのでしょうか。データが確率的に生成されているなら、下限はモデルではなくデータの側で決まります。

命題 4.4(期待損失の下限はデータのエントロピー)✓

PP を VnV^n 上の確率分布(データの分布)、QQ を VnV^n 上の確率分布で、すべての xx で Q(x)>0Q(x) > 0 とします。XX が PP に従うとき、1 トークンあたりの損失 ℓ(X)=−1nlog⁡Q(X)\ell(X) = -\frac{1}{n} \log Q(X) とパープレキシティ PPL(X)=eℓ(X)\mathrm{PPL}(X) = e^{\ell(X)} について

E[ℓ(X)]=1nH(P,Q) ≥ 1nH(P),E[PPL(X)] ≥ exp⁡(E[ℓ(X)]) ≥ exp⁡(H(P)n)\mathbb{E}[\ell(X)] = \frac{1}{n} H(P, Q) \ \ge\ \frac{1}{n} H(P), \qquad \mathbb{E}[\mathrm{PPL}(X)] \ \ge\ \exp\bigl(\mathbb{E}[\ell(X)]\bigr) \ \ge\ \exp\Bigl(\frac{H(P)}{n}\Bigr)

が成り立ちます。ここで H(P)=−∑xP(x)log⁡P(x)H(P) = -\sum_x P(x) \log P(x) は PP のエントロピーです。最初の不等式の等号は Q=PQ = P のとき、かつそのときに限ります。

証明(命題 4.4)

期待値の定義から E[ℓ(X)]=−1n∑xP(x)log⁡Q(x)=1nH(P,Q)\mathbb{E}[\ell(X)] = -\frac{1}{n} \sum_x P(x) \log Q(x) = \frac{1}{n} H(P, Q) です。ギブスの不等式(命題 5.2[数学を学び直す意義])により H(P,Q)≥H(P)H(P, Q) \ge H(P) で、等号は P(x)>0P(x) > 0 であるすべての xx で Q(x)=P(x)Q(x) = P(x) のときに限ります。このとき ∑x:P(x)>0Q(x)=∑x:P(x)>0P(x)=1\sum_{x : P(x) > 0} Q(x) = \sum_{x : P(x) > 0} P(x) = 1 なので、P(x)=0P(x) = 0 である xx での Q(x)Q(x) の和は 00 になります。Q(x)>0Q(x) > 0 を仮定しているので、そのような xx は存在せず、Q=PQ = P です。逆に Q=PQ = P なら等号です。

2 番目の主張は、凸関数 eue^{u} に Jensen の不等式(定理 5.2[式と証明])を、点 ux=ℓ(x)u_x = \ell(x) と重み λx=P(x)\lambda_x = P(x) で使うと exp⁡(∑xP(x)ℓ(x))≤∑xP(x)eℓ(x)\exp(\sum_x P(x) \ell(x)) \le \sum_x P(x) e^{\ell(x)}、すなわち exp⁡(E[ℓ])≤E[PPL]\exp(\mathbb{E}[\ell]) \le \mathbb{E}[\mathrm{PPL}] です。最後の不等式は、最初の不等式と指数関数の単調性から従います。

注意 4.5

この命題は下限が存在することを言うだけで、自然言語の H(P)H(P) の値を教えてはくれません。データの分布 PP そのものが未知だからです。測れるのは交差エントロピー H(P,Q)H(P, Q) の標本平均(検証用の文章での損失)で、それは H(P)H(P) の上からの評価になります。また、異なる語彙(トークン化)のモデルのパープレキシティは、1 トークンが表す文字数が違うので、そのままでは比べられません。比べるときは 1 文字あたり・1 バイトあたりのビット数に直します(トークン化の圧縮率を参照)。

損失 L(θ)\mathcal{L}(\theta) は TT 個の項の平均なので、その一部(ミニバッチ)だけで勾配を見積もる確率的勾配降下法(定義 7.1[勾配降下法])が使えます。ミニバッチ勾配は真の勾配の不偏推定量です(命題 7.2[勾配降下法])。Transformer の学習では、これをそのまま使う代わりに、勾配の移動平均と 2 乗の移動平均で成分ごとに歩幅を調整する Adam(Kingma–Ba, 2015)が標準的に使われています。Vaswani らの原論文も Adam を使っています。

定義 5.1(Adam)↗

0≤β1<10 \le \beta_1 < 1、0≤β2<10 \le \beta_2 < 1、学習率 η>0\eta > 0、ε≥0\varepsilon \ge 0 とします。時刻 t=1,2,…t = 1, 2, \ldots の(確率的)勾配を gt\boldsymbol{g}_t とし、m0=v0=0\boldsymbol{m}_0 = \boldsymbol{v}_0 = \boldsymbol{0} から

mt=β1mt−1+(1−β1) gt,vt=β2vt−1+(1−β2) gt⊙gt,m^t=mt1−β1t,v^t=vt1−β2t,θt=θt−1−η m^tv^t+ε\begin{aligned} \boldsymbol{m}_t &= \beta_1 \boldsymbol{m}_{t-1} + (1 - \beta_1)\, \boldsymbol{g}_t, & \boldsymbol{v}_t &= \beta_2 \boldsymbol{v}_{t-1} + (1 - \beta_2)\, \boldsymbol{g}_t \odot \boldsymbol{g}_t, \\ \hat{\boldsymbol{m}}_t &= \frac{\boldsymbol{m}_t}{1 - \beta_1^t}, & \hat{\boldsymbol{v}}_t &= \frac{\boldsymbol{v}_t}{1 - \beta_2^t}, \\ \theta_t &= \theta_{t-1} - \eta\, \frac{\hat{\boldsymbol{m}}_t}{\sqrt{\hat{\boldsymbol{v}}_t} + \varepsilon} \end{aligned}

と更新する方法を Adam といいます。⊙\odot は成分ごとの積で、平方根と割り算も成分ごとに行います。mt\boldsymbol{m}_t を 1 次モーメントの推定、vt\boldsymbol{v}_t を 2 次モーメントの推定、1−βt1 - \beta^t で割る操作をバイアス補正といいます。

更新は成分ごとに独立なので、以下の命題は 1 つの成分(スカラー gt,mt,vtg_t, m_t, v_t)について述べます。

命題 5.2(移動平均の閉じた形とバイアス補正)✓

0≤β<10 \le \beta < 1、a0=0a_0 = 0、at=βat−1+(1−β)cta_t = \beta a_{t-1} + (1 - \beta) c_t(t≥1t \ge 1)とします。

  1. at=(1−β)∑i=1tβt−icia_t = (1 - \beta) \sum_{i=1}^{t} \beta^{t-i} c_i です。重みの和は (1−β)∑i=1tβt−i=1−βt(1 - \beta) \sum_{i=1}^{t} \beta^{t-i} = 1 - \beta^t です。
  2. c1,…,ctc_1, \ldots, c_t が確率変数で、期待値 E[ci]=μ\mathbb{E}[c_i] = \mu が ii に依らないなら、E[at]=(1−βt)μ\mathbb{E}[a_t] = (1 - \beta^t)\mu で、E[at/(1−βt)]=μ\mathbb{E}[a_t / (1 - \beta^t)] = \mu です。

ct=gtc_t = g_t、β=β1\beta = \beta_1 とすれば mtm_t、ct=gt2c_t = g_t^2、β=β2\beta = \beta_2 とすれば vtv_t についての主張になります。

証明(命題 5.2)

1. tt についての帰納法で示します。t=1t = 1 のとき a1=(1−β)c1a_1 = (1 - \beta) c_1 で、右辺の和も (1−β)β0c1(1 - \beta)\beta^0 c_1 です。t−1t - 1 で成り立つとすると

at=β(1−β)∑i=1t−1βt−1−ici+(1−β)ct=(1−β)∑i=1t−1βt−ici+(1−β)β0ct=(1−β)∑i=1tβt−icia_t = \beta (1 - \beta) \sum_{i=1}^{t-1} \beta^{t-1-i} c_i + (1 - \beta) c_t = (1 - \beta) \sum_{i=1}^{t-1} \beta^{t-i} c_i + (1 - \beta) \beta^{0} c_t = (1 - \beta) \sum_{i=1}^{t} \beta^{t-i} c_i

です。重みの和は、j=t−ij = t - i と置き換えると (1−β)∑j=0t−1βj(1 - \beta) \sum_{j=0}^{t-1} \beta^j で、有限等比級数の和(命題 6.2[数とは何か])∑j=0t−1βj=(1−βt)/(1−β)\sum_{j=0}^{t-1} \beta^j = (1 - \beta^t) / (1 - \beta) により 1−βt1 - \beta^t です。

2. 期待値の線形性(定理 6.3[確率])と 1 から E[at]=(1−β)∑i=1tβt−iμ=(1−βt)μ\mathbb{E}[a_t] = (1 - \beta) \sum_{i=1}^{t} \beta^{t-i} \mu = (1 - \beta^t) \mu です。1−βt>01 - \beta^t > 0 は定数なので、割れば μ\mu です。

バイアス補正が効くのは学習の初めだけです。β2=0.999\beta_2 = 0.999 のとき 1−β2t1 - \beta_2^t は t=1t = 1 で 0.0010.001、t=1000t = 1000 で約 0.6320.632、t=5000t = 5000 で約 0.9930.993 です。補正をしないと、初めの数百ステップは vtv_t が実際の g2g^2 の大きさよりずっと小さく見積もられ、歩幅 mt/vtm_t / \sqrt{v_t} が大きくなりすぎます。

注意 5.3

命題 5.2 の 2 の仮定「勾配の期待値が時刻に依らない」は、学習中には厳密には成り立ちません(重みが動けば勾配の分布も変わります)。この命題が保証するのは、勾配の分布がゆっくりしか変わらない範囲で、初期値 00 に由来する偏りが取り除かれることです。Kingma–Ba の原論文も同じ仮定のもとで補正を導いています。

例 5.4(最初の 3 ステップを手で追う)

β1=0.9\beta_1 = 0.9、β2=0.999\beta_2 = 0.999 とし、ある成分の勾配が g1=1g_1 = 1、g2=2g_2 = 2、g3=−1g_3 = -1 だったとします。

ttgtg_tmtm_tvtv_tmt/vtm_t / \sqrt{v_t}m^t\hat{m}_tv^t\hat{v}_tm^t/v^t\hat{m}_t / \sqrt{\hat{v}_t}
1110.10000.10000.0010000.0010003.16233.16231.00001.00001.00001.00001.00001.0000
2220.29000.29000.0049990.0049994.10164.10161.52631.52632.50082.50080.96520.9652
3−1-10.16100.16100.0059940.0059942.07952.07950.59410.59412.00002.00000.42010.4201

たとえば t=2t = 2 では m2=0.9×0.1+0.1×2=0.29m_2 = 0.9 \times 0.1 + 0.1 \times 2 = 0.29、v2=0.999×0.001+0.001×4=0.004999v_2 = 0.999 \times 0.001 + 0.001 \times 4 = 0.004999、m^2=0.29/(1−0.81)=1.5263\hat{m}_2 = 0.29 / (1 - 0.81) = 1.5263、v^2=0.004999/(1−0.998001)=2.5008\hat{v}_2 = 0.004999 / (1 - 0.998001) = 2.5008 です。m^2\hat{m}_2 は g1,g2g_1, g_2 の重みつき平均(重み 0.9/1.90.9 / 1.9 と 1/1.91 / 1.9)、v^2\hat{v}_2 は g12,g22g_1^2, g_2^2 のほぼ単純平均になっています。

補正なしの比 mt/vtm_t / \sqrt{v_t} は 22〜44 程度で、補正ありの比の数倍です。t=1t = 1 では、補正ありの比はどんな g1≠0g_1 \ne 0 でも g1/∣g1∣=±1g_1 / |g_1| = \pm 1 になります。最初の 1 歩は、勾配の大きさに関係なく、各成分がちょうど η\eta だけ動きます。

この例で見た「比が勾配の大きさに依らない」という性質は、一般に成り立ちます。

次の命題のねらいは、更新量 ∣mt∣/vt|m_t| / \sqrt{v_t} に、勾配の大きさに依らない上限があると示すことです。mtm_t は勾配の重みつき和、vtv_t は勾配の 2 乗の重みつき和なので、mtm_t の 2 乗を vtv_t で抑える形にすれば比の上限が出ます。そのためにコーシー・シュワルツの不等式を使い、重み β1t−i\beta_1^{t-i} を (β1/β2)t−i(\beta_1/\sqrt{\beta_2})^{t-i} と (β2)t−i(\sqrt{\beta_2})^{t-i} の積に分けます。後者が vtv_t の重みの平方根に当たり、前者の 2 乗の和が等比級数 ∑ρt−i\sum \rho^{t-i}(ρ=β12/β2\rho = \beta_1^2/\beta_2)になります。

命題 5.5(Adam の更新量の上界とスケール不変性)✓

0≤β1<10 \le \beta_1 < 1、0<β2<10 < \beta_2 < 1、ρ=β12/β2<1\rho = \beta_1^2 / \beta_2 < 1 とします。実数 g1,…,gtg_1, \ldots, g_t のうち少なくとも 1 つが 00 でないとし、mt,vtm_t, v_t を 定義 5.1 の 1 成分とします。

  1. ∣mt∣vt≤1−β11−β21−ρt1−ρ≤1−β1(1−β2)(1−β12/β2)\dfrac{|m_t|}{\sqrt{v_t}} \le \dfrac{1 - \beta_1}{\sqrt{1 - \beta_2}} \sqrt{\dfrac{1 - \rho^t}{1 - \rho}} \le \dfrac{1 - \beta_1}{\sqrt{(1 - \beta_2)(1 - \beta_1^2 / \beta_2)}} です。
  2. バイアス補正をした量については ∣m^t∣v^t≤1−β2t1−β1t⋅1−β11−β21−ρt1−ρ\dfrac{|\hat{m}_t|}{\sqrt{\hat{v}_t}} \le \dfrac{\sqrt{1 - \beta_2^t}}{1 - \beta_1^t} \cdot \dfrac{1 - \beta_1}{\sqrt{1 - \beta_2}} \sqrt{\dfrac{1 - \rho^t}{1 - \rho}} です。
  3. c>0c > 0 として勾配を一律に gi↦c gig_i \mapsto c\, g_i と置き換えても、mt/vtm_t / \sqrt{v_t} と m^t/v^t\hat{m}_t / \sqrt{\hat{v}_t} は変わりません。

したがって ε=0\varepsilon = 0 の Adam では、1 ステップで各成分が動く量 η ∣m^t∣/v^t\eta\, |\hat{m}_t| / \sqrt{\hat{v}_t} は、勾配の大きさに依らず、η\eta と β1,β2,t\beta_1, \beta_2, t だけで決まる定数以下です。

証明(命題 5.5)

1. 命題 5.2 の 1 から mt=(1−β1)∑i=1tβ1t−igim_t = (1 - \beta_1) \sum_{i=1}^{t} \beta_1^{t-i} g_i、vt=(1−β2)∑i=1tβ2t−igi2v_t = (1 - \beta_2) \sum_{i=1}^{t} \beta_2^{t-i} g_i^2 です。少なくとも 1 つの gig_i が 00 でなく β2>0\beta_2 > 0 なので vt>0v_t > 0 です。各項を

β1t−igi=(β1β2)t−i⋅(β2)t−igi\beta_1^{t-i} g_i = \Bigl(\frac{\beta_1}{\sqrt{\beta_2}}\Bigr)^{t-i} \cdot \bigl(\sqrt{\beta_2}\bigr)^{t-i} g_i

と 2 つの因子に分け、Rt\mathbb{R}^t の標準内積についてのコーシー・シュワルツの不等式(定理 4.2[内積空間とグラム・シュミット直交化])を使うと

(∑i=1tβ1t−igi)2≤(∑i=1tρt−i)(∑i=1tβ2t−igi2)=1−ρt1−ρ⋅vt1−β2\Bigl(\sum_{i=1}^{t} \beta_1^{t-i} g_i\Bigr)^2 \le \Bigl(\sum_{i=1}^{t} \rho^{t-i}\Bigr) \Bigl(\sum_{i=1}^{t} \beta_2^{t-i} g_i^2\Bigr) = \frac{1 - \rho^t}{1 - \rho} \cdot \frac{v_t}{1 - \beta_2}

です。最後の等号では、等比級数の和(命題 6.2[数とは何か])∑j=0t−1ρj=(1−ρt)/(1−ρ)\sum_{j=0}^{t-1} \rho^j = (1 - \rho^t)/(1 - \rho) と vtv_t の閉じた形を使いました。両辺に (1−β1)2(1 - \beta_1)^2 を掛けて平方根を取り、vt\sqrt{v_t} で割ると最初の不等式です。0≤ρt0 \le \rho^t なので 1−ρt≤11 - \rho^t \le 1 で、2 番目の不等式が従います。

2. ∣m^t∣/v^t=(∣mt∣/(1−β1t))⋅1−β2t/vt|\hat{m}_t| / \sqrt{\hat{v}_t} = \bigl(|m_t| / (1 - \beta_1^t)\bigr) \cdot \sqrt{1 - \beta_2^t} / \sqrt{v_t} なので、1 の両辺に 1−β2t/(1−β1t)\sqrt{1 - \beta_2^t} / (1 - \beta_1^t) を掛けたものです。

3. mtm_t は gig_i の 1 次式なので cc 倍に、vtv_t は gi2g_i^2 の 1 次式なので c2c^2 倍になります。c>0c > 0 なので c2vt=cvt\sqrt{c^2 v_t} = c \sqrt{v_t} で、比は変わりません。バイアス補正は gg に依らない定数で割るだけなので、m^t/v^t\hat{m}_t / \sqrt{\hat{v}_t} も変わりません。

上界の値は β1,β2\beta_1, \beta_2 の組で大きく変わります。(β1,β2)=(0.9,0.999)(\beta_1, \beta_2) = (0.9, 0.999) では 0.1/0.001×(1−0.81/0.999)≈7.270.1 / \sqrt{0.001 \times (1 - 0.81/0.999)} \approx 7.27、Vaswani らが使った (0.9,0.98)(0.9, 0.98) では 0.1/0.02×(1−0.81/0.98)≈1.700.1 / \sqrt{0.02 \times (1 - 0.81/0.98)} \approx 1.70 です。勾配が gi∝(β2/β1)ig_i \propto (\beta_2 / \beta_1)^i のように毎ステップ一定の比で大きくなり続けるとき、各 tt で 1 の最初の不等式が等号になり(コーシー・シュワルツの不等式の等号条件)、t→∞t \to \infty で右端の値に近づきます。したがって右端の値は、これより小さくできない上限です。勾配が一定のときは m^t/v^t=±1\hat{m}_t / \sqrt{\hat{v}_t} = \pm 1 ちょうどで、勾配の符号が毎回入れ替わるときは 11 よりずっと小さくなります(演習 10.3 では約 1/191/19)。下のコードで上限に近づく場合と一定の場合を確かめます。

次の注意は、原論文の記述と本記事の上界が食い違って見える点についてです。結論だけ先に言うと、原論文の値は典型的な場合の目安で、本記事の値は最悪の場合の上限です。

スケール不変性(3)は、Adam が損失を定数倍しても同じ軌道をたどることを意味します。素の勾配降下法では、損失を 1010 倍すると歩幅も 1010 倍になり、学習率を調整し直す必要があります。一方でこの性質は、次の命題のとおり、L2 正則化の効き方を変えてしまいます。

定義 5.6(L2 正則化・重み減衰・AdamW)↗

損失 f(θ)f(\theta) と λ≥0\lambda \ge 0 に対して、

  • L2 正則化: ff の代わりに f(θ)+λ2∥θ∥2f(\theta) + \frac{\lambda}{2} \|\theta\|^2 を最小化します。勾配は ∇f(θ)+λθ\nabla f(\theta) + \lambda \theta になります。
  • 重み減衰: ff の勾配による更新とは別に、ステップごとに θ\theta から ηλθ\eta \lambda \theta を引きます。
  • AdamW: 定義 5.1 の gt\boldsymbol{g}_t には ff だけの勾配を使い、更新を θt=θt−1−η(m^tv^t+ε+λ θt−1)\theta_t = \theta_{t-1} - \eta \Bigl( \dfrac{\hat{\boldsymbol{m}}_t}{\sqrt{\hat{\boldsymbol{v}}_t} + \varepsilon} + \lambda\, \theta_{t-1} \Bigr) とします。

注意 5.7

Loshchilov–Hutter の原論文は、減衰の項に学習率を掛けない形(減衰率とスケジュールの乗数だけを掛ける形)で書いています。上の定義は減衰率を ηλ\eta\lambda とまとめた形で、λ\lambda の値の読み替えだけの違いです。以下の命題は、どちらの書き方でも同じ内容になります。

命題 5.8(L2 正則化と重み減衰は SGD では一致し、Adam では一致しない)✓

ff を微分可能な損失、η>0\eta > 0、λ≥0\lambda \ge 0 とします。

  1. 素の(確率的)勾配降下法では、L2 正則化つきの 1 ステップ θ′=θ−η(g+λθ)\theta' = \theta - \eta (\boldsymbol{g} + \lambda \theta) と、重み減衰つきの 1 ステップ θ′=(1−ηλ)θ−ηg\theta' = (1 - \eta\lambda)\theta - \eta \boldsymbol{g} は、同じ θ,g\theta, \boldsymbol{g} に対して同じ値を与えます。
  2. ε=0\varepsilon = 0 の Adam の最初の 1 ステップ(m0=v0=0m_0 = v_0 = 0)を 1 成分で考え、その成分の損失の勾配を g≠0g \ne 0、重みを θ0\theta_0 とし、g+λθ0≠0g + \lambda\theta_0 \ne 0 とします。L2 正則化つきの Adam は θ1=θ0−η sgn(g+λθ0)\theta_1 = \theta_0 - \eta\, \mathrm{sgn}(g + \lambda\theta_0)、AdamW は θ1=(1−ηλ)θ0−η sgn(g)\theta_1 = (1 - \eta\lambda)\theta_0 - \eta\, \mathrm{sgn}(g) を与えます。λθ0≠0\lambda\theta_0 \ne 0 で gg と g+λθ0g + \lambda\theta_0 の符号が同じなら、両者の差は ηλθ0≠0\eta\lambda\theta_0 \ne 0 です。
証明(命題 5.8)

1. θ−η(g+λθ)=θ−ηλθ−ηg=(1−ηλ)θ−ηg\theta - \eta(\boldsymbol{g} + \lambda\theta) = \theta - \eta\lambda\theta - \eta \boldsymbol{g} = (1 - \eta\lambda)\theta - \eta \boldsymbol{g} です。

2. 最初のステップでは、使う勾配を g~\tilde{g} とすると m1=(1−β1)g~m_1 = (1 - \beta_1)\tilde{g}、v1=(1−β2)g~2v_1 = (1 - \beta_2)\tilde{g}^2 で、バイアス補正により m^1=g~\hat{m}_1 = \tilde{g}、v^1=g~2\hat{v}_1 = \tilde{g}^2 です。したがって m^1/v^1=g~/∣g~∣=sgn(g~)\hat{m}_1 / \sqrt{\hat{v}_1} = \tilde{g} / |\tilde{g}| = \mathrm{sgn}(\tilde{g}) です。L2 正則化つきの Adam は g~=g+λθ0\tilde{g} = g + \lambda\theta_0 を使うので θ1=θ0−η sgn(g+λθ0)\theta_1 = \theta_0 - \eta\, \mathrm{sgn}(g + \lambda\theta_0) です。AdamW は g~=g\tilde{g} = g を使い、別に ηλθ0\eta\lambda\theta_0 を引くので θ1=θ0−η sgn(g)−ηλθ0\theta_1 = \theta_0 - \eta\, \mathrm{sgn}(g) - \eta\lambda\theta_0 です。符号が同じとき、差は ηλθ0\eta\lambda\theta_0 です。

2 の式を見ると、違いの理由が分かります。L2 正則化の項 λθ\lambda\theta は勾配に足されるので、2 次モーメントで割られる側に入ります。すると 命題 5.5 のスケール不変性によって、その大きさの情報が失われます。θ0\theta_0 が 1010 でも 10001000 でも、最初の 1 歩で引かれる量は η\eta です。AdamW は減衰の項を割り算の外に出すので、重みの大きさに比例した量が引かれます。

例 5.9(1 ステップの値を比べる)

θ0=10\theta_0 = 10、損失の勾配 g=1g = 1、λ=0.1\lambda = 0.1、η=0.1\eta = 0.1 とします。

  • SGD + L2 正則化: 10−0.1×(1+0.1×10)=9.810 - 0.1 \times (1 + 0.1 \times 10) = 9.8。
  • SGD + 重み減衰: (1−0.01)×10−0.1×1=9.8(1 - 0.01) \times 10 - 0.1 \times 1 = 9.8。一致します。
  • Adam + L2 正則化: g~=2\tilde{g} = 2 で sgn(g~)=1\mathrm{sgn}(\tilde{g}) = 1、θ1=10−0.1=9.9\theta_1 = 10 - 0.1 = 9.9。
  • AdamW: θ1=10−0.1×1−0.1×0.1×10=9.8\theta_1 = 10 - 0.1 \times 1 - 0.1 \times 0.1 \times 10 = 9.8。

Adam + L2 正則化では、正則化の項は勾配を 11 から 22 に変えましたが、符号が同じなので更新には何の影響も与えていません。

次のコードは、Adam と AdamW を 1 つの関数にまとめ、上の例と、曲率が成分によって 10410^4 倍違う 2 次関数での結果を比べます。

# Python 3.12.14, NumPy 2.5.2
import numpy as np
def run(grad, theta, steps, eta=0.1, b1=0.9, b2=0.999, eps=1e-8, l2=0.0, wd=0.0):
"""l2: 損失に (l2/2)|theta|^2 を足す(Adam + L2)。wd: 重み減衰(AdamW)。"""
theta = np.array(theta, dtype=float); m = np.zeros_like(theta); v = np.zeros_like(theta)
for t in range(1, steps + 1):
g = grad(theta) + l2 * theta # L2 正則化は勾配に入る
m = b1 * m + (1 - b1) * g
v = b2 * v + (1 - b2) * g * g
mhat, vhat = m / (1 - b1 ** t), v / (1 - b2 ** t)
theta = theta - eta * mhat / (np.sqrt(vhat) + eps) - eta * wd * theta # 減衰は外で掛ける
return theta
# (a) 1 ステップ: theta = 10, 損失の勾配 g = 1, lambda = 0.1, eta = 0.1
g1 = lambda th: np.ones_like(th)
print("1 step Adam+L2:", run(g1, [10.0], 1, l2=0.1), " AdamW:", run(g1, [10.0], 1, wd=0.1))
print("1 step SGD+L2 :", 10.0 - 0.1 * (1 + 0.1 * 10.0), " SGD+decay:", (1 - 0.1 * 0.1) * 10.0 - 0.1 * 1)
# (b) 曲率が 10^4 倍違う 2 成分: f(theta) = 100*(th1 - 1)^2/2 + 0.01*(th2 - 1)^2/2
h = np.array([100.0, 0.01])
gq = lambda th: h * (th - 1.0)
print("exact minimizer with L2 (lambda=0.01):", h / (h + 0.01))
print("Adam+L2, 2000 steps:", run(gq, [0.0, 0.0], 2000, eta=0.01, l2=0.01))
print("AdamW , 2000 steps:", run(gq, [0.0, 0.0], 2000, eta=0.01, wd=0.01))
# (c) |m_t|/sqrt(v_t) の上界と、それに近づく勾配列 g_i = (b2/b1)^i
b1, b2 = 0.9, 0.999
bound = (1 - b1) / np.sqrt((1 - b2) * (1 - b1 ** 2 / b2))
m = v = 0.0
for i in range(1, 201):
g = (b2 / b1) ** i
m = b1 * m + (1 - b1) * g; v = b2 * v + (1 - b2) * g * g
print(f"bound = {bound:.4f}, attained ratio after 200 steps = {m/np.sqrt(v):.4f}")
m = v = 0.0
for i in range(1, 201):
m = b1 * m + (1 - b1) * 3.0; v = b2 * v + (1 - b2) * 9.0
print(f"constant gradient 3: m/sqrt(v) = {m/np.sqrt(v):.4f}, corrected = {(m/(1-b1**200))/np.sqrt(v/(1-b2**200)):.4f}")
1 step Adam+L2: [9.9] AdamW: [9.8]
1 step SGD+L2 : 9.8 SGD+decay: 9.8
exact minimizer with L2 (lambda=0.01): [0.99990001 0.5 ]
Adam+L2, 2000 steps: [0.99990001 0.5 ]
AdamW , 2000 steps: [0.99921108 0.99921107]
bound = 7.2703, attained ratio after 200 steps = 7.2703
constant gradient 3: m/sqrt(v) = 2.3482, corrected = 1.0000

(b) の関数 f(θ)=1002(θ1−1)2+0.012(θ2−1)2f(\theta) = \frac{100}{2}(\theta_1 - 1)^2 + \frac{0.01}{2}(\theta_2 - 1)^2 に λ2∥θ∥2\frac{\lambda}{2}\|\theta\|^2 を足したものの最小点は、成分ごとに hi/(hi+λ)h_i / (h_i + \lambda) で、λ=0.01\lambda = 0.01 なら (0.9999,0.5)(0.9999, 0.5) です。Adam + L2 正則化はこの点に収束しています(停留点では勾配が 0\boldsymbol{0} なので、割り算の有無は停留点の位置を変えません)。曲率の小さい第 2 成分は半分まで縮みます。AdamW は 20002000 ステップの時点で別の点 (0.9992,0.9992)(0.9992, 0.9992) にあり、曲率が 10410^4 倍違う 2 つの成分がほぼ同じ値になっています(この点で止まっているわけではなく、さらに続けると両成分とも 11 のすぐ下まで近づきます。同じコードで 2020 万ステップ回すと、どちらも 0.999990.99999 より大きくなります)。AdamW が最小化しているのは f+λ2∥θ∥2f + \frac{\lambda}{2}\|\theta\|^2 ではない、ということです。どちらが汎化に良いかは証明できる事柄ではなく、Loshchilov–Hutter が実験で比較しています。

6. 学習率スケジュールと勾配クリッピング

Section titled “6. 学習率スケジュールと勾配クリッピング”

定義 6.1(ウォームアップつきの学習率スケジュール)↗

ステップ tt ごとに学習率 ηt\eta_t を変える規則を学習率スケジュールといいます。Vaswani らは、モデルの次元 dd とウォームアップのステップ数 ww に対して

η(t)=d−1/2min⁡(t−1/2, t w−3/2)(t>0)\eta(t) = d^{-1/2} \min\bigl(t^{-1/2},\ t\, w^{-3/2}\bigr) \qquad (t > 0)

を使いました。初めの ww ステップで学習率を 00 近くから直線的に上げることを線形ウォームアップ、その後 t−1/2t^{-1/2} に比例して下げることを逆平方根減衰といいます。ウォームアップのあと、総ステップ数 Tmax⁡T_{\max} までを η(t)=12ηmax⁡(1+cos⁡(π(t−w)/(Tmax⁡−w)))\eta(t) = \frac{1}{2} \eta_{\max} \bigl(1 + \cos(\pi (t - w) / (T_{\max} - w))\bigr) で下げる規則をコサイン減衰といいます。

命題 6.2(Vaswani らのスケジュールの形)✓

d,w>0d, w > 0 とし、η(t)=d−1/2min⁡(t−1/2,t w−3/2)\eta(t) = d^{-1/2} \min(t^{-1/2}, t\, w^{-3/2})(t>0t > 0)とします。

  1. 0<t≤w0 < t \le w では η(t)=d−1/2w−3/2 t\eta(t) = d^{-1/2} w^{-3/2}\, t(tt の 1 次式で狭義単調増加)、t≥wt \ge w では η(t)=d−1/2t−1/2\eta(t) = d^{-1/2} t^{-1/2}(狭義単調減少)です。
  2. η\eta は t>0t > 0 で連続で、t=wt = w でただ 1 つの最大値 η(w)=(d w)−1/2\eta(w) = (d\, w)^{-1/2} を取ります。
証明(命題 6.2)

1. t,w>0t, w > 0 について、t w−3/2≤t−1/2t\, w^{-3/2} \le t^{-1/2} は両辺に t1/2w3/2>0t^{1/2} w^{3/2} > 0 を掛けて t3/2≤w3/2t^{3/2} \le w^{3/2}、すなわち t≤wt \le w と同値です。したがって t≤wt \le w では最小値は t w−3/2t\, w^{-3/2}、t≥wt \ge w では t−1/2t^{-1/2} です。前者は傾きが正の 1 次式、後者は t−1/2t^{-1/2} の導関数が −12t−3/2-\frac{1}{2} t^{-3/2} で負なので狭義単調減少です(系 3.4[平均値の定理とテイラーの定理] の 3 を −η-\eta に使います)。

2. t=wt = w では 2 つの式がともに d−1/2w−1/2d^{-1/2} w^{-1/2} を与えるので、η\eta は t=wt = w でつながっています。それぞれの区間の上では連続な関数なので、η\eta は t>0t > 0 全体で連続です。1 により、tt が ww より小さいとき η(t)\eta(t) は η(w)\eta(w) より小さく、ww より大きいときも η(w)\eta(w) より小さいので、最大値は t=wt = w だけで取られ、その値は d−1/2w−1/2=(d w)−1/2d^{-1/2} w^{-1/2} = (d\, w)^{-1/2} です。

原論文の基本の構成は d=512d = 512、w=4000w = 4000 なので、最大の学習率は (512×4000)−1/2≈6.99×10−4(512 \times 4000)^{-1/2} \approx 6.99 \times 10^{-4} です。t=2000t = 2000 ではその半分の 3.49×10−43.49 \times 10^{-4}、t=16000t = 16000 でも 3.49×10−43.49 \times 10^{-4} です(t−1/2t^{-1/2} は tt が 44 倍で半分になります)。

ウォームアップがなぜ要るのかは、定理ではありません。ただ、例 5.4 で見たように、学習の初めは v^t\hat{v}_t がごく少数の勾配だけから見積もられ、どの成分も η\eta 程度ずつ動きます。初めの学習率を小さくしておけば、見積もりが安定するまでの動きを抑えられます。これは 1 つの説明で、証明された必要条件ではありません。

定義 6.3(ノルムによる勾配クリッピング)↗

しきい値 c>0c > 0 に対して、

clipc(g)=g⋅min⁡(1, c∥g∥)(g≠0),clipc(0)=0\mathrm{clip}_c(\boldsymbol{g}) = \boldsymbol{g} \cdot \min\Bigl(1,\ \frac{c}{\|\boldsymbol{g}\|}\Bigr) \quad (\boldsymbol{g} \ne \boldsymbol{0}), \qquad \mathrm{clip}_c(\boldsymbol{0}) = \boldsymbol{0}

をノルムによる勾配クリッピングといいます。

命題 6.4(クリッピングは方向を保ち、1 ステップの損失の増加を抑える)✓

c>0c > 0 とします。

  1. clipc(g)\mathrm{clip}_c(\boldsymbol{g}) は g\boldsymbol{g} の非負の定数倍で、∥clipc(g)∥=min⁡(∥g∥,c)≤c\|\mathrm{clip}_c(\boldsymbol{g})\| = \min(\|\boldsymbol{g}\|, c) \le c です。∥g∥≤c\|\boldsymbol{g}\| \le c なら clipc(g)=g\mathrm{clip}_c(\boldsymbol{g}) = \boldsymbol{g} です。
  2. f:RP→Rf : \mathbb{R}^P \to \mathbb{R} を C1C^1 級で LL-平滑(定義 4.2[勾配降下法])とします。任意のベクトル g^\hat{\boldsymbol{g}}(真の勾配でなくてもかまいません)で θ′=θ−η clipc(g^)\theta' = \theta - \eta\, \mathrm{clip}_c(\hat{\boldsymbol{g}}) と更新すると
f(θ′)≤f(θ)+η c ∥∇f(θ)∥+L2η2c2f(\theta') \le f(\theta) + \eta\, c\, \|\nabla f(\theta)\| + \frac{L}{2} \eta^2 c^2

です。 3. 2 でとくに g^=∇f(θ)≠0\hat{\boldsymbol{g}} = \nabla f(\theta) \ne \boldsymbol{0} とし、s=min⁡(1,c/∥∇f(θ)∥)s = \min(1, c / \|\nabla f(\theta)\|) とおくと

f(θ′)≤f(θ)−η s(1−Lηs2)∥∇f(θ)∥2f(\theta') \le f(\theta) - \eta\, s \Bigl(1 - \frac{L \eta s}{2}\Bigr) \|\nabla f(\theta)\|^2

で、0<η<2/L0 < \eta < 2/L なら f(θ′)<f(θ)f(\theta') < f(\theta) です。

証明(命題 6.4)

1. g≠0\boldsymbol{g} \ne \boldsymbol{0} のとき、s=min⁡(1,c/∥g∥)>0s = \min(1, c/\|\boldsymbol{g}\|) > 0 は正の数で、clipc(g)=sg\mathrm{clip}_c(\boldsymbol{g}) = s \boldsymbol{g} です。ノルムは s∥g∥=min⁡(∥g∥,c)s \|\boldsymbol{g}\| = \min(\|\boldsymbol{g}\|, c) です。∥g∥≤c\|\boldsymbol{g}\| \le c なら c/∥g∥≥1c / \|\boldsymbol{g}\| \ge 1 で s=1s = 1 です。g=0\boldsymbol{g} = \boldsymbol{0} のときは定義から明示的に 0\boldsymbol{0} で、主張はどれも成り立ちます。

2. u=clipc(g^)\boldsymbol{u} = \mathrm{clip}_c(\hat{\boldsymbol{g}}) とおくと、1 から ∥u∥≤c\|\boldsymbol{u}\| \le c です。降下補題(補題 4.3[勾配降下法])を v=θ−ηu\boldsymbol{v} = \theta - \eta \boldsymbol{u} に使うと

f(θ−ηu)≤f(θ)−η⟨∇f(θ),u⟩+L2η2∥u∥2f(\theta - \eta \boldsymbol{u}) \le f(\theta) - \eta \langle \nabla f(\theta), \boldsymbol{u} \rangle + \frac{L}{2} \eta^2 \|\boldsymbol{u}\|^2

です。コーシー・シュワルツの不等式(定理 4.2[内積空間とグラム・シュミット直交化])から −⟨∇f(θ),u⟩≤∥∇f(θ)∥∥u∥≤c ∥∇f(θ)∥-\langle \nabla f(\theta), \boldsymbol{u} \rangle \le \|\nabla f(\theta)\| \|\boldsymbol{u}\| \le c\, \|\nabla f(\theta)\| で、∥u∥2≤c2\|\boldsymbol{u}\|^2 \le c^2 なので主張が従います。

3. u=s∇f(θ)\boldsymbol{u} = s \nabla f(\theta) を同じ不等式に入れると ⟨∇f(θ),u⟩=s∥∇f(θ)∥2\langle \nabla f(\theta), \boldsymbol{u} \rangle = s \|\nabla f(\theta)\|^2、∥u∥2=s2∥∇f(θ)∥2\|\boldsymbol{u}\|^2 = s^2 \|\nabla f(\theta)\|^2 なので

f(θ′)≤f(θ)−ηs∥∇f(θ)∥2+L2η2s2∥∇f(θ)∥2f(\theta') \le f(\theta) - \eta s \|\nabla f(\theta)\|^2 + \frac{L}{2} \eta^2 s^2 \|\nabla f(\theta)\|^2

で、まとめると主張の式です。0<s≤10 < s \le 1 と η<2/L\eta < 2/L から Lηs/2<1L\eta s / 2 < 1 で、括弧の中は正です。

2 の上界が要点です。クリッピングがなければ、右辺の cc のところに ∥g^∥\|\hat{\boldsymbol{g}}\| が入り、たまたま巨大な確率的勾配が出た 1 ステップで損失が大きく増えることがあります。クリッピングをすると、どんな g^\hat{\boldsymbol{g}} が来ても、1 ステップの増加は ηc∥∇f(θ)∥+L2η2c2\eta c \|\nabla f(\theta)\| + \frac{L}{2}\eta^2 c^2 で頭打ちになります。Pascanu らは、再帰型ネットワークの勾配が急に大きくなる現象への対処としてこの方法を提案しました。なお、ニューラルネットワークの損失が大域的に LL-平滑であるとは限らないので、2・3 は仮定が成り立つ範囲での主張です。

7. 小さなモデルを実際に学習する

Section titled “7. 小さなモデルを実際に学習する”

ここまでの部品を 1 つにまとめ、前章のモデルを 1 層・1 ヘッドに縮めてバイアスを省いたもの(埋め込み、Pre-LN のブロック 1 つ、最後の層正規化、入力と共有した出力行列)を、6868 文字の自作の文で学習します。トークンは文字、語彙は 1515 種類です。逆伝播は手で書き、数値微分と照合します。

コードの ln_back などの逆伝播の関数は、各層の微分を連鎖律で順にたどったものです。細部を読み込まなくても、直後の検査(数値微分との差が小さいこと)で合っていることが確かめられます。

# Python 3.12.14, NumPy 2.5.2
import numpy as np
text = "the cat sat on the mat. the dog sat on the log. the cat saw the dog."
chars = sorted(set(text)); V = len(chars)
ids = np.array([chars.index(c) for c in text])
x, y = ids[:-1], ids[1:]; n = len(x); d = 16; dff = 32
held = np.array([chars.index(c) for c in "the dog sat on the mat."])
rng = np.random.default_rng(20261010)
P = {"E": rng.normal(0, 0.1, (V, d)), "pos": rng.normal(0, 0.1, (n, d)),
"Wq": rng.normal(0, 0.1, (d, d)), "Wk": rng.normal(0, 0.1, (d, d)),
"Wv": rng.normal(0, 0.1, (d, d)), "Wo": rng.normal(0, 0.1, (d, d)),
"W1": rng.normal(0, 0.1, (d, dff)), "W2": rng.normal(0, 0.1, (dff, d))}
for k in ("g1", "g2", "g3"): P[k] = np.ones(d)
for k in ("b1", "b2", "b3"): P[k] = np.zeros(d)
def ln(h, g, b): # 層正規化(行ごと)
s = np.sqrt(h.var(axis=1, keepdims=True) + 1e-5)
xh = (h - h.mean(axis=1, keepdims=True)) / s
return g * xh + b, (xh, s)
def ln_back(dy, g, cache): # 層正規化の逆伝播
xh, s = cache; dxh = dy * g
dx = (dxh - dxh.mean(axis=1, keepdims=True)
- xh * (dxh * xh).mean(axis=1, keepdims=True)) / s
return dx, (dy * xh).sum(axis=0), dy.sum(axis=0)
def loss_and_grad(P, x, y):
n = len(x); mask = np.triu(np.full((n, n), -np.inf), 1) # 因果マスク
h0 = P["E"][x] + P["pos"][:n]
a, c1 = ln(h0, P["g1"], P["b1"])
q, k, v = a @ P["Wq"], a @ P["Wk"], a @ P["Wv"]
S = q @ k.T / np.sqrt(d) + mask
A = np.exp(S - S.max(axis=1, keepdims=True)); A /= A.sum(axis=1, keepdims=True)
av = A @ v; h1 = h0 + av @ P["Wo"]
m, c2 = ln(h1, P["g2"], P["b2"])
pre = m @ P["W1"]; r = np.maximum(pre, 0); h2 = h1 + r @ P["W2"]
f, c3 = ln(h2, P["g3"], P["b3"])
z = f @ P["E"].T # 重み共有: 出力側も E
z = z - z.max(axis=1, keepdims=True)
logp = z - np.log(np.exp(z).sum(axis=1, keepdims=True))
loss = -logp[np.arange(n), y].mean()
G = {}
dz = np.exp(logp); dz[np.arange(n), y] -= 1; dz /= n # softmax - one-hot
G["E"] = dz.T @ f
dh2, G["g3"], G["b3"] = ln_back(dz @ P["E"], P["g3"], c3)
G["W2"] = r.T @ dh2; dpre = (dh2 @ P["W2"].T) * (pre > 0)
G["W1"] = m.T @ dpre
dm, G["g2"], G["b2"] = ln_back(dpre @ P["W1"].T, P["g2"], c2)
dh1 = dh2 + dm
G["Wo"] = av.T @ dh1; dav = dh1 @ P["Wo"].T
dA = dav @ v.T; dv = A.T @ dav
dS = A * (dA - (dA * A).sum(axis=1, keepdims=True)) / np.sqrt(d)
dq, dk = dS @ k, dS.T @ q
G["Wq"], G["Wk"], G["Wv"] = a.T @ dq, a.T @ dk, a.T @ dv
da = dq @ P["Wq"].T + dk @ P["Wk"].T + dv @ P["Wv"].T
dh, G["g1"], G["b1"] = ln_back(da, P["g1"], c1)
dh0 = dh1 + dh
G["pos"] = np.zeros_like(P["pos"]); G["pos"][:n] = dh0; np.add.at(G["E"], x, dh0)
return loss, G
# 逆伝播の検査: 中心差分との最大のずれ
loss, G = loss_and_grad(P, x, y); worst = 0.0
for name in P:
for _ in range(3):
i = tuple(rng.integers(0, s) for s in P[name].shape)
old = P[name][i]; eps = 1e-5
P[name][i] = old + eps; lp = loss_and_grad(P, x, y)[0]
P[name][i] = old - eps; lm = loss_and_grad(P, x, y)[0]
P[name][i] = old
worst = max(worst, abs((lp - lm) / (2 * eps) - G[name][i]))
print(f"|V| = {V}, n = {n}, parameters = {sum(p.size for p in P.values())}")
print(f"max |numeric - backprop| = {worst:.2e}")
# Adam(バイアス補正つき)で全系列を 1 バッチとして学習
m1 = {k: np.zeros_like(p) for k, p in P.items()}
m2 = {k: np.zeros_like(p) for k, p in P.items()}
eta, b1, b2, eps = 0.01, 0.9, 0.999, 1e-8
print(" step loss perplexity held-out ppl")
for t in range(1, 301):
loss, G = loss_and_grad(P, x, y)
if t in (1, 10, 50, 100, 200, 300):
ho = loss_and_grad(P, held[:-1], held[1:])[0]
print(f"{t:5d} {loss:6.3f} {np.exp(loss):10.3f} {np.exp(ho):12.3f}")
for k in P:
m1[k] = b1 * m1[k] + (1 - b1) * G[k]
m2[k] = b2 * m2[k] + (1 - b2) * G[k] ** 2
P[k] -= eta * (m1[k] / (1 - b1 ** t)) / (np.sqrt(m2[k] / (1 - b2 ** t)) + eps)
print(f"log |V| = {np.log(V):.3f}")
|V| = 15, n = 67, parameters = 3456
max |numeric - backprop| = 6.43e-11
step loss perplexity held-out ppl
1 2.787 16.231 15.772
10 1.442 4.229 5.430
50 0.021 1.021 1.764
100 0.005 1.005 1.961
200 0.002 1.002 2.129
300 0.001 1.001 2.249
log |V| = 2.708

読み取れることを 3 つ挙げます。

  • 逆伝播と数値微分の差は 10−1010^{-10} 程度で、手で書いた勾配(出力層の softmax−one-hot\mathrm{softmax} - \text{one-hot} から始まる連鎖)が合っていることが確かめられます。
  • 学習前の損失 2.7872.787 は log⁡∣V∣=2.708\log |V| = 2.708 に近く、パープレキシティ 16.216.2 は語彙の大きさ 1515 に近い値です。小さな乱数で初期化したモデルはほぼ一様分布を出すので、定理 4.2 の 3 のとおりになります。
  • 学習に使った列のパープレキシティは下限の 11 に近づきます。これは 6767 個の位置の答えを 34563456 個の重みで丸暗記した結果で、文の規則を身につけたことを意味しません。学習に使っていない文「the dog sat on the mat.」のパープレキシティは、表示した中では 5050 ステップ目の 1.761.76 が最も小さく、その後は上がっています。学習データの損失だけを見ていても、この過学習(学習に使ったデータには合うが、新しいデータには合わなくなること)は分かりません。

実際の学習では、コーパスを文脈長ごとの断片に切ってミニバッチにし、検証用のデータの損失を見て学習を止める時点を決めます。手続きの骨組み(順伝播、交差エントロピー、逆伝播、Adam の更新)はこのコードと同じです。

定義 8.1(事前学習と微調整)↗

大きなコーパスで次トークン予測の損失を最小化する学習を事前学習、その結果の重み θ0\theta_0 を初期値として、別の(ふつうはずっと小さい)データで学習を続けることを微調整といいます。すべての重みを更新する微調整を全体の微調整といいます。

全体の微調整は、用途ごとに元のモデルと同じ大きさの重みを 1 組ずつ保存することになります。Hu らの LoRA は、重み行列の更新を低階数の積に限ることで、保存し学習する量を減らします。

定義 8.2(低階数適応(LoRA))↗

事前学習済みの重み行列 W0∈Rd×kW_0 \in \mathbb{R}^{d \times k} と整数 r≥1r \ge 1 に対して、B∈Rd×rB \in \mathbb{R}^{d \times r}、A∈Rr×kA \in \mathbb{R}^{r \times k} を新しい重みとして導入し、

W=W0+ΔW,ΔW=BAW = W_0 + \Delta W, \qquad \Delta W = B A

とおきます。W0W_0 は固定し、AA と BB だけを学習する方法を低階数適応(LoRA)といい、rr をその階数(の上限)といいます。原論文では AA を乱数、BB を零行列で初期化し、ΔW\Delta W に定数 α/r\alpha / r を掛けます。

ΔWd × k 個=Bd × r 個×Ar × k 個
大きな更新 ΔW(d×k)を、細長い 2 つの行列 B(d×r)と A(r×k)の積で置き換える。保存する数は dk 個から r(d+k) 個になる。

LoRA のねらいは、保存して学習する数を減らすことです。左の大きな更新を、右の細い 2 つの行列に分けて持ちます。ここで rr が小さいほど、右の 2 つの行列の成分の数は少なくなります。

この節では行列を列ベクトルに左から掛ける向き(h=Wx\boldsymbol{h} = W \boldsymbol{x}、x∈Rk\boldsymbol{x} \in \mathbb{R}^k)で書きます。定数 α/r\alpha / r は BB に吸収できるので、以下では省きます。まず、積の階数についての補題を用意します。階数は像の次元(定義 8.1[行列と連立一次方程式])です。

補題 8.3(積の階数)✓

B∈Rd×rB \in \mathbb{R}^{d \times r}、A∈Rr×kA \in \mathbb{R}^{r \times k} に対して rank⁡(BA)≤min⁡(rank⁡B,rank⁡A)\operatorname{rank}(BA) \le \min(\operatorname{rank} B, \operatorname{rank} A) です。とくに rank⁡(BA)≤r\operatorname{rank}(BA) \le r です。

証明(補題 8.3)

任意の x∈Rk\boldsymbol{x} \in \mathbb{R}^k について BAx=B(Ax)∈Im⁡BBA\boldsymbol{x} = B(A\boldsymbol{x}) \in \operatorname{Im} B なので Im⁡(BA)⊂Im⁡B\operatorname{Im}(BA) \subset \operatorname{Im} B です。部分空間の次元は全体の次元以下(命題 5.7[ベクトル空間と線形変換] の 3)なので rank⁡(BA)≤rank⁡B\operatorname{rank}(BA) \le \operatorname{rank} B です。

次に、転置を取ると (BA)T=ATBT(BA)^{\mathsf{T}} = A^{\mathsf{T}} B^{\mathsf{T}} で、いま示したことから rank⁡(ATBT)≤rank⁡AT\operatorname{rank}(A^{\mathsf{T}} B^{\mathsf{T}}) \le \operatorname{rank} A^{\mathsf{T}} です。行階数と列階数は等しい(系 3.6[双対空間と商空間])ので rank⁡(BA)=rank⁡((BA)T)≤rank⁡AT=rank⁡A\operatorname{rank}(BA) = \operatorname{rank}((BA)^{\mathsf{T}}) \le \operatorname{rank} A^{\mathsf{T}} = \operatorname{rank} A です。

最後に、Im⁡B\operatorname{Im} B は BB の rr 本の列で張られるので次元は rr 以下で、rank⁡B≤r\operatorname{rank} B \le r です。

定理 8.4(LoRA のパラメータ数と、表せる更新の全体)✓

d,k≥1d, k \ge 1、1≤r≤min⁡(d,k)1 \le r \le \min(d, k) とし、ΔW=BA\Delta W = BA(B∈Rd×rB \in \mathbb{R}^{d \times r}、A∈Rr×kA \in \mathbb{R}^{r \times k})とします。

  1. 学習するパラメータの数は r(d+k)r(d + k) です。これが全体の微調整の dkdk より小さいことは、r<dkd+kr < \dfrac{dk}{d + k} と同値です。
  2. rank⁡ΔW≤r\operatorname{rank} \Delta W \le r です。
  3. 逆に、rank⁡M≤r\operatorname{rank} M \le r である任意の M∈Rd×kM \in \mathbb{R}^{d \times k} は、ある B∈Rd×rB \in \mathbb{R}^{d \times r}、A∈Rr×kA \in \mathbb{R}^{r \times k} によって M=BAM = BA と書けます。したがって
{ BA:B∈Rd×r, A∈Rr×k }={ M∈Rd×k:rank⁡M≤r }\{\, BA : B \in \mathbb{R}^{d \times r},\ A \in \mathbb{R}^{r \times k} \,\} = \{\, M \in \mathbb{R}^{d \times k} : \operatorname{rank} M \le r \,\}

です。 4. B=OB = O で初期化すると、AA が何であっても学習開始時に ΔW=O\Delta W = O で、モデルの出力は事前学習済みのモデルと一致します。 5. 学習後に W=W0+BAW = W_0 + BA を 1 つの d×kd \times k 行列として計算しておけば、推論時の x↦Wx\boldsymbol{x} \mapsto W\boldsymbol{x} の乗算回数は dkdk で、元のモデルと同じです。まとめずに W0x+B(Ax)W_0 \boldsymbol{x} + B(A\boldsymbol{x}) と計算すると dk+r(d+k)dk + r(d + k) 回です。

証明(定理 8.4)

1. BB の成分が drdr 個、AA の成分が rkrk 個で、合わせて r(d+k)r(d + k) 個です。d+k>0d + k > 0 なので、r(d+k)<dkr(d + k) < dk の両辺を d+kd + k で割れば r<dk/(d+k)r < dk/(d + k) です。

2. 補題 8.3 です。

3. s=rank⁡M≤rs = \operatorname{rank} M \le r とします。s=0s = 0 なら M=OM = O で、B=OB = O、A=OA = O とすればよいので、s≥1s \ge 1 とします。Im⁡M\operatorname{Im} M は ss 次元の部分空間なので、基底 b1,…,bs∈Rd\boldsymbol{b}_1, \ldots, \boldsymbol{b}_s \in \mathbb{R}^d が取れます。MM の第 jj 列 mj=Mej\boldsymbol{m}_j = M\boldsymbol{e}_j は Im⁡M\operatorname{Im} M の元なので、係数 aija_{ij} によって

mj=∑i=1saijbi(j=1,…,k)\boldsymbol{m}_j = \sum_{i=1}^{s} a_{ij} \boldsymbol{b}_i \qquad (j = 1, \ldots, k)

と書けます。BB を、初めの ss 列が b1,…,bs\boldsymbol{b}_1, \ldots, \boldsymbol{b}_s で残りの r−sr - s 列が 0\boldsymbol{0} である d×rd \times r 行列、AA を、(i,j)(i, j) 成分が i≤si \le s のとき aija_{ij}、i>si > s のとき 00 である r×kr \times k 行列とします。積 BABA の第 jj 列は、行列の積の定義から「BB の列を AA の第 jj 列の成分で 1 次結合したもの」で、∑i=1saijbi+∑i>s0⋅0=mj\sum_{i=1}^{s} a_{ij} \boldsymbol{b}_i + \sum_{i > s} 0 \cdot \boldsymbol{0} = \boldsymbol{m}_j です。すべての列が一致するので BA=MBA = M です。集合の等式は、2 が左辺 ⊂\subset 右辺を、いま示したことが右辺 ⊂\subset 左辺を与えます。

4. B=OB = O なら BA=OBA = O です。したがって W=W0W = W_0 で、この行列を使う層の出力、ひいてはモデルの出力は変わりません。

5. d×kd \times k 行列とベクトルの積は、出力の各成分に kk 回の乗算を使うので dkdk 回です。W0+BAW_0 + BA も d×kd \times k 行列なので同じです。まとめない場合は、W0xW_0\boldsymbol{x} に dkdk 回、AxA\boldsymbol{x} に rkrk 回、B(Ax)B(A\boldsymbol{x}) に drdr 回で、合計 dk+r(d+k)dk + r(d + k) 回です。

3 が、この定理の中心です。LoRA は「階数 rr 以下の更新」を過不足なく表します。BABA という積の形に書くこと自体は、階数 rr 以下という条件のほかに何の制約も加えていません。一方で、BB と AA の取り方は一意ではありません(正則な rr 次行列 GG について (BG)(G−1A)=BA(BG)(G^{-1}A) = BA)。パラメータ数 r(d+k)r(d + k) は、階数 rr 以下の行列を指定するのに必要な数より多めに数えています。

例 8.5(パラメータ数の比較)

d=k=1000d = k = 1000、r=8r = 8 とします。全体の微調整では dk=1,000,000dk = 1{,}000{,}000 個、LoRA では r(d+k)=8×2000=16,000r(d + k) = 8 \times 2000 = 16{,}000 個で、1.6%1.6\% です。LoRA のほうが少なくなる条件は r<dk/(d+k)=500r < dk / (d + k) = 500 です。r=500r = 500 でちょうど同数、r=1000r = 1000(制約なしと同じ表現力)では 2,000,0002{,}000{,}000 個と、かえって 22 倍になります。

d=k=768d = k = 768、r=4r = 4 なら 589,824589{,}824 個に対して 6,1446{,}144 個(約 1.04%1.04\%)です。

注意 8.6

全体の微調整で得られた更新 ΔW⋆\Delta W^{\star} が与えられたとき、それを階数 rr 以下の行列で近似する誤差の最小値は、ΔW⋆\Delta W^{\star} の特異値 σ1≥σ2≥⋯\sigma_1 \ge \sigma_2 \ge \cdots で決まります。フロベニウスノルムでは min⁡rank⁡M≤r∥ΔW⋆−M∥F=∑i>rσi2\min_{\operatorname{rank} M \le r} \|\Delta W^{\star} - M\|_F = \sqrt{\sum_{i > r} \sigma_i^2} で、特異値分解(定理 4.1[行列の分解と標準形])を上から rr 項で打ち切ったものが最小を与えます(定理 3.7[数学を学び直す意義]。作用素ノルムでは 命題 4.3[行列の分解と標準形])。定理 8.4 の 3 と合わせると、これは「LoRA で表せる更新のうち ΔW⋆\Delta W^{\star} に最も近いもの」の誤差です。ただし LoRA は ΔW⋆\Delta W^{\star} を近似するように学習するのではなく、BABA の形のまま損失を直接下げるので、学習で得られる BABA がこの最良近似になるとは限りません。

次のコードは、3 の分解を特異値分解で実行し、パラメータ数と近似誤差を数えます。

# Python 3.12.14, NumPy 2.5.2
import numpy as np
rng = np.random.default_rng(20261010)
def factor(M, r):
"""階数 r 以下の行列 M を B (d x r) と A (r x k) の積に分解する(特異値分解を使う)。"""
U, s, Vt = np.linalg.svd(M, full_matrices=False)
return U[:, :r] * s[:r], Vt[:r]
d, k, r = 60, 40, 4
M = rng.normal(size=(d, r)) @ rng.normal(size=(r, k)) # 階数 4 の 60 x 40 行列
B, A = factor(M, r)
print("rank M =", np.linalg.matrix_rank(M), " shapes:", B.shape, A.shape)
print(f"max |M - BA| = {np.abs(M - B @ A).max():.2e}")
print("parameters: full =", d * k, " LoRA =", r * (d + k))
# 階数が大きい行列を階数 r で近似したときの誤差は、切り捨てた特異値で決まる
W = rng.normal(size=(d, k)); s = np.linalg.svd(W, compute_uv=False)
for rr in (1, 4, 16, 40):
Br, Ar = factor(W, rr)
err = np.linalg.norm(W - Br @ Ar); pred = np.sqrt((s[rr:] ** 2).sum())
print(f"r={rr:2d} params={rr*(d+k):5d} error={err:8.4f} sqrt(sum of dropped sigma^2)={pred:8.4f}")
for (dd, kk, rr) in [(1000, 1000, 8), (768, 768, 4), (4096, 4096, 16)]:
print(f"d={dd} k={kk} r={rr}: full={dd*kk:,} LoRA={rr*(dd+kk):,} ratio={rr*(dd+kk)/(dd*kk):.4%} threshold dk/(d+k)={dd*kk/(dd+kk):.1f}")
rank M = 4 shapes: (60, 4) (4, 40)
max |M - BA| = 8.22e-15
parameters: full = 2400 LoRA = 400
r= 1 params= 100 error= 46.6109 sqrt(sum of dropped sigma^2)= 46.6109
r= 4 params= 400 error= 41.6740 sqrt(sum of dropped sigma^2)= 41.6740
r=16 params= 1600 error= 24.2220 sqrt(sum of dropped sigma^2)= 24.2220
r=40 params= 4000 error= 0.0000 sqrt(sum of dropped sigma^2)= 0.0000
d=1000 k=1000 r=8: full=1,000,000 LoRA=16,000 ratio=1.6000% threshold dk/(d+k)=500.0
d=768 k=768 r=4: full=589,824 LoRA=6,144 ratio=1.0417% threshold dk/(d+k)=384.0
d=4096 k=4096 r=16: full=16,777,216 LoRA=131,072 ratio=0.7812% threshold dk/(d+k)=2048.0

階数 44 の行列は、丸め誤差の範囲で BABA に戻っています。成分が独立な乱数の行列 WW(階数 4040)では、r=16r = 16 まで上げても誤差は半分程度にしか減りません。乱数の行列は特異値がなだらかにしか減らないからです。低階数の近似が効くかどうかは、近似される行列の特異値の減り方で決まります。

注意 8.7

微調整での重みの更新が実際に低階数で足りるかどうかは、定理 8.4 からは分かりません。これは経験的な事柄です。Hu らは、事前学習済みの言語モデルを下流の課題に適応させるときの重みの変化は「内在的な階数」が低いという仮説を立て、注意の射影行列に小さな rr の LoRA を入れて全体の微調整と比べる実験と、学習された ΔW\Delta W の部分空間を調べる分析を報告しています。どの行列に入れるか、rr をいくつにするかは課題とモデルに依り、この章の命題が決めるものではありません。

9. 指示チューニングと人間のフィードバックによる強化学習(概観)

Section titled “9. 指示チューニングと人間のフィードバックによる強化学習(概観)”

次トークン予測で事前学習したモデルは、文章の続きを書くモデルです。質問に答える、指示に従うといった振る舞いは、続けて行う学習で形づくられます。この節は、何を目的関数にして何を更新するのかの概観で、定理は立てません。

事前学習次トークン予測指示チューニング次トークン予測報酬モデルの学習順位づけの損失強化学習報酬の期待値データ: 大量の文章データ: 指示と望ましい応答の組データ: 複数の応答への人の順位づけデータ: モデル自身の出力と報酬モデルの値更新: 言語モデル更新: 言語モデル更新: 報酬モデル更新: 言語モデル
事前学習のあとに続く学習の 3 段階。どの段階も、同じ形のモデルの重みを勾配で更新する。違うのは目的関数とデータである。
  • 指示チューニングは、「指示と、それに対する望ましい応答」の組を集め、応答の部分に対する次トークン予測の損失(定義 3.4)で微調整することです。目的関数は事前学習と同じ形で、データだけが違います。命題 3.5 はそのまま当てはまり、これは「人が書いた応答の尤度の最大化」です。
  • 人間のフィードバックによる強化学習(RLHF)は、手本を真似るのではなく、人の好みを直接の目的にします。Christiano らは、人が 2 つの振る舞いのどちらが良いかを比べた結果から報酬の関数を学習し、その報酬で方策を強化学習する方法を示しました。Ouyang らはこれを言語モデルに適用し、(1) 手本による教師あり微調整、(2) 複数の出力への人の順位づけから報酬モデルを学習、(3) その報酬モデルの値を報酬として言語モデルを強化学習で更新、という 3 段階を報告しています。
  • (3) の目的関数は「モデルが生成した応答に対する報酬の期待値」で、次トークン予測の損失とは別の量です。生成は標本抽出を含むので(推論)、その勾配は逆伝播だけでは求まらず、方策勾配法(報酬の期待値が上がる向きに、生成の確率を動かす強化学習の方法)が使われます。

ここで押さえておくことは 2 つです。1 つは、どの段階もモデルの形を変えず、重みだけを変えることです。もう 1 つは、(2) の報酬モデルは人の判断の近似にすぎず、(3) はその近似を最大化するということです。報酬モデルが人の判断とずれているところでは、言語モデルはそのずれのほうに最適化されることがあります。特定のモデルがどのデータでどう学習されたかは、公開されている範囲が限られるので、ここでは扱いません。

演習 10.1易

∣V∣=8|V| = 8 とします。モデル A は長さ 44 の列の各位置の正解に確率 (1/2,1/2,1/2,1/2)(1/2, 1/2, 1/2, 1/2) を、モデル B は (1,1,1,1/64)(1, 1, 1, 1/64) を割り当てました。それぞれのパープレキシティを求め、どちらが小さいか答えてください。また、モデル B の 4 番目の確率が 00 に近づくとパープレキシティがどうなるかを述べてください。

解答

モデル A: −log⁡2qt-\log_2 q_t はどれも 11 で、平均は 11 ビット、PPL=21=2\mathrm{PPL} = 2^1 = 2 です。

モデル B: −log⁡2qt-\log_2 q_t は 0,0,0,60, 0, 0, 6 で、平均は 6/4=1.56/4 = 1.5 ビット、PPL=21.5=22≈2.83\mathrm{PPL} = 2^{1.5} = 2\sqrt{2} \approx 2.83 です。

モデル A のほうが小さくなります。B は 4 つのうち 3 つを確信を持って当てていますが、1 か所で正解に 1/641/64(一様分布の 1/81/8 より小さい値)しか与えず、その 1 か所が平均を押し上げています。4 番目の確率を qq とすると PPL=q−1/4\mathrm{PPL} = q^{-1/4} で、q→0q \to 0 のとき限りなく大きくなります。パープレキシティは幾何平均なので、1 か所でも正解に 00 に近い確率を付けると、ほかの位置がどれだけ良くても救われません。

演習 10.2標準

語彙 V={a,b}V = \{\mathrm{a}, \mathrm{b}\} とし、モデルは直前の 1 トークンだけを見る(p(⋅∣x<t)p(\cdot \mid x_{<t}) が xt−1x_{t-1} だけで決まる)とします。コーパスは 1 本の列 a b a a b a b b\mathrm{a\,b\,a\,a\,b\,a\,b\,b} で、2 番目以降の 77 個の位置を予測の対象にします。条件付き確率を自由に選べるとき、損失 L\mathcal{L} を最小にする p(⋅∣a)p(\cdot \mid \mathrm{a})、p(⋅∣b)p(\cdot \mid \mathrm{b}) と、そのときの損失・パープレキシティを求めてください。

解答

直前のトークンと次のトークンの組を数えます。列の隣り合う組は ab, ba, aa, ab, ba, ab, bb の 77 個です。直前が a のものは ab, aa, ab, ab の 44 個で、次が a が 11 回、b が 33 回です。直前が b のものは ba, ba, bb の 33 個で、次が a が 22 回、b が 11 回です。

命題 3.5 の 2 から L=47H(p^(⋅∣a),p(⋅∣a))+37H(p^(⋅∣b),p(⋅∣b))\mathcal{L} = \frac{4}{7} H(\hat{p}(\cdot \mid \mathrm{a}), p(\cdot \mid \mathrm{a})) + \frac{3}{7} H(\hat{p}(\cdot \mid \mathrm{b}), p(\cdot \mid \mathrm{b})) で、p^(⋅∣a)=(1/4,3/4)\hat{p}(\cdot \mid \mathrm{a}) = (1/4, 3/4)、p^(⋅∣b)=(2/3,1/3)\hat{p}(\cdot \mid \mathrm{b}) = (2/3, 1/3) です。2 つの項は別々の変数に依るので、それぞれを最小にすればよく、ギブスの不等式(命題 5.2[数学を学び直す意義])により最小は p(⋅∣c)=p^(⋅∣c)p(\cdot \mid c) = \hat{p}(\cdot \mid c) のときです。

そのときの損失は経験分布のエントロピーの重みつき平均で、

H(1/4,3/4)=14log⁡4+34log⁡43≈0.5623,H(2/3,1/3)=23log⁡32+13log⁡3≈0.6365H(1/4, 3/4) = \tfrac{1}{4}\log 4 + \tfrac{3}{4}\log\tfrac{4}{3} \approx 0.5623, \qquad H(2/3, 1/3) = \tfrac{2}{3}\log\tfrac{3}{2} + \tfrac{1}{3}\log 3 \approx 0.6365

から L=47×0.5623+37×0.6365≈0.5941\mathcal{L} = \frac{4}{7} \times 0.5623 + \frac{3}{7} \times 0.6365 \approx 0.5941、PPL=e0.5941≈1.811\mathrm{PPL} = e^{0.5941} \approx 1.811 です。一様分布のモデルの 22 よりわずかに小さいだけで、この列は直前の 1 トークンからはあまり予測できないことが分かります。

演習 10.3標準

β1=0.9\beta_1 = 0.9 とし、勾配が gt=(−1)tg_t = (-1)^{t} と毎回符号を変えるとします。mtm_t の閉じた形を求め、t→∞t \to \infty で ∣mt∣|m_t| がどの値に近づくかを答えてください。vtv_t のバイアス補正後の値 v^t\hat{v}_t も求め、∣m^t∣/v^t|\hat{m}_t| / \sqrt{\hat{v}_t} の極限を、勾配が一定の場合の値 11 と比べてください。

解答

命題 5.2 の 1 から

mt=(1−β1)∑i=1tβ1t−i(−1)i=(1−β1)(−1)t∑j=0t−1(−β1)j=(1−β1)(−1)t 1−(−β1)t1+β1m_t = (1 - \beta_1) \sum_{i=1}^{t} \beta_1^{t-i} (-1)^i = (1 - \beta_1)(-1)^t \sum_{j=0}^{t-1} (-\beta_1)^{j} = (1 - \beta_1)(-1)^t\, \frac{1 - (-\beta_1)^t}{1 + \beta_1}

です(j=t−ij = t - i と置き、(−1)i=(−1)t(−1)−j=(−1)t(−1)j(-1)^{i} = (-1)^t (-1)^{-j} = (-1)^t (-1)^j を使いました。公比 −β1-\beta_1 の有限等比級数の和は、(1+β1)∑j=0t−1(−β1)j=1−(−β1)t(1 + \beta_1)\sum_{j=0}^{t-1}(-\beta_1)^j = 1 - (-\beta_1)^t を展開して確かめられます)。t→∞t \to \infty で ∣mt∣→(1−β1)/(1+β1)=0.1/1.9≈0.0526|m_t| \to (1 - \beta_1)/(1 + \beta_1) = 0.1 / 1.9 \approx 0.0526 です。

gt2=1g_t^2 = 1 は一定なので vt=1−β2tv_t = 1 - \beta_2^t、v^t=1\hat{v}_t = 1 です。m^t=mt/(1−β1t)\hat{m}_t = m_t / (1 - \beta_1^t) で 1−β1t→11 - \beta_1^t \to 1 なので、∣m^t∣/v^t→0.0526|\hat{m}_t| / \sqrt{\hat{v}_t} \to 0.0526 です。

勾配が一定なら比は 11 でしたから、符号が毎回入れ替わる成分の歩幅は約 1/191/19 になります。Adam は、向きの定まらない成分の動きを自動的に小さくします。

演習 10.4標準

M=(246123)M = \begin{pmatrix} 2 & 4 & 6 \\ 1 & 2 & 3 \end{pmatrix} を、r=1r = 1 の LoRA の形 M=BAM = BA(B∈R2×1B \in \mathbb{R}^{2 \times 1}、A∈R1×3A \in \mathbb{R}^{1 \times 3})に書いてください。また M′=(100010)M' = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \end{pmatrix} は r=1r = 1 では書けないことを示してください。

解答

MM の第 2 列は第 1 列の 22 倍、第 3 列は 33 倍なので、Im⁡M\operatorname{Im} M は b=(2,1)T\boldsymbol{b} = (2, 1)^{\mathsf{T}} で張られる 1 次元の空間です。定理 8.4 の 3 の証明のとおり、B=(21)B = \begin{pmatrix} 2 \\ 1 \end{pmatrix}、A=(123)A = \begin{pmatrix} 1 & 2 & 3 \end{pmatrix} とすれば BA=MBA = M です。パラメータは 1×(2+3)=51 \times (2 + 3) = 5 個で、MM の成分の数 66 より少なくなっています。

M′M' の第 1 列 (1,0)T(1, 0)^{\mathsf{T}} と第 2 列 (0,1)T(0, 1)^{\mathsf{T}} は線形独立なので rank⁡M′=2\operatorname{rank} M' = 2 です。r=1r = 1 の BABA は 補題 8.3 により階数が 11 以下なので、M′=BAM' = BA とは書けません。

  • Y. Bengio, R. Ducharme, P. Vincent, C. Jauvin, “A Neural Probabilistic Language Model”, Journal of Machine Learning Research 3 (2003), 1137–1155. jmlr.org/papers/v3/bengio03a.html
  • A. Vaswani, N. Shazeer, N. Parmar, J. Uszkoreit, L. Jones, A. N. Gomez, Ł. Kaiser, I. Polosukhin, “Attention Is All You Need” (2017), arXiv:1706.03762 — §5.3(Adam の設定と学習率の式)。
  • D. P. Kingma, J. Ba, “Adam: A Method for Stochastic Optimization”, ICLR 2015, arXiv:1412.6980 — アルゴリズム 1、§2.1(更新量の大きさ)、§3(バイアス補正)。
  • I. Loshchilov, F. Hutter, “Decoupled Weight Decay Regularization”, ICLR 2019, arXiv:1711.05101 — 命題 1・2、アルゴリズム 2(AdamW)。
  • R. Pascanu, T. Mikolov, Y. Bengio, “On the difficulty of training Recurrent Neural Networks” (2012), arXiv:1211.5063 — ノルムによる勾配クリッピング。
  • E. J. Hu, Y. Shen, P. Wallis, Z. Allen-Zhu, Y. Li, S. Wang, L. Wang, W. Chen, “LoRA: Low-Rank Adaptation of Large Language Models” (2021), arXiv:2106.09685
  • L. Ouyang ほか, “Training language models to follow instructions with human feedback” (2022), arXiv:2203.02155
  • P. Christiano, J. Leike, T. B. Brown, M. Martic, S. Legg, D. Amodei, “Deep reinforcement learning from human preferences” (2017), arXiv:1706.03741

このテーマの 100 本ノック(50 問)

執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 2 回(Claude Code)・最終 2026-10-12

この記事の誤りを報告する ・運営: 夢現技研合同会社 ・料金 ・利用条件 ・特定商取引法に基づく表記

© 2026 夢現技研合同会社 ・コード例は MIT ライセンスです。