【高级机器学习】 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 强化学习的交互过程

智能体与环境交互的基本流程:

  1. 处于某个状态 St=stS_t = s_tSt=st
  2. 根据策略选择动作 At=atA_t = a_tAt=at
  3. 获得奖励 Rt=rtR_t = r_tRt=rt
  4. 转移到下一个状态 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^*π∗:

π∗=arg⁡max⁡π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+γmax⁡a′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+γmax⁡a′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+γmax⁡Qr + \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 的学习包含以下循环:

  1. 初始化 Q-table
  2. 从当前状态选择动作(通常结合 ϵ\epsilonϵ-greedy)
  3. 执行动作
  4. 获得奖励
  5. 更新 Q-table
  6. 回到步骤 2

经过大量迭代后,Q-table 会收敛得到近似最优策略。


11. Q-learning 算法(Off-policy)

Q-learning 更新规则:

Q(s,a)←Q(s,a)+η(r+γmax⁡a′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
    用 max⁡Q(s′,a′)\max Q(s',a')maxQ(s′,a′) 更新,但下一步动作不一定是选择该 a′a'a′;
  • 因此学习到的是"最优策略",而不是"实际执行的策略"。

伪代码要点:

  • 初始化 Q-table

  • 重复以下步骤直到 episode 结束:

    1. 选择动作 a=arg⁡max⁡Q(s,a)a=\arg\max Q(s,a)a=argmaxQ(s,a)
    2. 执行动作获得 (r,s′)(r,s')(r,s′)
    3. 更新 Q(s,a)Q(s,a)Q(s,a)
    4. 状态 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

学习的是当前策略,而不是最优策略。

伪代码流程:

  1. 初始化 Q
  2. 在状态 sss 下根据当前策略选动作 aaa
  3. 执行动作获得 (r,s′)(r, s')(r,s′)
  4. 在新状态 s′s's′ 下选动作 a′a'a′
  5. 用 Q(s′,a′)Q(s',a')Q(s′,a′) 更新
  6. 状态和动作同时更新为 (s′,a′)(s', a')(s′,a′)

13. On-policy 和 Off-policy 的核心区别

  • Sarsa 是 on-policy

    使用"实际执行的动作 a′a'a′"更新 Q 值

    也用该动作继续执行下一步

  • Q-learning 是 off-policy

    使用"理论最优动作 arg⁡max⁡a′Q(s′,a′)\arg\max_{a'}Q(s',a')argmaxa′Q(s′,a′)"更新

    下一步不要求执行这个动作

简化表达:

算法 更新用的动作 下一步动作 类型
Q-learning max⁡Q\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+γmax⁡a′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+γmax⁡a′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) 求
  • 不对 max⁡a′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 的步骤

  1. 收集经历(transition)
    (s,a,r,s′) (s,a,r,s') (s,a,r,s′)

  2. 存入经验池(Experience Bank)

  3. 每次训练时,从经验池随机采样 batch

  4. 对 batch 中样本计算 DQN loss:

(r+γmax⁡a′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+γmax⁡a′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 优先经验回放算法(简化版)

算法执行流程如下:

  1. 初始化 Q 网络参数 www

  2. 初始化经验池 B=∅B=\varnothingB=∅

  3. 对每一步:

    • 选动作 a=arg⁡max⁡aQw(s,a)a=\arg\max_a Q_w(s,a)a=argmaxaQw(s,a)
    • 观察 s′,rs',rs′,r
    • transition 存入 BBB,附带最高优先级
  4. 每隔 KKK 步:

    • 从 BBB 按优先级采样 (s,a,r,s′)(s,a,r,s')(s,a,r,s′)
    • 计算误差
    • 更新当前 transition 优先级
    • 梯度下降更新 www

## 4. Policy Gradient(策略梯度)

DQN 是 先学 Q 函数,再从 Q 推出策略

a=arg⁡max⁡aQ(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∣πθ]

目标:

θ∗=arg⁡max⁡θ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∇log⁡pp \nabla \log pp∇logp:

∇θp(τ;θ)=p(τ;θ)∇θlog⁡p(τ;θ) \nabla_\theta p(\tau;\theta) = p(\tau;\theta)\nabla_\theta \log p(\tau;\theta) ∇θp(τ;θ)=p(τ;θ)∇θlogp(τ;θ)

于是:

∇θJ(θ)=∫r(τ)p(τ;θ)∇θlog⁡p(τ;θ)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(τ)∇∗θlog⁡p(τ;θ)] \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)

取对数:

log⁡p(τ;θ)=∑t≥0[log⁡p(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θ 无关:

∇θlog⁡p(τ;θ)=∑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)算法

算法步骤如下:

  1. 初始化参数 θ\thetaθ

  2. 对每一个 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)
  3. 最终更新参数:
    θ←θ+ηΔθ \theta\leftarrow \theta + \eta \Delta \theta θ←θ+ηΔθ

这是最基本的 Policy Gradient 算法。

相关推荐
受之以蒙2 小时前
Rust ndarray 高性能计算:从元素操作到矩阵运算的优化实践
人工智能·笔记·rust
野生面壁者章北海2 小时前
NeurIPS 2024|大语言模型高保真文本水印新范式
人工智能·语言模型·自然语言处理
KG_LLM图谱增强大模型2 小时前
如何利用大语言模型(LLM)实现自动标注与内容增强
人工智能·知识管理·内容管理·本体论·图谱增强大模型·自动标签·大模型内容标注
数据与后端架构提升之路3 小时前
小鹏VLA 2.0的“神秘涌现”:从痛苦到突破,自动驾驶与机器人如何突然“开窍”?
人工智能·机器人·自动驾驶
fruge3 小时前
CANN核心特性深度解析:简化AI开发的技术优势
人工智能
沛沛老爹3 小时前
AI入门知识之RAFT方法:基于微调的RAG优化技术详解
人工智能·llm·sft·raft·rag
zskj_zhyl3 小时前
科技助老与智慧养老的国家级政策与地方实践探索
大数据·人工智能·科技
YangYang9YangYan3 小时前
职业本科发展路径与规划指南
大数据·人工智能·学习·数据分析
牛客企业服务4 小时前
2025年AI面试防作弊指南:技术笔试如何识别异常行为
人工智能·面试·职场和发展