上一篇走完了从 Q-Learning 到 DQN 的过程。用神经网络近似 Q-Function,输出各动作的 Q 值,取 argmax 选动作。加上 Experience Replay 和 Target Network,DQN 在 Atari 游戏上工作得很好。
继续跟 MIT 6.S191 Lecture 5 往下走,课程在讲完 DQN 之后,介绍了一种完全不同的思路——不学 Q-Function,直接学 Policy。
我当时的第一反应是:不是已经有 \(Q(s,a)\) 了吗?通过 argmax 就能选出最好的动作,为什么还要另起炉灶?
连续动作下 argmax 变得很困难#
先回顾一下 DQN 的决策方式。之前的文章定义过 Q-Function——在状态 \(s\) 执行动作 \(a\),后续遵循某策略时 Return 的期望。DQN 用神经网络 \(Q_\theta\) 近似这个函数,选动作的公式很简单:
$$ a^* = \arg\max_a Q_\theta(s, a) $$对于离散的动作空间,这没有问题。假设只有三个动作——左转、直行、右转——网络一次 forward 输出三个 Q 值,比较一下就选出来了。
但如果动作是连续的呢?
用方向盘转角做例子。真实的转向不是"左转或右转"这种离散选择,而是一个连续值:
$$ a \in [-30°, 30°] $$经典 DQN 的架构是"输入状态,输出所有动作对应的 Q 值"。但"所有动作"在连续空间里是无穷多个,没法枚举。
这里需要澄清一个容易误解的地方。Q-Function 本身并不要求动作必须离散。 完全可以设计一个网络,输入 \((s, a)\),输出 \(Q(s, a)\)——\(a\) 是连续值也没关系。
问题出在 argmax 上。
对于离散动作,argmax 就是比较几个数取最大的。对于连续动作,\(\arg\max_a Q(s, a)\) 变成了连续空间上的优化问题——需要在整个 \([-30°, 30°]\) 区间上找到使 Q 值最大的那个点。这本身就是一个额外的数值优化任务,并不容易高效解决。
所以经典 DQN 不太方便处理连续动作空间,核心困难不在 Q-Function 的定义上,而在 argmax 这一步。
能不能直接表达随机策略#
还有另一个不太方便的地方。
经典 DQN 的贪心策略是确定性的——给定状态,永远选 Q 值最大的那个动作。但 Policy 本身可以是一个概率分布:
$$ \pi(a \mid s) = P(A = a \mid S = s) $$比如在某个状态下:
- 向左:70%
- 向右:20%
- 不动:10%
这种随机策略(Stochastic Policy)在某些场景下是有意义的。比如在博弈环境中,如果策略完全确定,对手可能利用这一点来反制。
DQN 当然不是完全不能做随机选择——\(\epsilon\)-greedy 本身就是一种随机的动作选择方式。但 \(\epsilon\)-greedy 的随机性来自探索策略的设计,不是学习目标本身。网络学习的仍然是 Q 值,argmax 给出的仍然是确定性的动作选择。
这里需要谨慎。我不想说"随机策略一定比确定性策略好"——这个断言在一般情况下并不成立。只是想说明,经典 DQN 不直接把动作概率分布作为学习目标,这限制了它表达随机策略的灵活性。
既然目标就是 Policy,为什么一定要先学 Q#
到这里我开始想一个问题:绕了这么大一圈——先学 Q-Function,再用 argmax 从 Q 值推导出 Policy——有没有更直接的办法?
Policy Gradient 的核心思路:直接参数化 Policy,让神经网络输出动作的选择规则,而不是先估计动作价值再间接推导策略。
定义一个参数化的 Policy:
$$ \pi_\theta(a \mid s) $$逐项解释一下这个记号:
- \(\pi\):Policy,策略。
- \(\theta\):神经网络参数。
- \(s\):当前 State。
- \(a\):Action。
- \(\pi_\theta(a \mid s)\):在状态 \(s\) 下,参数为 \(\theta\) 的策略选择动作 \(a\) 的概率。对于连续动作,这里是概率密度。
对于离散动作,最简单的 Policy Network(策略网络)结构是这样的:
State → 神经网络 → 各动作的概率 → 从分布中采样 → 执行动作
和 DQN 对比一下:
State → 神经网络 → 各动作的 Q 值 → argmax → 执行动作
两者的网络都是"输入状态,输出一组数值"。但输出的含义完全不同。DQN 输出的是各动作的估计价值,Policy Network 输出的是各动作的选择概率。DQN 通过 argmax 选动作,Policy Network 通过从概率分布中采样选动作。
对于连续动作空间,Policy Network 可以输出概率分布的参数。一种常见的做法是输出一个高斯分布的均值和方差:
$$ a \sim \mathcal{N}(\mu_\theta(s),\, \sigma_\theta^2(s)) $$神经网络输出 \(\mu_\theta(s)\) 和 \(\sigma_\theta^2(s)\),定义了一个高斯分布。然后从这个分布中采样,得到具体的动作值。
比如方向盘转角的例子,网络可能输出"均值 5°,标准差 2°",表示当前状态下大概率应该轻微右转,但存在一定的随机性。
有一个需要说清楚的地方:高斯分布只是一种常用的参数化选择,不代表所有 Policy Gradient 方法都必须使用高斯分布。 对于离散动作,通常用 Softmax 输出类别概率。对于连续动作,高斯分布是最常用的选择之一,但不是唯一的。
我觉得 Policy Gradient 最值得记住的一点是:直接对动作选择规则进行参数化,而不是通过价值函数间接确定动作。
Policy Network 怎么训练#
结构搞清楚了,但 Policy Network 要怎么训练?
和监督学习不同,这里没有人告诉 Agent"在状态 \(s\) 应该选动作 \(a\)“这样的标签。Agent 需要自己通过与环境交互来发现什么是好的策略。
大致过程是这样的。假设一个简单的迷宫问题。
初始状态下,Policy 对左和右各给 50% 的概率:
$$ \pi_\theta(\text{左} \mid s) = 0.5, \quad \pi_\theta(\text{右} \mid s) = 0.5 $$Agent 从策略的概率分布中采样动作,与环境交互,走完一整条轨迹(Episode)。轨迹结束后,可以计算这条轨迹的 Return。这里需要注意区分——之前的文章定义过,Return 是从当前时刻开始的折扣累计回报,不是单步的 Reward(即时奖励)。
如果某次选择"向右"之后,后续轨迹获得了较高的 Return,就增大在这个状态下选择"向右"的概率。反过来,如果 Return 很低,就减小对应的概率。
训练的总体目标可以写成:
$$ \max_\theta J(\theta) = \max_\theta \mathbb{E}_{\pi_\theta}[G_0] $$即最大化策略 \(\pi_\theta\) 产生的期望初始 Return。\(G_0\) 是从第 0 步开始的 Return。
为了最大化 \(J(\theta)\),需要对 \(\theta\) 求梯度。Policy Gradient 方法利用采样的轨迹来估计这个梯度,其中会用到 \(\nabla_\theta \log \pi_\theta(a_t \mid s_t)\)。直觉上,这个对数概率的梯度告诉我们,参数 \(\theta\) 的小幅变化会如何影响选择动作 \(a_t\) 的概率。乘上对应的 Return,就可以判断应该往哪个方向调整参数。
这里我不展开 REINFORCE 算法的完整梯度推导,那需要引入 Score Function Estimator 的概念,不在本篇的范围内。
有一点容易忽略。不能直接把"一条轨迹获得了高 Return"等价于"沿途每一个 Action 都是正确的”。 采样具有随机性,一条轨迹的 Return 受到整条路径上所有随机选择的影响。Policy Gradient 需要通过大量轨迹的统计来估计梯度方向,而不是从单条轨迹就下结论。
另外需要说明:本篇介绍的是最基本的"直接对策略求梯度"的思路。Policy Gradient 不代表完全不需要价值函数——更高级的方法(如 Actor-Critic)会同时学习一个价值函数来辅助梯度估计、降低方差。但这些超出了本篇的范围。
这和 VAE 怎么这么像#
学到 Policy Network 输出高斯分布参数然后采样这个环节时,我脑子里突然跳出来一个想法:
这不就是 VAE 在做的事情吗?
之前写 VAE 那篇文章讲过,VAE Encoder 的输出也是一个高斯分布的参数,然后从中采样得到 latent variable。
把两者并排放一下。
VAE Encoder:
$$ q_\phi(z \mid x) = \mathcal{N}(\mu_\phi(x),\, \sigma_\phi^2(x)) $$输入数据 \(x\),网络输出均值和方差,采样得到 latent variable \(z\)。
Policy Network:
$$ \pi_\theta(a \mid s) = \mathcal{N}(\mu_\theta(s),\, \sigma_\theta^2(s)) $$输入状态 \(s\),网络输出均值和方差,采样得到动作 \(a\)。
结构上的相似性很明显:都是神经网络输出概率分布的参数,再从分布中采样。
但两者的目标完全不同。
VAE Encoder 学习的是近似后验分布 \(q(z \mid x)\),服务于生成建模。训练目标是 ELBO(证据下界),包含重建损失和 KL 散度。
Policy Network 学习的是决策规则 \(\pi(a \mid s)\),服务于最大化长期回报。训练目标是期望 Return \(J(\theta) = \mathbb{E}_{\pi_\theta}[G_0]\)。
在处理"采样操作的梯度"这个问题上,两者也走了不同的路。VAE 使用 Reparameterization Trick(重参数化技巧)——把采样改写成 \(z = \mu + \sigma \odot \epsilon\),让梯度可以直接通过 \(\mu\) 和 \(\sigma\) 反向传播。基础的 Policy Gradient 则使用对数概率的梯度来估计更新方向,不要求环境本身可微分。
这个联想让我觉得挺有意思的。相似的概率分布建模结构——神经网络输出分布参数、从分布中采样——可以服务于完全不同的机器学习目标。 VAE 用它来做生成建模,Policy Gradient 用它来做序列决策。计算结构上的共性并不意味着两者解决的是同一类问题。
真实世界不能随便试错#
MIT 6.S191 Lecture 5 最后花了不少篇幅讲自动驾驶,用它来说明强化学习在现实世界的应用挑战。
自动驾驶的 RL 框架很直观:
- State:车辆位置、速度、周围道路和障碍物的状态。
- Action:转向角度、加速、刹车。
- Reward:安全行驶得到正向反馈,碰撞或违规得到负向惩罚。
- Return:一段驾驶过程的累计表现。
但这里有一个根本性的问题。强化学习依赖大量的试错来学习策略,然而真实汽车不能为了训练而反复发生事故。
这就是仿真(Simulation)的关键角色——提供一个可以安全、反复、低成本交互的虚拟环境。
Policy 输出动作,交给仿真器执行。仿真器根据物理模型和场景设定,计算下一时刻的状态和奖励,再反馈给 Policy。这个闭环可以在仿真中反复运行。和回放固定录像不同,闭环仿真(Closed-loop Simulation)中 Agent 的动作会改变后续的环境状态,每次运行都可能走出不同的轨迹。
这里需要区分几件事。仿真系统负责模拟环境的变化——车辆动力学、交通参与者行为、传感器数据。强化学习算法负责在这个仿真环境中学习决策策略。仿真可以支撑强化学习,但仿真系统本身不等于强化学习。
课程中提到了 VISTA Simulator,一个基于真实驾驶数据构建的仿真平台,可以在 MIT 6.S191 的实验环节中用于训练 RL Agent。
必须说明一点:自动驾驶并不是一个完全由强化学习主导的领域。 实际的自动驾驶系统还涉及模仿学习(Imitation Learning)、监督学习、传统规划算法、安全约束和大量的验证流程。把仿真中获得的高 Return 等同于现实道路上的安全保证也是不准确的——仿真与真实环境之间始终存在差距(Sim-to-Real Gap)。
写在最后#
从 DQN 走到 Policy Gradient,学完 MIT 6.S191 Lecture 5 的主线之后,我觉得值得保留三个认识。
Q-Learning 与 Policy Gradient 的根本区别在于学习对象不同。 Q-Learning 学习的是动作价值函数 \(Q(s, a)\),策略是从 Q 值间接推导出来的。Policy Gradient 直接参数化策略 \(\pi_\theta(a \mid s)\),让网络输出动作的选择规则本身。这两条路线不是互斥的——更高级的方法会结合两者——但理解各自的出发点很重要。
Policy Gradient 与 VAE 在概率分布参数化上有结构相似性,但训练目标不同。 都是神经网络输出分布参数、从分布中采样,但 VAE 服务于生成建模,Policy Gradient 服务于序列决策。
强化学习在现实世界面临探索成本与安全问题,仿真是让大规模试错成为可能的重要工具。 但仿真不是万能的——仿真与真实环境之间的差距是一个持续的挑战。
目前掌握这些概念,已经足够理解 MIT 6.S191 Lecture 5 的主要思路。Policy Gradient 的完整梯度推导以及 Actor-Critic 等方法,留待以后有实际需求时再深入。
参考资料#
- 从 Value Iteration 到 Q-Learning:没有真实 Q 值,模型如何学会决策? — DQN、Bootstrapping 与 TD Error
- 从 Return 到 Q-Function:强化学习如何评价一个尚未发生的决策 — V、Q 定义与 Reward/Return 的区分
- 从 Policy Improvement 到 Value Iteration:Bellman Equation 如何找到最优策略? — Policy Iteration 与 Value Iteration
- 理解 Bellman Equation:从条件期望到概率 DP — Bellman Equation 推导
- VAE 为什么要让 Latent Variable 变成一个概率分布 — VAE 与 Reparameterization Trick
- MIT 6.S191: Introduction to Deep Learning, Lecture 5 — https://introtodeeplearning.com/
- MIT 6.S191 Lecture 5 Slides — https://introtodeeplearning.com/slides/6S191_MIT_DeepLearning_L5.pdf