1. 为什么学 RL 要学“随机近似”?

本章看似是数学插曲,实则是连接蒙特卡洛 (MC) 和时序差分 (TD) 的桥梁。
所有现代 RL 算法(Q-learning, DQN, Policy Gradient)的更新公式都长这样:
$$ w ← w + α ( ext{Target} - w) $$
这个公式是怎么来的?为什么它能收敛?这背后的数学原理就是 Robbins-Monro 算法


2. 均值估计:从批量到增量

假设我们想求随机变量 $X$ 的期望 $w = ℕ[X]$。
我们可以采样 $x_1, x_2, …, x_k$。

2.1 批量计算 (Batch)

$$ w_k = rac{1}{k} ∑_{i=1}^k x_i $$
缺点:每次都要把所有数加起来除以 $k$,或者保存所有数。

2.2 增量计算 (Incremental)

我们可以推导出递推公式:
$$ w_{k+1} = w_k + rac{1}{k+1} (x_{k+1} - w_k) $$
这就是最简单的随机近似!

  • $w_k$: 当前的估计值。
  • $x_{k+1}$: 新的样本。
  • $(x_{k+1} - w_k)$: 误差 (Error)
  • $ rac{1}{k+1}$: 步长 (Step Size),通常记为 $α_k$。

3. Robbins-Monro (RM) 算法

RM 算法解决更通用的问题:求解方程 $g(w) = 0$
难点在于:我们不知道 $g(w)$ 的具体解析式,而且我们每次观测 $g(w)$ 时都带有噪声 $η$。
$$ rig(w) = g(w) + η $$

RM 更新公式:
$$ w_{k+1} = w_k - a_k rig(w_k) $$

收敛条件:
只要步长序列 {$a_k$} 满足:

  1. $∑ a_k = ∞$ (步子总长足够大,能走到解)。
  2. $∑ a_k^2 < ∞$ (步子变小的速度足够快,保证最后收敛不震荡)。
    那么 $w_k$ 就会以概率 1 收敛到方程的根 $w^*$。

4. 随机梯度下降 (SGD)

SGD 是 RM 算法在优化问题上的应用。
目标:$≈ J(w)$。等价于求梯度为 0 的根:$
abla J(w) = 0$。
这里 $g(w) =
abla J(w)$。
由于我们通常无法计算全量梯度(数据太多),只能用一个样本的梯度 $ƒ}
abla J(w)$ 来近似。

$$ w_{k+1} = w_k - a_k \widehat{\nabla J}(w_k) $$
这就是深度学习中天天用的 SGD。


5. 深度思考:学习率 (Step Size) 的哲学

在 Robbins-Monro 条件中,要求 $\sum a_k = \infty$ 且 $\sum a_k^2 < \infty$(例如 $a_k = 1/k$)。这意味着学习率必须逐渐衰减到 0

为什么?
因为我们的观测 $g(w) + \eta$ 是含噪的。如果步长不缩小,即便我们到了最优解附近,噪声 $\eta$ 也会推着我们来回震荡,永远无法稳定。衰减步长是为了抵消噪声的方差

但是,在 Deep RL (如 DQN) 中,我们通常用常数学习率 (Fixed Learning Rate),如 1e-4。为什么违反理论?
因为 RL 的环境往往是 Non-stationary (非平稳) 的:

  1. Target 在变:在 DQN 中,Target Network 会定期更新,我们追逐的目标 $y$ 本身就在变。
  2. 分布在变:随着策略 $\pi$ 变好,Agent 访问的状态分布 $d_\pi(s)$ 也在变。

如果我们让 $\alpha \to 0$,Agent 就会失去**“适应变化”**的能力(Tracking ability)。
结论

  • 理论收敛:需要 $\alpha \to 0$。
  • 实际工程:使用小的常数 $\alpha$,在“收敛精度”和“追踪速度”之间做 Trade-off。这导致结果会在最优解附近形成一个“震荡区”,而无法精准停在一点。

6. Python 实战:RM 算法找根

我们来模拟一个场景:
求解方程 $g(w) = anh(w - 1) = 0$ (解显然是 $w=1$)。
但我们观测时有高斯噪声。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import numpy as np
import matplotlib.pyplot as plt

def true_function(w):
return np.tanh(w - 1)

def noisy_observation(w):
return true_function(w) + np.random.normal(0, 0.5) # 添加噪声

def robbins_monro(w_init, num_iter):
w = w_init
w_history = [w]

for k in range(1, num_iter + 1):
# 满足 RM 条件的步长: a_k = 1/k
# 实际 RL 中常设为固定小常数 (如 0.01),牺牲收敛性换取非平稳适应性
a_k = 1.0 / k

# 获取含噪观测
measurement = noisy_observation(w)

# RM 更新
w = w - a_k * measurement
w_history.append(w)

return w_history

# 运行模拟
w_hist = robbins_monro(w_init=-5.0, num_iter=1000)

print(f"Final Estimate: {w_hist[-1]:.4f}") # 应该接近 1.0

6. RL 中的应用 (Preview)

在下一章 TD Learning 中,我们将看到这样的公式:
$$ V(S_t) ← V(S_t) + α [ (R + γ V(S_{t+1})) - V(S_t) ] $$
对比 RM 公式 $w ← w - α rig(w)$,你会发现:

  • $w$ 就是 $V(S_t)$。
  • $rig(w)$ 就是 $V(S_t) - (R + γ V(S_{t+1}))$(预测误差)。
  • 我们的目标就是让这个误差期望为 0,即 $V(S_t) = ℕ[R + γ V(S_{t+1})]$ (Bellman Equation)。

结论:TD Learning 本质上就是用 RM 算法来解 Bellman Equation!


上一章:第5章 - 蒙特卡洛方法 | 下一章:第7章 - 时序差分方法 >>