↓ 跳过正文
  1. Posts/

从 Q-Learning 到 Policy Gradient:为什么要直接学习策略?

·4692 字·10 分钟
强化学习 - 这篇文章属于一个选集。
§ : 本文

上一篇走完了从 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 值最大的那个点。这本身就是一个额外的数值优化任务,并不容易高效解决。

离散动作 vs 连续动作

所以经典 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 Gradient 的结构对比

两者的网络都是"输入状态,输出一组数值"。但输出的含义完全不同。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 与 Policy Network 的结构对比

结构上的相似性很明显:都是神经网络输出概率分布的参数,再从分布中采样。

但两者的目标完全不同。

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)的关键角色——提供一个可以安全、反复、低成本交互的虚拟环境。

RL 与仿真器的闭环交互

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 等方法,留待以后有实际需求时再深入。

参考资料
#

强化学习 - 这篇文章属于一个选集。
§ : 本文

相关文章

从条件概率到贝叶斯定理:再理解全概率与全期望

·6128 字·13 分钟
起因 # 上一篇讨论了 Markov Property,提到 Bellman Equation 需要它作为前提。 准备看 Bellman Equation 的推导时,我卡在了一个叫 Law of Total Expectation(全期望公式)的地方。它的核心思想是:计算整体期望时,可以先按某个变量的不同取值分组,分别算各组的条件期望,再按组别的概率加权平均。之前那篇定义的 State Value \(V^\pi(s) = \mathbb{E}_\pi[G_t \mid S_t = s]\),在 Bellman Equation 里正是用这个思路按"下一个 State"分组来展开。