【高级机器学习】 12. 强化学习,Q-learning, DQN
强化学习(Reinforcement Learning)基础入门:从监督学习到 Q-learning, DQN
1. 监督学习与强化学习的本质区别
1.1 监督学习回顾
在监督学习中,我们拥有带标签的训练数据:
S=(xi,yi)i=0k, S = {(x_i, y_i)}_{i=0}^k, S=(xi,yi)i=0k,
其中:
- xi∈Xx_i \in \mathcal{X}xi∈X 为特征
- yi∈Yy_i \in \mathcal{Y}yi∈Y 为标签
目标是学习一个函数:
fS:X→Y, f_S : \mathcal{X} \to \mathcal{Y}, fS:X→Y,
使得 fff 在新样本上也能预测正确的标签。
核心特点:有“标准答案”可以学习。
1.2 强化学习的核心思想
强化学习中,没有标签。只有:
- 状态(state)
- 动作(action)
- 奖励(reward)
智能体(agent)与环境交互,通过试错学习到一个策略(policy),使得 长期累计奖励 最大。
强化学习要解决的问题是:
如何在不同状态下选择动作,使未来获得尽可能高的累计收益?
2. 强化学习中的基本符号与过程
2.1 基本符号(Notation)
- A\mathcal{A}A:动作集合
- S\mathcal{S}S:状态集合
- ttt:时间步
- rtr_trt:在时间 ttt 得到的即时奖励
- π\piπ:策略,即 π(a∣s)\pi(a\mid s)π(a∣s) 表示“在状态 sss 时选择动作 aaa 的概率”
2.2 强化学习的交互过程
智能体与环境交互的基本流程:
- 处于某个状态 St=stS_t = s_tSt=st
- 根据策略选择动作 At=atA_t = a_tAt=at
- 获得奖励 Rt=rtR_t = r_tRt=rt
- 转移到下一个状态 St+1=st+1S_{t+1} = s_{t+1}St+1=st+1
三个关键概率分布:
- 行动选择:π(At∣St)\pi(A_t \mid S_t)π(At∣St)
- 状态转移:P(St+1∣St,At)P(S_{t+1} \mid S_t, A_t)P(St+1∣St,At)
- 奖励生成:P(Rt∣St,At)P(R_t \mid S_t, A_t)P(Rt∣St,At)
3. 强化学习的目标函数
强化学习希望最大化折扣累计奖励:
∑t≥0γtrt, \sum_{t\ge 0} \gamma^t r_t, t≥0∑γtrt,
其中 γ∈(0,1)\gamma \in (0,1)γ∈(0,1) 是折扣因子。
目标是寻找最优策略 π∗\pi^*π∗:
π∗=argmaxπE[∑t≥0γtrt,∣,S0=s0,π]. \pi^* = \arg\max_{\pi} \mathbb{E}\left[ \sum_{t\ge 0} \gamma^t r_t ,\big|, S_0 = s_0, \pi \right]. π∗=argπmaxE[t≥0∑γtrt,,S0=s0,π].
γ\gammaγ 越接近 1,越重视远期收益。
4. 一个具体的强化学习示例环境
我们来看一个具有三个状态、两个动作的简单环境:
- 状态集合:
S=s1,s2,s3 \mathcal{S} = {s^1, s^2, s^3} S=s1,s2,s3
- 动作集合:
A=a1,a2 \mathcal{A} = {a^1, a^2} A=a1,a2
环境定义了每个动作从当前状态跳转到哪个状态,并给出即时奖励(正数代表好,负数代表坏)。
在该环境中,不同动作可能:
- 转移到不同的状态
- 获得不同的奖励
- 在达到某些状态后可以反复获得高奖励(如 s3s^3s3 中执行 a2a^2a2 会一直得到 +4+4+4)
5. 比较两个策略的优劣
给定初始状态 s0=s1s_0 = s^1s0=s1,比较两个策略 π1\pi^1π1、π2\pi^2π2:
- 两个策略会生成不同的状态——动作——奖励序列
- 长期奖励(累积折扣奖励)不同
根据计算结果:
第二个策略 π2\pi^2π2 获得的长期收益更高,因此是更优的策略
其原因是 π2\pi^2π2 会更倾向进入能重复获得高奖励的状态(例如 s3s^3s3)。
6. Q-value 的定义与意义
6.1 Q-value 的含义
Q-value(行动价值函数)定义为:
在状态 s0s_0s0 下采取动作 a0a_0a0,之后按策略 π\piπ 行动所能获得的期望折扣累计奖励
形式化定义:
Q(s0,a0)=E[∑t≥0γtrt,∣,S0=s0, A0=a0, π]. Q(s_0, a_0) = \mathbb{E}\left[ \sum_{t\ge 0} \gamma^t r_t ,\Big|, S_0 = s_0,\ A_0 = a_0,\ \pi \right]. Q(s0,a0)=E[t≥0∑γtrt,,S0=s0, A0=a0, π].
最优的 Q-value:
Q∗(s,a)=maxπQ(s,a). Q^*(s,a) = \max_{\pi} Q(s,a). Q∗(s,a)=πmaxQ(s,a).
6.2 计算一个具体的最优 Q 值
例如计算从状态 s2s^2s2 执行动作 a1a^1a1 的最优 Q-value:
奖励序列如下:
- 第 0 步得到 +1+1+1
- 第 1 步得到 γ⋅1\gamma\cdot 1γ⋅1
- 第 2 步得到 −γ2⋅1-\gamma^2\cdot 1−γ2⋅1
- 从第 3 步开始,每一步都得到 +4+4+4,形成无限几何序列
因此:
Q∗(s2,a1)=1+γ−γ2+∑t=3∞4γt. Q^*(s^2, a^1) = 1 + \gamma - \gamma^2 + \sum_{t=3}^{\infty} 4\gamma^t. Q∗(s2,a1)=1+γ−γ2+t=3∑∞4γt.
几何级数的结构说明:
4γt4\gamma^t4γt 表示从到达高回报状态后不断获得稳定奖励。
7. Bellman 最优性方程:Q 的递推关系
最关键的递推公式:
Q∗(s,a)=r+γE∗s′[max∗a′Q∗(s′,a′)]. Q^*(s,a) = r + \gamma \mathbb{E}*{s'} \left[ \max*{a'} Q^*(s', a') \right]. Q∗(s,a)=r+γE∗s′[max∗a′Q∗(s′,a′)].
表示:
当前的最优价值 = 即时奖励 + 未来最优价值(折扣后)
这是强化学习所有动态规划、Q-learning 等方法的基础。
8. TD 更新:如何根据 Bellman 方程迭代求 Q
Bellman 方程可重新整理为以下形式:
Q(s,a)=Q(s,a)+E∗s′[r+γmax∗a′Q(s′,a′)−Q(s,a)]. Q(s,a) = Q(s,a) + \mathbb{E}*{s'} \left[ r + \gamma \max*{a'}Q(s',a') - Q(s,a) \right]. Q(s,a)=Q(s,a)+E∗s′[r+γmax∗a′Q(s′,a′)−Q(s,a)].
括号内:
δ=r+γmaxa′Q(s′,a′)−Q(s,a) \delta = r + \gamma \max_{a'}Q(s',a') - Q(s,a) δ=r+γa′maxQ(s′,a′)−Q(s,a)
称为 TD 误差(Temporal Difference error),代表“新信息与旧估计的差距”。
8.1 实际可用的迭代公式
加入学习率 η∈(0,1)\eta \in (0,1)η∈(0,1):
Qi+1(s,a)=Qi(s,a)+η(r+γmaxa′Qi(s′,a′)−Qi(s,a)). Q_{i+1}(s,a) = Q_i(s,a)+\eta\big(r + \gamma \max_{a'}Q_i(s',a') - Q_i(s,a)\big). Qi+1(s,a)=Qi(s,a)+η(r+γa′maxQi(s′,a′)−Qi(s,a)).
意义:
- r+γmaxQr + \gamma\max Qr+γmaxQ 是“更真实”的估计(包含观测到的奖励)
- 学习率控制吸收多少新信息
9. Q-table:将 Q 值存到表中
在有限状态–动作空间,可以用一个 Q 表存储所有 Q(s,a)Q(s,a)Q(s,a):
| 动作/状态 | s1s^1s1 | s2s^2s2 | s3s^3s3 |
|---|---|---|---|
| a1a^1a1 | 5 | 2 | – |
| a2a^2a2 | -1 | -6 | -4 |
| a3a^3a3 | 5 | 2 | 3 |
每次交互后:
- 根据更新公式更新表中的某个 (s,a)(s,a)(s,a) 的值
- 不断迭代,使 Q-table 收敛到接近最优 Q-value
10. Q-table 的学习流程
Q-table 的学习包含以下循环:
- 初始化 Q-table
- 从当前状态选择动作(通常结合 ϵ\epsilonϵ-greedy)
- 执行动作
- 获得奖励
- 更新 Q-table
- 回到步骤 2
经过大量迭代后,Q-table 会收敛得到近似最优策略。
11. Q-learning 算法(Off-policy)
Q-learning 更新规则:
Q(s,a)←Q(s,a)+η(r+γmaxa′Q(s′,a′)−Q(s,a)) Q(s,a) \leftarrow Q(s,a) + \eta\left(r + \gamma\max_{a'}Q(s',a') - Q(s,a)\right) Q(s,a)←Q(s,a)+η(r+γa′maxQ(s′,a′)−Q(s,a))
Q-learning 的特点:
- off-policy:
用 maxQ(s′,a′)\max Q(s',a')maxQ(s′,a′) 更新,但下一步动作不一定是选择该 a′a'a′; - 因此学习到的是“最优策略”,而不是“实际执行的策略”。
伪代码要点:
-
初始化 Q-table
-
重复以下步骤直到 episode 结束:
- 选择动作 a=argmaxQ(s,a)a=\arg\max Q(s,a)a=argmaxQ(s,a)
- 执行动作获得 (r,s′)(r,s')(r,s′)
- 更新 Q(s,a)Q(s,a)Q(s,a)
- 状态 s←s′s \leftarrow s's←s′
12. Sarsa 算法(On-policy)
Sarsa 的更新公式:
Q(s,a)←Q(s,a)+η(r+γQ(s′,a′)−Q(s,a)), Q(s,a) \leftarrow Q(s,a) + \eta\left(r + \gamma Q(s', a') - Q(s,a)\right), Q(s,a)←Q(s,a)+η(r+γQ(s′,a′)−Q(s,a)),
与 Q-learning 唯一不同:
- 使用的是执行策略本身选出的动作 a′a'a′
- 因此是 on-policy
学习的是当前策略,而不是最优策略。
伪代码流程:
- 初始化 Q
- 在状态 sss 下根据当前策略选动作 aaa
- 执行动作获得 (r,s′)(r, s')(r,s′)
- 在新状态 s′s's′ 下选动作 a′a'a′
- 用 Q(s′,a′)Q(s',a')Q(s′,a′) 更新
- 状态和动作同时更新为 (s′,a′)(s', a')(s′,a′)
13. On-policy 和 Off-policy 的核心区别
-
Sarsa 是 on-policy
使用“实际执行的动作 a′a'a′”更新 Q 值
也用该动作继续执行下一步 -
Q-learning 是 off-policy
使用“理论最优动作 argmaxa′Q(s′,a′)\arg\max_{a'}Q(s',a')argmaxa′Q(s′,a′)”更新
下一步不要求执行这个动作
简化表达:
| 算法 | 更新用的动作 | 下一步动作 | 类型 |
|---|---|---|---|
| Q-learning | maxQ\max QmaxQ | 不一定执行此动作 | Off-policy |
| Sarsa | 实际动作 a′a'a′ | 使用同一个策略 | On-policy |
3. 深度 Q-learning(Deep Q Network, DQN)
在前面我们介绍了 Q-learning、SARSA 等基于表格(Q-table)的方法。但现实中很多任务具有:
- 连续状态空间(例如机器人位置是实数)
- 高维状态空间(例如输入是图像)
- 连续动作空间
此时根本无法构建一个“表格”去存所有 (s,a)(s,a)(s,a) 的 Q 值。
因此,我们用一个 神经网络 来近似 Q 函数:
Q(s,a)≈Qw(s,a) Q(s,a) \approx Q_w(s,a) Q(s,a)≈Qw(s,a)
其中 www 是神经网络参数。
3.1 为什么需要 DQN?
Q-table 方法的存储方式如下(示例):
| Action | s1s^1s1 | s2s^2s2 | s3s^3s3 | … |
|---|---|---|---|---|
| a1a^1a1 | 5 | 2 | - | … |
| a2a^2a2 | -1 | -6 | -4 | … |
| a3a^3a3 | 5 | 2 | 3 | … |
如果状态是 100010001000 维向量、甚至是 84×8484×8484×84 图像,那么状态空间是 1010010^{100}10100 级别,不可能建表。
因此,DQN 的核心思想是:
用神经网络充当 Q-value 的函数近似器(function approximator)。
3.2 DQN 的目标函数
根据 Bellman 最优方程:
Q∗(s,a)=r+γmaxa′Q∗(s′,a′) Q^*(s,a) = r + \gamma \max_{a'} Q^*(s',a') Q∗(s,a)=r+γa′maxQ∗(s′,a′)
对于 DQN,我们让网络逼近这一方程。
定义 DQN 的 loss:
L(w)=(r+γmaxa′Qw(s′,a′)−Qw(s,a))2 L(w)= \left(r + \gamma \max_{a'} Q_w(s',a') - Q_w(s,a)\right)^2 L(w)=(r+γa′maxQw(s′,a′)−Qw(s,a))2
注意:
- 梯度只对 Qw(s,a)Q_w(s,a)Qw(s,a) 求
- 不对 maxa′Qw(s′,a′)\max_{a'}Q_w(s',a')maxa′Qw(s′,a′) 做反向传播(否则梯度会“穿透未来动作搜索”导致训练不稳定)
3.3 Experience Replay(经验回放)
如果直接用样本 (s,a,r,s′)(s,a,r,s')(s,a,r,s′) 在线更新,会有严重问题:
- 样本之间高度相关(时间序列)
- 导致训练震荡、不稳定、不收敛
经验回放(Experience Replay)解决此问题。
Replay Buffer 的步骤
-
收集经历(transition)
(s,a,r,s′) (s,a,r,s') (s,a,r,s′) -
存入经验池(Experience Bank)
-
每次训练时,从经验池随机采样 batch
-
对 batch 中样本计算 DQN loss:
(r+γmaxa′Qw(s′,a′)−Qw(s,a))2 (r+\gamma \max_{a'} Q_w(s',a') - Q_w(s,a))^2 (r+γa′maxQw(s′,a′)−Qw(s,a))2
随机采样能:
- 打破时间相关性
- 增强训练稳定性
- 提升样本利用率
3.4 Prioritised Experience Replay(优先经验回放)
随机采样有个问题:
一些 transition 比其他 transition 更重要。
例如某个样本误差巨大:
δ=r+γmaxa′Qw(s′,a′)−Qw(s,a) \delta = r + \gamma \max_{a'} Q_w(s',a') - Q_w(s,a) δ=r+γa′maxQw(s′,a′)−Qw(s,a)
说明它对 Q 网络影响非常大。
Priority Replay 的思想:
误差越大的样本,越应该被采样。
因此给每个 transition 一个权重:
w∝δ2 w \propto \delta^2 w∝δ2
采样概率越高 → 更新越频繁 → 收敛更快。
3.5 优先经验回放算法(简化版)
算法执行流程如下:
-
初始化 Q 网络参数 www
-
初始化经验池 B=∅B=\varnothingB=∅
-
对每一步:
- 选动作 a=argmaxaQw(s,a)a=\arg\max_a Q_w(s,a)a=argmaxaQw(s,a)
- 观察 s′,rs',rs′,r
- transition 存入 BBB,附带最高优先级
-
每隔 KKK 步:
- 从 BBB 按优先级采样 (s,a,r,s′)(s,a,r,s')(s,a,r,s′)
- 计算误差
- 更新当前 transition 优先级
- 梯度下降更新 www
## 4. Policy Gradient(策略梯度)
DQN 是 先学 Q 函数,再从 Q 推出策略:
a=argmaxaQ(s,a) a = \arg\max_a Q(s,a) a=argamaxQ(s,a)
但在某些环境下:
- Q 函数极度复杂(例如输入是高维图像)
- 动作连续(Q-learning 无法处理连续动作)
- 学习 Q 远比学习策略更难
因此我们直接学习策略 πθ\pi_\thetaπθ:
πθ(a∣s): 给定状态s,采取动作a的概率 \pi_\theta(a|s) :\ 给定状态 s,采取动作 a 的概率 πθ(a∣s): 给定状态s,采取动作a的概率
4.1 策略的优化目标
定义策略的期望回报:
J(θ)=E[∑t≥0γtrt∣πθ] J(\theta) = \mathbb{E}\left[\sum_{t\ge 0} \gamma^t r_t \mid \pi_\theta\right] J(θ)=E[t≥0∑γtrt∣πθ]
目标:
θ∗=argmaxθJ(θ) \theta^* = \arg\max_\theta J(\theta) θ∗=argθmaxJ(θ)
我们希望对 θ\thetaθ 执行 梯度上升:
θ←θ+η∇θJ(θ) \theta \leftarrow \theta + \eta \nabla_\theta J(\theta) θ←θ+η∇θJ(θ)
4.2 如何求 ∇θJ(θ)\nabla_\theta J(\theta)∇θJ(θ)?——难点重点解释
这是策略梯度的数学核心。
从期望形式:
J(θ)=Eτ∼p(τ;θ)[r(τ)] J(\theta) = \mathbb{E}_{\tau \sim p(\tau;\theta)} [r(\tau)] J(θ)=Eτ∼p(τ;θ)[r(τ)]
这里 τ\tauτ 是一条轨迹:
τ=(s0,a0,r0,s1,a1,r1,… ) \tau = (s_0,a_0,r_0,s_1,a_1,r_1,\dots) τ=(s0,a0,r0,s1,a1,r1,…)
其概率为:
p(τ;θ)=∏t≥0p(st+1∣st,at),πθ(at∣st) p(\tau;\theta)=\prod_{t\ge 0} p(s_{t+1}|s_t,a_t), \pi_\theta(a_t|s_t) p(τ;θ)=t≥0∏p(st+1∣st,at),πθ(at∣st)
4.3 直接求梯度是不可能的
如果直接对 p(τ;θ)p(\tau;\theta)p(τ;θ) 求导:
∇θJ(θ)=∫r(τ)∇θp(τ;θ)dτ \nabla_\theta J(\theta)=\int r(\tau)\nabla_\theta p(\tau;\theta) d\tau ∇θJ(θ)=∫r(τ)∇θp(τ;θ)dτ
无法 Monte Carlo,因为 这不是期望形式。
4.4 Log Derivative Trick(关键技巧)
将 ∇p\nabla p∇p 改写成 p∇logpp \nabla \log pp∇logp:
∇θp(τ;θ)=p(τ;θ)∇θlogp(τ;θ) \nabla_\theta p(\tau;\theta) = p(\tau;\theta)\nabla_\theta \log p(\tau;\theta) ∇θp(τ;θ)=p(τ;θ)∇θlogp(τ;θ)
于是:
∇θJ(θ)=∫r(τ)p(τ;θ)∇θlogp(τ;θ)dτ \nabla_\theta J(\theta) = \int r(\tau) p(\tau;\theta) \nabla_\theta \log p(\tau;\theta)d\tau ∇θJ(θ)=∫r(τ)p(τ;θ)∇θlogp(τ;θ)dτ
这等价于:
∇θJ(θ)=E∗τ∼p(τ;θ)[r(τ)∇∗θlogp(τ;θ)] \nabla_\theta J(\theta) = \mathbb{E}*{\tau\sim p(\tau;\theta)} \left[ r(\tau)\nabla*\theta\log p(\tau;\theta) \right] ∇θJ(θ)=E∗τ∼p(τ;θ)[r(τ)∇∗θlogp(τ;θ)]
这是一个 可采样的期望。
4.5 Markov 假设下的对数概率展开
由于 Markov 性:
p(τ;θ)=∏t≥0p(st+1∣st,at)πθ(at∣st) p(\tau;\theta)=\prod_{t\ge 0} p(s_{t+1}|s_t,a_t)\pi_\theta(a_t|s_t) p(τ;θ)=t≥0∏p(st+1∣st,at)πθ(at∣st)
取对数:
logp(τ;θ)=∑t≥0[logp(st+1∣st,at)+logπθ(at∣st)] \log p(\tau;\theta)=\sum_{t\ge 0} \left[ \log p(s_{t+1}|s_t,a_t) + \log \pi_\theta(a_t|s_t) \right] logp(τ;θ)=t≥0∑[logp(st+1∣st,at)+logπθ(at∣st)]
对 θ\thetaθ 求梯度:
因为转移概率 p(st+1∣st,at)p(s_{t+1}|s_t,a_t)p(st+1∣st,at) 与 θ\thetaθ 无关:
∇θlogp(τ;θ)=∑t≥0∇θlogπθ(at∣st) \nabla_\theta \log p(\tau;\theta) = \sum_{t\ge 0}\nabla_\theta \log \pi_\theta(a_t|s_t) ∇θlogp(τ;θ)=t≥0∑∇θlogπθ(at∣st)
4.6 最终得到策略梯度公式
将上述结果代入:
∇θJ(θ)=E[r(τ)∑t≥0∇θlogπθ(at∣st)] \nabla_\theta J(\theta) = \mathbb{E}\left[ r(\tau)\sum_{t\ge 0}\nabla_\theta\log\pi_\theta(a_t|s_t) \right] ∇θJ(θ)=E[r(τ)t≥0∑∇θlogπθ(at∣st)]
实际使用时,用 nnn 条轨迹 Monte Carlo 估计:
∇θJ^(θ)=1n∑i=1nr(τi)∑t≥0∇θlogπθ(at∣st) \nabla_\theta \hat J(\theta) = \frac{1}{n}\sum_{i=1}^n r(\tau_i)\sum_{t\ge 0}\nabla_\theta \log \pi_\theta(a_t|s_t) ∇θJ^(θ)=n1i=1∑nr(τi)t≥0∑∇θlogπθ(at∣st)
这就是经典的 REINFORCE 算法。
4.7 策略梯度(REINFORCE)算法
算法步骤如下:
-
初始化参数 θ\thetaθ
-
对每一个 episode:
- 收集 (s0,a0,r0,…,sT,aT,rT)(s_0,a_0,r_0,\dots,s_T,a_T,r_T)(s0,a0,r0,…,sT,aT,rT)
- 计算累计回报 r=∑t≥0γtrtr=\sum_{t\ge 0}\gamma^t r_tr=∑t≥0γtrt
- 计算梯度累积
Δθ←Δθ+α∇θlogπθ(at∣st) \Delta\theta \leftarrow \Delta\theta + \alpha \nabla_\theta\log\pi_\theta(a_t|s_t) Δθ←Δθ+α∇θlogπθ(at∣st)
-
最终更新参数:
θ←θ+ηΔθ \theta\leftarrow \theta + \eta \Delta \theta θ←θ+ηΔθ
这是最基本的 Policy Gradient 算法。
