【高级机器学习】 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 算法。

相关推荐
@小匠3 小时前
Read Frog:一款开源的 AI 驱动浏览器语言学习扩展
人工智能·学习
山间小僧5 小时前
「AI学习笔记」RNN
机器学习·aigc·ai编程
网教盟人才服务平台6 小时前
“方班预备班盾立方人才培养计划”正式启动!
大数据·人工智能
芯智工坊7 小时前
第15章 Mosquitto生产环境部署实践
人工智能·mqtt·开源
菜菜艾7 小时前
基于llama.cpp部署私有大模型
linux·运维·服务器·人工智能·ai·云计算·ai编程
TDengine (老段)7 小时前
TDengine IDMP 可视化 —— 分享
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·时序数据
小真zzz7 小时前
搜极星:第三方多平台中立GEO洞察专家全面解析
人工智能·搜索引擎·seo·geo·中立·第三方平台
GreenTea8 小时前
从 Claw-Code 看 AI 驱动的大型项目开发:2 人 + 10 个自治 Agent 如何产出 48K 行 Rust 代码
前端·人工智能·后端
火山引擎开发者社区8 小时前
秒级创建实例,火山引擎 Milvus Serverless 让 AI Agent 开发更快更省
人工智能