PRINCIPLE LAYER · FUNCTION APPROXIMATION
神经网络替代 Q 表后,算法本质变成“让一个函数满足 Bellman 关系”。
表格里每个 Q(s,a) 是独立数字;函数近似中,它们由同一组参数 θ 共同生成:Qθ(s,a)。对一条 TD transition,常见目标写作 y=r+γ maxa′Qθ¯(s′,a′),再最小化:
θ ← θ − η · ∇θL(θ)第一行把“Bellman 应一致”变成可微的平方误差;第二行通过链式法则调整所有会影响当前 Q 预测的参数。η 是步长,θ¯ 是一个暂时冻结或缓慢更新的 target 参数。
这里有一个常被省略的关键:计算 ∇θL 时,通常把 y 当常数,不对 target 分支反向传播。这叫 semi-gradient(半梯度)。原因不是偷懒,而是 target 也依赖正在变化的估计器;若两边同时追逐,优化目标会移动得更快,训练更不稳定。
| 表格 RL | 函数近似 RL | 新增的原理风险 |
|---|---|---|
| 改 Q(s,a) 只影响一个格子。 | 改 θ 会同时影响许多状态与动作的预测。 | 泛化有收益,但一次更新会意外伤害别处估计。 |
| target 可由另一格 Q 值给出。 | target 和预测都可能来自同一网络族。 | 数据相关、bootstrap、函数近似叠加会导致 deadly triad。 |
Lesson 05 的 replay buffer 与 target network 不是“工程小技巧”:前者降低连续样本相关性,后者让 y 在一段时间内近似不动,都是为了让这个半梯度更新更接近一个稳定的学习问题。
LEARNING TARGET
学完后,你能看懂深度强化学习(Deep Reinforcement Learning,Deep RL)的一次参数更新。
| 完成目标 | 直接应用 | 后续会在哪反复出现 |
|---|---|---|
| 区分输入向量、网络预测、target、loss 与参数 θ。 | 读 DQN(Deep Q-Network,深度 Q 网络)/ PPO(Proximal Policy Optimization,近端策略优化)/ PyTorch 训练代码时,知道每个张量和标量的职责。 | 函数近似、critic、policy loss、KL penalty、LLM RL。 |
| 理解梯度下降为何能让预测更接近 target。 | 排查 loss 发散、learning rate 过大或 target 不稳定等训练问题。 | DQN 稳定化、actor-critic、PPO 与优化器配置。 |
不要求你手推神经网络反向传播,也不开始训练 DQN。它只建立后续深度 RL 所需的因果链。
WHY THIS EXISTS
表格为什么会变成神经网络?
tabular RL 可以存一张表:每个状态一个 V(s) 或每个状态动作对一个 Q(s,a)。图像、文本、连续传感器的可能状态几乎无穷,表装不下;于是我们用带参数的函数去近似它:
G2 · VECTOR
向量就是有顺序的一串数字。
状态可以写成向量 x。例如 CartPole 可近似表示为 x=[位置, 速度, 杆角度, 角速度]。模型不理解这些中文名字,它只对数值做变换。
w·x = 0.5×2 + (−1)×3 = −2点积是对应位置相乘后求和。最简单的线性预测可以写作 ŷ=w·x+b。
| 对象 | 直觉 | Deep RL 中的例子 |
|---|---|---|
| 标量 scalar | 一个数。 | reward、loss、一个 Q 值。 |
| 向量 vector | 有顺序的一串数。 | 一个状态、一条动作、一个 embedding。 |
| 矩阵 matrix | 把许多向量变换成新向量的一张数表。 | 一层网络权重、一个 batch 的状态。 |
| 张量 tensor | 更高维的一组数,不必神秘化。 | 图像 batch、Transformer 激活、PyTorch 数据容器。 |
G3 · LOSS
优化前,必须先定义“错了多少”。
一条 TD transition 可能给出 target=6.5,而网络预测 Qθ(s,a)=4.0。一个简单的平方误差:
reward:环境的单步反馈;return:长期任务目标;value:对 return 的估计;loss:更新参数时最小化的工程目标。它们都像“分数”,却不能互换。
G3 · GRADIENT
梯度回答:参数往哪个方向动,loss 会下降?
只有一个参数 θ 时,导数 d loss/dθ 表示 θ 微小变化时 loss 的变化率。多个参数时,把每个偏导排成向量,就是梯度 ∇θloss。
若 θ=4,某一步导数为 +3,η=0.1,则新 θ=4−0.1×3=3.7。导数为正说明继续增大 θ 会让 loss 变大,所以更新把它往小的方向推。
THE WHOLE LOOP
把一次 Deep RL 更新翻译成人话。
后面 DQN 的 replay buffer、target network 和 double Q 都是在保护这个循环:减少样本相关、让 target 慢一点变化、缓解最大化偏差。
CODE READING
不要求现在会写,但要读懂四行。
prediction = q_net(state, action) # Qθ(s,a)
target = reward + gamma * max_q(next_state)
loss = (target - prediction).pow(2).mean()
optimizer.step() # 沿负梯度更新 θ
真实 PyTorch 会多出 batch、replay、target network;但复杂实现都能还原成这四行的因果链。
CHECK YOUR UNDERSTANDING
先分清四个角色。
01 · reward=+1 但 loss 很大,矛盾吗?
不矛盾。+1 是环境反馈;loss 大表示网络对当前 TD target 的预测还不准。两者来自不同层面。
02 · 为什么不能把每个新状态塞进无限大的 V 表?
连续状态、图像、文本组合的数量极大或无穷。函数近似用参数共享,希望从已见状态泛化到相似未见状态。
03 · learning rate η 太大可能怎样?
每次参数跨得太远,可能越过低点、震荡甚至发散;太小则收敛很慢。它改变学习过程,不改变环境任务定义。
NEXT