正讲为了节奏,把一些推导压成了「结论 + 直觉」。这一页把那些推导补全到可以独立跟读 的程度,并补上几处工程实现的关键细节。只在你需要「更严格」或「更工程」时读它。
本页收录与否的判据
收录标准是「正文给了结论但没给完推导,且这个推导值得自己写一遍 」。过于冗长的证明(如通用逼近定理的测度论证明)不在其列,只给出处。
设第 l l l 层:Z ( l ) = A ( l − 1 ) W ( l ) + 1 b ( l ) T \boldsymbol Z^{(l)}=\boldsymbol A^{(l-1)}W^{(l)}+\mathbf 1\boldsymbol b^{(l)\mathrm T} Z ( l ) = A ( l − 1 ) W ( l ) + 1 b ( l ) T ,A ( l ) = ϕ ( Z ( l ) ) \boldsymbol A^{(l)}=\phi(\boldsymbol Z^{(l)}) A ( l ) = ϕ ( Z ( l ) ) ,A ( 0 ) = X ∈ R B × d 0 \boldsymbol A^{(0)}=\boldsymbol X\in\mathbb R^{B\times d_0} A ( 0 ) = X ∈ R B × d 0 。定义误差信号矩阵
Δ ( l ) ≜ ∂ L ∂ Z ( l ) ∈ R B × d l . \Delta^{(l)}\triangleq\frac{\partial\mathcal L}{\partial\boldsymbol Z^{(l)}}\in\mathbb R^{B\times d_l}. Δ ( l ) ≜ ∂ Z ( l ) ∂ L ∈ R B × d l .
① 输出层 。设 L \mathcal L L 对输出激活的梯度已知(记为 G ( L ) = ∂ L / ∂ A ( L ) G^{(L)}=\partial\mathcal L/\partial\boldsymbol A^{(L)} G ( L ) = ∂ L / ∂ A ( L ) ,与 A ( L ) \boldsymbol A^{(L)} A ( L ) 同形)。因 A ( L ) \boldsymbol A^{(L)} A ( L ) 是 Z ( L ) \boldsymbol Z^{(L)} Z ( L ) 的逐元素函数:
Δ ( L ) = G ( L ) ⊙ ϕ ′ ( Z ( L ) ) . \Delta^{(L)}=G^{(L)}\odot\phi'\bigl(\boldsymbol Z^{(L)}\bigr). Δ ( L ) = G ( L ) ⊙ ϕ ′ ( Z ( L ) ) .
② 逐层回传 。由 Z ( l + 1 ) = A ( l ) W ( l + 1 ) + ⋯ \boldsymbol Z^{(l+1)}=\boldsymbol A^{(l)}W^{(l+1)}+\cdots Z ( l + 1 ) = A ( l ) W ( l + 1 ) + ⋯ 得 ∂ L ∂ A ( l ) = Δ ( l + 1 ) W ( l + 1 ) T \dfrac{\partial\mathcal L}{\partial\boldsymbol A^{(l)}}=\Delta^{(l+1)}W^{(l+1)\mathrm T} ∂ A ( l ) ∂ L = Δ ( l + 1 ) W ( l + 1 ) T ,再穿一次逐元素激活:
Δ ( l ) = ( Δ ( l + 1 ) W ( l + 1 ) T ) ⊙ ϕ ′ ( Z ( l ) ) l = L − 1 , … , 1. \boxed{\ \Delta^{(l)}=\bigl(\Delta^{(l+1)}W^{(l+1)\mathrm T}\bigr)\odot\phi'\bigl(\boldsymbol Z^{(l)}\bigr)\ }\qquad l=L-1,\dots,1 . Δ ( l ) = ( Δ ( l + 1 ) W ( l + 1 ) T ) ⊙ ϕ ′ ( Z ( l ) ) l = L − 1 , … , 1.
③ 参数梯度 。由 ∂ Z b j ( l ) / ∂ W i k ( l ) = 1 [ b 行 ] ⋅ A b i ( l − 1 ) ⋅ 1 [ j = k ] \partial\boldsymbol Z^{(l)}_{bj}/\partial W^{(l)}_{ik}=\mathbf 1[b\ \text{行}]\cdot A^{(l-1)}_{bi}\cdot\mathbf 1[j=k] ∂ Z bj ( l ) / ∂ W ik ( l ) = 1 [ b 行 ] ⋅ A bi ( l − 1 ) ⋅ 1 [ j = k ] ,写成矩阵形式即
∂ L ∂ W ( l ) = A ( l − 1 ) T Δ ( l ) ∈ R d l − 1 × d l , ∂ L ∂ b ( l ) = Δ ( l ) T 1 = ∑ b = 1 B Δ b , : ( l ) ∈ R d l . \frac{\partial\mathcal L}{\partial W^{(l)}}=\boldsymbol A^{(l-1)\mathrm T}\Delta^{(l)}\in\mathbb R^{d_{l-1}\times d_l},\qquad \frac{\partial\mathcal L}{\partial\boldsymbol b^{(l)}}=\Delta^{(l)\mathrm T}\mathbf 1=\sum_{b=1}^{B}\Delta^{(l)}_{b,:}\in\mathbb R^{d_l}. ∂ W ( l ) ∂ L = A ( l − 1 ) T Δ ( l ) ∈ R d l − 1 × d l , ∂ b ( l ) ∂ L = Δ ( l ) T 1 = b = 1 ∑ B Δ b , : ( l ) ∈ R d l .
④ 为什么是「线性时间」 。前向一次、反向一次,每次每层只需两次矩阵乘(O ( B d l − 1 d l ) O(Bd_{l-1}d_l) O ( B d l − 1 d l ) )——总代价是参数量的常数倍。若改用逐参数数值微分,需要「参数量次前向」,在 1 0 9 10^9 1 0 9 参数规模下完全不可行。
工程要点 :反传的中间量 Δ ( l ) \Delta^{(l)} Δ ( l ) 通常不显式保存 ,而是与反向计算交错产生(这就是 PyTorch 的 autograd 引擎做的事)。真正占显存的是前向激活 A ( l ) \boldsymbol A^{(l)} A ( l ) —— 这也是激活重计算 的用武之地(9.5 )。
数值梯度用中心差分:∂ f ∂ θ i ≈ f ( θ i + h ) − f ( θ i − h ) 2 h \dfrac{\partial f}{\partial\theta_i}\approx\dfrac{f(\theta_i+h)-f(\theta_i-h)}{2h} ∂ θ i ∂ f ≈ 2 h f ( θ i + h ) − f ( θ i − h ) ,误差 O ( h 2 ) O(h^2) O ( h 2 ) 。
在 float64 下 h = 1 0 − 6 h=10^{-6} h = 1 0 − 6 量级最稳(h h h 太小被舍入误差淹没,太大截断误差显著)。判据:相对误差 ∣ g num − g auto ∣ max ( 1 , ∣ g num ∣ , ∣ g auto ∣ ) < 1 0 − 5 \dfrac{|g_{\text{num}}-g_{\text{auto}}|}{\max(1,|g_{\text{num}}|,|g_{\text{auto}}|)}<10^{-5} max ( 1 , ∣ g num ∣ , ∣ g auto ∣ ) ∣ g num − g auto ∣ < 1 0 − 5 。
注意 :梯度检查必须在 float64 + 关闭 dropout/BN 的训练模式 下做;否则差异来自随机性或精度,而不是实现错误。
设 q , k ∈ R d k q,k\in\mathbb R^{d_k} q , k ∈ R d k 各分量独立、均值 0、方差 1。则点积 s = q ⋅ k = ∑ i = 1 d k q i k i s=\boldsymbol q\cdot\boldsymbol k=\sum_{i=1}^{d_k}q_ik_i s = q ⋅ k = ∑ i = 1 d k q i k i 满足
E [ s ] = 0 , V a r ( s ) = ∑ i E [ q i 2 ] E [ k i 2 ] = d k . \mathbb E[s]=0,\qquad \mathrm{Var}(s)=\sum_i \mathbb E[q_i^2]\mathbb E[k_i^2]=d_k . E [ s ] = 0 , Var ( s ) = i ∑ E [ q i 2 ] E [ k i 2 ] = d k .
于是 s s s 的标准差是 d k \sqrt{d_k} d k :维度越大,logits 分布越宽,softmax 越容易进入饱和区(少数分量接近 1,其余接近 0),其雅可比趋近于 0,梯度消失。除以 d k \sqrt{d_k} d k 后方差归一为 1,尺度与 d k d_k d k 解耦。
推广 :这也是「温度 」在注意力里的一种表现形式——除数是显式的逆温度。同理,模型输出层的 logits 若尺度异常,也会出现同类饱和问题。
自回归注意力的掩码把未来位置的对数权重置为 − ∞ -\infty − ∞ (实现里用 -1e9 或 finfo(dtype).min):
S ~ = Q K T d k + M , M i j = { 0 , j ≤ i − ∞ , j > i . \tilde S=\frac{QK^{\mathrm T}}{\sqrt{d_k}}+M,\qquad M_{ij}=\begin{cases}0,&j\le i\ -\infty,&j\gt i\end{cases}. S ~ = d k Q K T + M , M ij = { 0 , − ∞ , j ≤ i j > i .
实现要点 :① 必须用足够大的负数(不能直接用 -inf,否则与 NaN 相遇会污染整行);② 训练与推理掩码形状不同(推理时若用 KV cache,只需最后一行);③ FlashAttention 类的分块实现要在块内维护「行最大值 + 指数和」的在线更新(online softmax),否则分块后无法拼接。
推理时每步只需算一个新 token 的 q q q ,但需要历史上全部 k , v k,v k , v 。缓存大小:
bytes = 2 ( K,V ) × L × H k v × d h × T × B × sizeof(dtype) . \text{bytes}=2\ (\text{K,V})\times L\times H_{kv}\times d_h\times T\times B\times \text{sizeof(dtype)} . bytes = 2 ( K,V ) × L × H k v × d h × T × B × sizeof(dtype) .
以 12 层、d = 512 d=512 d = 512 、8 头(d h = 64 d_h=64 d h = 64 )、fp16、B = 8 B=8 B = 8 、T = 1024 T=1024 T = 1024 为例:2 × 12 × 8 × 64 × 1024 × 8 × 2 ≈ 201 MB 2\times12\times8\times64\times1024\times8\times2\approx201\ \text{MB} 2 × 12 × 8 × 64 × 1024 × 8 × 2 ≈ 201 MB ;把 T T T 换成 32768 则约 6.4 GB ——这就是长上下文推理的显存主因。GQA 把 H k v H_{kv} H k v 从 8 降到 2,直接降到 1/4。
为什么推理是 memory-bound :每步计算量只有 O ( L H k v d h ) O(LH_{kv}d_h) O ( L H k v d h ) 级别,却要读遍权重(2 N 2N 2 N 字节)与整个 KV cache;GPU 的算力用不满,瓶颈在显存带宽。
对任意 q ( z ∣ x ) q(z\mid x) q ( z ∣ x ) :
log p ( x ) = log E q [ p ( x , z ) q ( z ∣ x ) ] ≥ E q [ log p ( x , z ) q ( z ∣ x ) ] ( Jensen ) . \log p(x)=\log \mathbb E_{q}!\left[\frac{p(x,z)}{q(z\mid x)}\right]\ \ge\ \mathbb E_{q}!\left[\log\frac{p(x,z)}{q(z\mid x)}\right]\quad(\text{Jensen}) . log p ( x ) = log E q [ q ( z ∣ x ) p ( x , z ) ] ≥ E q [ log q ( z ∣ x ) p ( x , z ) ] ( Jensen ) .
展开右侧:
E q [ log p ( x ∣ z ) ] + E q [ log p ( z ) q ( z ∣ x ) ] = E q [ log p ( x ∣ z ) ] ⏟ 重建 − K L ( q ( z ∣ x ) ∥ p ( z ) ) ⏟ 正则 . \mathbb E_{q}!\left[\log p(x\mid z)\right]+\mathbb E_{q}!\left[\log\frac{p(z)}{q(z\mid x)}\right] =\underbrace{\mathbb E_{q}[\log p(x\mid z)]}_{\text{重建}}-\underbrace{\mathrm{KL}\bigl(q(z\mid x),|,p(z)\bigr)}_{\text{正则}} . E q [ log p ( x ∣ z ) ] + E q [ log q ( z ∣ x ) p ( z ) ] = 重建 E q [ log p ( x ∣ z )] − 正则 KL ( q ( z ∣ x ) ∥ p ( z ) ) .
间隙 :log p ( x ) − E L B O = K L ( q ( z ∣ x ) ∥ p ( z ∣ x ) ) ≥ 0 \log p(x)-\mathrm{ELBO}=\mathrm{KL}(q(z\mid x)|p(z\mid x))\ge0 log p ( x ) − ELBO = KL ( q ( z ∣ x ) ∥ p ( z ∣ x )) ≥ 0 ,因此后验越准(q q q 越接近真后验),下界越紧——这也解释了为什么要用更强的后验族(如 Normalizing Flow 后验)。
前向过程 q ( x t ∣ x t − 1 ) = N ( α t x t − 1 , ( 1 − α t ) I ) q(\boldsymbol x_t\mid\boldsymbol x_{t-1})=\mathcal N\bigl(\sqrt{\alpha_t}\boldsymbol x_{t-1},(1-\alpha_t)I\bigr) q ( x t ∣ x t − 1 ) = N ( α t x t − 1 , ( 1 − α t ) I ) ,累乘得闭式
q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) ⟹ x t = α ˉ t x 0 + 1 − α ˉ t ε . q(\boldsymbol x_t\mid\boldsymbol x_0)=\mathcal N\bigl(\sqrt{\bar\alpha_t}\boldsymbol x_0,(1-\bar\alpha_t)I\bigr) \ \Longrightarrow\ \boldsymbol x_t=\sqrt{\bar\alpha_t}\boldsymbol x_0+\sqrt{1-\bar\alpha_t}\boldsymbol\varepsilon . q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) ⟹ x t = α ˉ t x 0 + 1 − α ˉ t ε .
反向也近似为高斯:p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , σ t 2 I ) p_\theta(\boldsymbol x_{t-1}\mid\boldsymbol x_t)=\mathcal N\bigl(\boldsymbol\mu_\theta(\boldsymbol x_t,t),\sigma_t^2I\bigr) p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , σ t 2 I ) 。变分下界分解为
L VLB = ∑ t = 2 T E q [ K L ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) ] ⏟ 每步两个高斯的 KL + C . \mathcal L_{\text{VLB}}=\sum_{t=2}^{T}\underbrace{\mathbb E_q\bigl[\mathrm{KL}\bigl(q(\boldsymbol x_{t-1}\mid\boldsymbol x_t,\boldsymbol x_0),|,p_\theta(\boldsymbol x_{t-1}\mid\boldsymbol x_t)\bigr)\bigr]}_{\text{每步两个高斯的 KL}}+C . L VLB = t = 2 ∑ T 每步两个高斯的 KL E q [ KL ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) ] + C .
两个高斯之间的 KL 只依赖均值差:∝ ∥ μ ~ t − μ θ ∥ 2 \propto\lVert\tilde{\boldsymbol\mu}_t-\boldsymbol\mu_\theta\rVert^2 ∝ ∥ μ ~ t − μ θ ∥ 2 。而 μ ~ t \tilde{\boldsymbol\mu}_t μ ~ t 与 μ θ \boldsymbol\mu_\theta μ θ 都能写成「x t \boldsymbol x_t x t 与噪声的函数」,代入并忽略权重系数(DDPM 的关键简化)即得
L simple = E t , x 0 , ε [ ∥ ε − ε θ ( x t , t ) ∥ 2 ] . \mathcal L_{\text{simple}}=\mathbb E_{t,\boldsymbol x_0,\boldsymbol\varepsilon}\Bigl[\bigl\lVert\boldsymbol\varepsilon-\boldsymbol\varepsilon_\theta(\boldsymbol x_t,t)\bigr\rVert^2\Bigr] . L simple = E t , x 0 , ε [ ε − ε θ ( x t , t ) 2 ] .
直觉 :模型不直接回归 μ \boldsymbol\mu μ ,而是回归当时注入的噪声 ;等价地,它学会「给定含噪图与噪声水平,判断这一层的噪声长什么样」。
无条件与有条件模型的得分函数可以线性外推:
ε ~ = ε ∅ + s ( ε c − ε ∅ ) , s ≥ 1. \tilde{\boldsymbol\varepsilon}=\boldsymbol\varepsilon_\varnothing+s,(\boldsymbol\varepsilon_{\boldsymbol c}-\boldsymbol\varepsilon_\varnothing),\qquad s\ge1 . ε ~ = ε ∅ + s ( ε c − ε ∅ ) , s ≥ 1.
把它看成「沿条件方向放大」:s = 1 s=1 s = 1 是纯条件模型,s > 1 s\gt1 s > 1 加强条件作用(更贴提示但更易过饱和、多样性下降),s = 0 s=0 s = 0 退化为无条件。代价 :每次采样要跑两遍前向(除非训练时随机丢弃条件以支持单次前向近似)。
定义算子 ( T V ) ( s ) = max a [ r ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V ( s ′ ) ] (\mathcal TV)(s)=\max_a\bigl[r(s,a)+\gamma\sum_{s'}P(s'\mid s,a)V(s')\bigr] ( T V ) ( s ) = max a [ r ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V ( s ′ ) ] 。对任意 V , U V,U V , U :
∥ T V − T U ∥ ∞ ≤ γ ∥ V − U ∥ ∞ \lVert\mathcal TV-\mathcal TU\rVert_\infty\le\gamma\lVert V-U\rVert_\infty ∥ T V − T U ∥ ∞ ≤ γ ∥ V − U ∥ ∞
(因 ∣ max a f ( a ) − max a g ( a ) ∣ ≤ max a ∣ f ( a ) − g ( a ) ∣ |\max_a f(a)-\max_a g(a)|\le\max_a|f(a)-g(a)| ∣ max a f ( a ) − max a g ( a ) ∣ ≤ max a ∣ f ( a ) − g ( a ) ∣ )。故 T \mathcal T T 是压缩映射,由 Banach 不动点定理,存在唯一 不动点 V ⋆ V^\star V ⋆ ,且值迭代以 γ k \gamma^k γ k 的几何速率收敛。这条压缩性也是「折扣因子必须小于 1」的数学理由 。
目标 J ( θ ) = E τ ∼ π θ [ R ( τ ) ] J(\theta)=\mathbb E_{\tau\sim\pi_\theta}[R(\tau)] J ( θ ) = E τ ∼ π θ [ R ( τ )] ,其中轨迹概率 π θ ( τ ) = ρ ( s 0 ) ∏ t π θ ( a t ∣ s t ) P ( s t + 1 ∣ s t , a t ) \pi_\theta(\tau)=\rho(s_0)\prod_t\pi_\theta(a_t\mid s_t)P(s_{t+1}\mid s_t,a_t) π θ ( τ ) = ρ ( s 0 ) ∏ t π θ ( a t ∣ s t ) P ( s t + 1 ∣ s t , a t ) 。因为环境项与 θ \theta θ 无关 ,∇ θ log π θ ( τ ) = ∑ t ∇ θ log π θ ( a t ∣ s t ) \nabla_\theta\log\pi_\theta(\tau)=\sum_t\nabla_\theta\log\pi_\theta(a_t\mid s_t) ∇ θ log π θ ( τ ) = ∑ t ∇ θ log π θ ( a t ∣ s t ) ,于是
∇ θ J = E τ [ R ( τ ) ∑ t ∇ θ log π θ ( a t ∣ s t ) ] = E [ ∑ t ∇ θ log π θ ( a t ∣ s t ) G t ⏟ 回报-to-go ] . \nabla_\theta J=\mathbb E_{\tau}\Bigl[R(\tau)\sum_t\nabla_\theta\log\pi_\theta(a_t\mid s_t)\Bigr] =\mathbb E\Bigl[\sum_t\nabla_\theta\log\pi_\theta(a_t\mid s_t),\underbrace{G_t}_{\text{回报-to-go}}\Bigr]. ∇ θ J = E τ [ R ( τ ) t ∑ ∇ θ log π θ ( a t ∣ s t ) ] = E [ t ∑ ∇ θ log π θ ( a t ∣ s t ) 回报 -to-go G t ] .
第二行用到因果性 :t t t 之前动作的得分函数与 t t t 之后的回报无关,E [ R ( τ ) ∣ a t ] \mathbb E[R(\tau)\mid a_t] E [ R ( τ ) ∣ a t ] 可替换为 G t = ∑ k ≥ t γ k − t r k G_t=\sum_{k\ge t}\gamma^{k-t}r_k G t = ∑ k ≥ t γ k − t r k (只依赖 a t a_t a t 之后的部分),这正是方差缩减的第一刀。加上基线 b ( s ) b(s) b ( s ) 再做一刀(对 b b b 的期望贡献为 0):
∇ θ J = E [ ∑ t ∇ θ log π θ ( a t ∣ s t ) ( G t − b ( s t ) ) ] . \nabla_\theta J=\mathbb E\Bigl[\sum_t\nabla_\theta\log\pi_\theta(a_t\mid s_t),\bigl(G_t-b(s_t)\bigr)\Bigr] . ∇ θ J = E [ t ∑ ∇ θ log π θ ( a t ∣ s t ) ( G t − b ( s t ) ) ] .
严格性说明 :更完整的证明需要处理状态分布本身依赖 θ \theta θ 这一项。Sutton 等(Policy Gradient Methods for Reinforcement Learning with Function Approximation , 2000)给出了这部分抵消的标准论证;本教程正文采用按轨迹的直观版,结论一致。
TD 残差 δ t = r t + γ V ( s t + 1 ) − V ( s t ) \delta_t=r_t+\gamma V(s_{t+1})-V(s_t) δ t = r t + γV ( s t + 1 ) − V ( s t ) 是优势的「单步」无偏+高偏差估计。把 n n n 步回报展开:
A ^ t ( n ) = ∑ l = 0 n − 1 γ l δ t + l . \hat A_t^{(n)}=\sum_{l=0}^{n-1}\gamma^{l}\delta_{t+l} . A ^ t ( n ) = l = 0 ∑ n − 1 γ l δ t + l .
对所有 n n n 做指数加权(权重 ( 1 − λ ) λ n − 1 (1-\lambda)\lambda^{n-1} ( 1 − λ ) λ n − 1 ):
A ^ t GAE ( γ , λ ) = ∑ l ≥ 0 ( γ λ ) l δ t + l . \hat A_t^{\text{GAE}(\gamma,\lambda)}=\sum_{l\ge0}(\gamma\lambda)^l\delta_{t+l} . A ^ t GAE ( γ , λ ) = l ≥ 0 ∑ ( γλ ) l δ t + l .
λ = 0 \lambda=0 λ = 0 :单步 TD(偏差大、方差小);
λ = 1 \lambda=1 λ = 1 :蒙特卡洛(偏差小、方差大)。
这就是 PPO 里那个 λ \lambda λ 的全部含义 ——一个偏差-方差的旋钮,与折扣 γ \gamma γ 共同出现在 γ λ \gamma\lambda γλ 中。
定义概率比 ρ t = π θ ( a t ∣ s t ) / π θ old ( a t ∣ s t ) \rho_t=\pi_\theta(a_t\mid s_t)/\pi_{\theta_{\text{old}}}(a_t\mid s_t) ρ t = π θ ( a t ∣ s t ) / π θ old ( a t ∣ s t ) ,PPO 的目标
L clip = E [ min ( ρ t A t , c l i p ( ρ t , 1 − ϵ , 1 + ϵ ) A t ) ] . \mathcal L^{\text{clip}}=\mathbb E\bigl[\min\bigl(\rho_tA_t,\ \mathrm{clip}(\rho_t,1-\epsilon,1+\epsilon)A_t\bigr)\bigr] . L clip = E [ min ( ρ t A t , clip ( ρ t , 1 − ϵ , 1 + ϵ ) A t ) ] .
分两种情形看梯度 :
情形 未越界时 越界后 结果
A t > 0 A_t\gt0 A t > 0 (好动作)L = ρ t A t \mathcal L=\rho_tA_t L = ρ t A t ,鼓励增大 ρ \rho ρ 当 ρ > 1 + ϵ \rho\gt1+\epsilon ρ > 1 + ϵ ,min \min min 取 ( 1 + ϵ ) A t (1+\epsilon)A_t ( 1 + ϵ ) A t (常数) 梯度为 0 :不再鼓励继续增大概率
A t < 0 A_t\lt0 A t < 0 (坏动作)L = ρ t A t \mathcal L=\rho_tA_t L = ρ t A t ,鼓励减小 ρ \rho ρ 当 ρ < 1 − ϵ \rho\lt1-\epsilon ρ < 1 − ϵ ,min \min min 取 ( 1 − ϵ ) A t (1-\epsilon)A_t ( 1 − ϵ ) A t (常数) 梯度为 0 :不再鼓励继续减小概率
于是「超出信任域的更新」被截断 而不是被惩罚——这就是与 TRPO 的差别:TRPO 显式解一个带 KL 约束的优化问题(需二阶近似),PPO 用一个分段线性的替代目标达到类似效果,实现简单得多。
第一步:写出带 KL 约束的目标 (在偏好数据上最大化奖励、同时不偏离参考模型太远)
max π E x ∼ D , y ∼ π [ r ( x , y ) ] − β K L ( π ( ⋅ ∣ x ) ∥ π ref ( ⋅ ∣ x ) ) . \max_{\pi}\ \mathbb E_{x\sim\mathcal D,,y\sim\pi}\bigl[r(x,y)\bigr]-\beta,\mathrm{KL}\bigl(\pi(\cdot\mid x),|,\pi_{\text{ref}}(\cdot\mid x)\bigr) . π max E x ∼ D , y ∼ π [ r ( x , y ) ] − β KL ( π ( ⋅ ∣ x ) ∥ π ref ( ⋅ ∣ x ) ) .
第二步:求闭式最优解 (对每个 x x x ,这是一个带熵正则的线性规划/变分问题)
π ⋆ ( y ∣ x ) = 1 Z ( x ) π ref ( y ∣ x ) exp ( r ( x , y ) / β ) ⟹ r ( x , y ) = β log π ⋆ ( y ∣ x ) π ref ( y ∣ x ) + β log Z ( x ) . \pi^\star(y\mid x)=\frac{1}{Z(x)}\pi_{\text{ref}}(y\mid x)\exp!\bigl(r(x,y)/\beta\bigr) \ \Longrightarrow\ r(x,y)=\beta\log\frac{\pi^\star(y\mid x)}{\pi_{\text{ref}}(y\mid x)}+\beta\log Z(x) . π ⋆ ( y ∣ x ) = Z ( x ) 1 π ref ( y ∣ x ) exp ( r ( x , y ) / β ) ⟹ r ( x , y ) = β log π ref ( y ∣ x ) π ⋆ ( y ∣ x ) + β log Z ( x ) .
第三步:代入 Bradley–Terry 模型 P ( y w ≻ y l ∣ x ) = σ ( r ( x , y w ) − r ( x , y l ) ) P(y_w\succ y_l\mid x)=\sigma\bigl(r(x,y_w)-r(x,y_l)\bigr) P ( y w ≻ y l ∣ x ) = σ ( r ( x , y w ) − r ( x , y l ) ) 。因为 Z ( x ) Z(x) Z ( x ) 只依赖 x x x ,在差值中抵消:
P ( y w ≻ y l ∣ x ) = σ ( β log π θ ( y w ∣ x ) π ref ( y w ∣ x ) − β log π θ ( y l ∣ x ) π ref ( y l ∣ x ) ) . P(y_w\succ y_l\mid x)=\sigma!\left(\beta\log\frac{\pi_\theta(y_w\mid x)}{\pi_{\text{ref}}(y_w\mid x)}-\beta\log\frac{\pi_\theta(y_l\mid x)}{\pi_{\text{ref}}(y_l\mid x)}\right). P ( y w ≻ y l ∣ x ) = σ ( β log π ref ( y w ∣ x ) π θ ( y w ∣ x ) − β log π ref ( y l ∣ x ) π θ ( y l ∣ x ) ) .
第四步:取负对数似然 即得 DPO 损失:
L DPO = − E ( x , y w , y l ) [ log σ ( β log π θ ( y w ∣ x ) π ref ( y w ∣ x ) − β log π θ ( y l ∣ x ) π ref ( y l ∣ x ) ) ] . \mathcal L_{\text{DPO}}=-\mathbb E_{(x,y_w,y_l)}\left[\log\sigma!\left(\beta\log\frac{\pi_\theta(y_w\mid x)}{\pi_{\text{ref}}(y_w\mid x)}-\beta\log\frac{\pi_\theta(y_l\mid x)}{\pi_{\text{ref}}(y_l\mid x)}\right)\right] . L DPO = − E ( x , y w , y l ) [ log σ ( β log π ref ( y w ∣ x ) π θ ( y w ∣ x ) − β log π ref ( y l ∣ x ) π θ ( y l ∣ x ) ) ] .
值得注意的三点 :① 奖励被「隐式」参数化了(r ^ = β log ( π θ / π ref ) \hat r=\beta\log(\pi_\theta/\pi_{\text{ref}}) r ^ = β log ( π θ / π ref ) ),所以不需要奖励模型;② β \beta β 控制「允许偏离参考模型多远」——太大则几乎不学,太小则迅速过拟合偏好数据;③ DPO 的失败模式是偏好数据本身的偏差 直接进入模型(没有 RM 作为缓冲)。
格式 指数位 尾数位 动态范围 相对精度
fp32 8 23 ∼ 1 0 ± 38 \sim10^{\pm38} ∼ 1 0 ± 38 ∼ 1 0 − 7 \sim10^{-7} ∼ 1 0 − 7
fp16 5 10 ∼ ± 6.5 × 1 0 4 \sim\pm6.5\times10^{4} ∼ ± 6.5 × 1 0 4 ,最小正规数 ∼ 6 × 1 0 − 5 \sim6\times10^{-5} ∼ 6 × 1 0 − 5 ∼ 1 0 − 3 \sim10^{-3} ∼ 1 0 − 3
bf16 8 7 同 fp32 ∼ 1 0 − 2 \sim10^{-2} ∼ 1 0 − 2
fp16 的问题 :反向传播中大量梯度小于 6 × 1 0 − 5 6\times10^{-5} 6 × 1 0 − 5 ,会下溢为零 ,训练直接卡住。Loss scaling 的解法:把损失放大 2 k 2^{k} 2 k (如 k = 16 k=16 k = 16 )再反向,使梯度也放大同样倍数、落进可表示范围,更新前再缩回。Kahan/动态缩放会周期性检查是否溢出(出现 inf)并自动调整 k k k 。
bf16 的问题与优势 :范围与 fp32 相同(不需要 loss scaling),但尾数只有 7 位(精度约百分之一)——对梯度累加、softmax 归一化这类需要精细数值的操作,仍建议在 fp32 中完成(torch.autocast 会自动处理常见算子)。
设 m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t=\beta_1m_{t-1}+(1-\beta_1)g_t m t = β 1 m t − 1 + ( 1 − β 1 ) g t ,m 0 = 0 m_0=0 m 0 = 0 。展开:
m t = ( 1 − β 1 ) ∑ i = 0 t − 1 β 1 i g t − i . m_t=(1-\beta_1)\sum_{i=0}^{t-1}\beta_1^{,i}g_{t-i} . m t = ( 1 − β 1 ) i = 0 ∑ t − 1 β 1 i g t − i .
若梯度近似平稳(E [ g i ] ≈ g ˉ \mathbb E[g_i]\approx\bar g E [ g i ] ≈ g ˉ ),则 E [ m t ] = ( 1 − β 1 t ) g ˉ \mathbb E[m_t]=(1-\beta_1^t)\bar g E [ m t ] = ( 1 − β 1 t ) g ˉ —— 早期(t t t 小)它系统性偏小 。于是定义 m ^ t = m t / ( 1 − β 1 t ) \hat m_t=m_t/(1-\beta_1^t) m ^ t = m t / ( 1 − β 1 t ) ,使 E [ m ^ t ] = g ˉ \mathbb E[\hat m_t]=\bar g E [ m ^ t ] = g ˉ 。二阶动量 v t v_t v t 同理用 1 − β 2 t 1-\beta_2^t 1 − β 2 t 修正。这就是为什么 Adam 的更新式里有两个 1 − β t 1-\beta^t 1 − β t 因子 (β 1 = 0.9 , β 2 = 0.999 \beta_1=0.9,\beta_2=0.999 β 1 = 0.9 , β 2 = 0.999 时,前几步的修正量非常显著)。
把每个输出位置对应的感受野展平成一行,得到矩阵 X ~ ∈ R ( H out W out ) × ( C in K 2 ) \tilde{\boldsymbol X}\in\mathbb R^{(H_{\text{out}}W_{\text{out}})\times(C_{\text{in}}K^2)} X ~ ∈ R ( H out W out ) × ( C in K 2 ) ,卷积即
Y = X ~ W col , W col ∈ R C in K 2 × C out . \boldsymbol Y=\tilde{\boldsymbol X},\boldsymbol W_{\text{col}},\qquad \boldsymbol W_{\text{col}}\in\mathbb R^{C_{\text{in}}K^2\times C_{\text{out}}} . Y = X ~ W col , W col ∈ R C in K 2 × C out .
好处 :直接调用高度优化的 GEMM 内核(cuBLAS),工程上最容易快。
代价 :X ~ \tilde{\boldsymbol X} X ~ 的数据量是原始输入特征的 K 2 K^2 K 2 倍(相邻滑动窗口重复存储),显存与带宽放大。现代实现(cuDNN、CUTLASS)用隐式 GEMM 与分块寄存器复用避免真正落地该矩阵。
Chinchilla 型缩放律(拟合形式):
L ( N , D ) = E + A N α + B D β , α ≈ 0.34 , β ≈ 0.28 , E ≈ 1.69. L(N,D)=E+\frac{A}{N^{\alpha}}+\frac{B}{D^{\beta}},\qquad \alpha\approx0.34,\ \beta\approx0.28,\ E\approx1.69 . L ( N , D ) = E + N α A + D β B , α ≈ 0.34 , β ≈ 0.28 , E ≈ 1.69.
训练算力近似 C ≈ 6 N D C\approx6ND C ≈ 6 N D (前向 2 + 反向 4 次乘加)。在固定 C C C 下最小化 L L L ,用拉格朗日乘子可得
N ⋆ ∝ C β α + β , D ⋆ ∝ C α α + β . N^\star\propto C^{\frac{\beta}{\alpha+\beta}},\qquad D^\star\propto C^{\frac{\alpha}{\alpha+\beta}} . N ⋆ ∝ C α + β β , D ⋆ ∝ C α + β α .
因 α ≈ β \alpha\approx\beta α ≈ β ,两者近似等比例 扩张:N ⋆ , D ⋆ ∝ C 1 / 2 N^\star,D^\star\propto C^{1/2} N ⋆ , D ⋆ ∝ C 1/2 ,经验上换算成「每个参数配约 20 个 token」(D ≈ 20 N D\approx20N D ≈ 20 N )。注意 :这是「给定算力下的最优配比」,不是「越大越好」;且这些系数来自特定数据分布与训练配方,跨数据/跨目标外推时要谨慎。
设参数量 N N N ,优化器为 Adam 系,混合精度(低精度前向反向 + fp32 主权重):
项 组成 字节
参数 低精度副本 2 N 2N 2 N
梯度 低精度副本 2 N 2N 2 N
一阶动量 m m m fp32 4 N 4N 4 N
二阶动量 v v v fp32 4 N 4N 4 N
主权重 fp32 4 N 4N 4 N
静态合计 16 N \mathbf{16N} 16N
激活 ∝ B ⋅ T ⋅ L \propto B\cdot T\cdot L ∝ B ⋅ T ⋅ L (注意力含 B ⋅ H ⋅ T 2 B\cdot H\cdot T^2 B ⋅ H ⋅ T 2 项)与批、序列长、层数成正比
若用 8-bit 优化器(块量化 m , v m,v m , v ):8 N → ∼ 2 N 8N\to\sim2N 8 N →∼ 2 N ,静态降到 ∼ 10 N \sim10N ∼ 10 N 。若用纯 fp32 + SGD:12 N 12N 12 N (无主权重)。报告显存预算时一定要写清口径 ,否则数字不可比。
本页的用法
不要通读 :按需进入(正讲里遇到「推导见附录」的引用时来查)。
推一遍再对 :先自己写,再对照,差异处往往就是理解漏洞。
改一个符号再用 :把批维去掉、把多头换成单头、把 λ \lambda λ 设成 0 或 1——检验自己是否真懂公式的每一部分。
回到正文 :每条推导都在正文有对应的「直觉框」,两者对照读最有效。