Article
·14 min read

看懂强化学习:从试错学习到 DQN 与策略梯度

一篇给初学者的强化学习入门文章:从状态、动作、奖励和策略讲起,串起价值函数、贝尔曼方程、TD 学习、DQN 与策略梯度。

Reinforcement LearningDeep LearningAI

强化学习最迷人的地方,是它不像监督学习那样拿着一堆标准答案训练,而是让智能体自己去试、去犯错、去获得反馈,然后一点点学会“什么动作更值得做”。

这也是为什么它总让人联想到打游戏、训练机器人、自动驾驶,或者 AlphaGo 这种“会自己变强”的系统。可一旦真正去看论文或教程,很多人很快就会被一连串术语劝退:状态、动作、价值函数、贝尔曼方程、TD 学习、策略梯度、Actor-Critic。

这篇文章想做的事情很简单:不追求面面俱到,而是帮你把强化学习的主线看顺。看完以后,你至少会知道它到底在解决什么问题、常见算法之间是什么关系,以及 DQN 和策略梯度为什么会走出两条不同的路线。

强化学习到底在解决什么问题

可以把强化学习想成一个不断循环的过程:

  1. 智能体观察当前环境状态
  2. 根据自己的策略选择一个动作
  3. 环境返回奖励,并进入下一个状态
  4. 智能体根据这次结果调整自己的行为

目标不是“这一步拿到最高分”,而是让长期累计回报最大化。

这点非常重要,因为它决定了强化学习和很多直觉式决策的不同。一个动作此刻看起来不赚钱,可能是在为之后的更大奖励铺路;另一个动作现在很爽,却可能让后面一直吃亏。强化学习真正学的是长期决策。

先记住四个最核心的概念

1. 状态 State

状态表示环境在某个时刻的样子,通常记作 sSs \in \mathcal{S}

如果把问题想成玩游戏,状态可能是角色位置、血量、地图信息;如果是机器人控制,状态可能是关节角度、速度和传感器读数。

2. 动作 Action

动作表示智能体可以做什么,记作 aAa \in \mathcal{A}

比如向左走、向右走、刹车、加速、抓取、放下,都是动作。

3. 奖励 Reward

奖励是环境对动作的即时反馈,通常记作 rRr \in \mathcal{R}

拿到金币、赢下一局、走出迷宫,可以给正奖励;撞墙、跌倒、输掉比赛,可以给负奖励。奖励本身不是目标,它只是训练智能体的信号。

4. 策略 Policy

策略是智能体的行为规则,通常写作 π(as)\pi(a|s),也就是在状态 ss 下选择动作 aa 的概率分布。

如果策略是确定性的,也会写成 a=π(s)a = \pi(s);如果策略是可学习的神经网络,则常写成 πθ(as)\pi_\theta(a|s)

如果你只先记住一句话,那就是:

强化学习的目标,就是学出一个能够最大化长期回报的策略。

为什么大家总在讲“回报”和“价值”

即时奖励还不够,因为很多任务要看长期结果。于是强化学习会定义一个更重要的量:回报(Return)。

Gt=Rt+1+γRt+2+γ2Rt+3+=k=0γkRt+k+1G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1}

这里的 γ[0,1]\gamma \in [0,1] 是折扣因子,用来控制“未来奖励值多少钱”。

  • γ\gamma 越小,模型越短视,更在意眼前收益
  • γ\gamma 越大,模型越看重长期回报

有了回报,我们就可以定义“价值”。

状态价值函数

Vπ(s)=Eπ[GtSt=s]V_\pi(s) = \mathbb{E}_\pi\left[G_t \mid S_t = s\right]

它表示:在状态 ss 下,如果之后一直按照策略 π\pi 行动,期望能拿到多少长期回报。

动作价值函数

Qπ(s,a)=Eπ[GtSt=s,At=a]Q_\pi(s, a) = \mathbb{E}_\pi\left[G_t \mid S_t = s, A_t = a\right]

它表示:在状态 ss 先执行动作 aa,再继续按策略 π\pi 行动,最终期望能拿到多少长期回报。

两者之间有一个非常自然的关系:

Vπ(s)=aπ(as)Qπ(s,a)V_\pi(s) = \sum_a \pi(a|s) \cdot Q_\pi(s, a)

也就是说,状态价值就是所有可能动作价值的加权平均,权重由当前策略给出。

从直觉上说:

  • V 告诉你“这个局面本身值不值钱
  • Q 告诉你“在这个局面下,某个具体动作值不值钱

贝尔曼方程:为什么它是整个 RL 的地基

有了价值函数的定义,下一个问题自然是:怎么算出它来?

最直接的方法是从状态 ss 出发,把未来所有可能轨迹都展开,再求平均回报。但这在实际中几乎不可行,因为状态空间和未来路径都会迅速爆炸。

真正重要的观察是:回报本身就有递归结构

Gt=Rt+1+γGt+1G_t = R_{t+1} + \gamma G_{t+1}

把这个递归代入价值函数的定义,我们来一步步推导贝尔曼方程。

从价值函数的定义出发:

Vπ(s)=Eπ[GtSt=s]V_\pi(s) = \mathbb{E}_\pi[G_t \mid S_t = s]

代入 Gt=Rt+1+γGt+1G_t = R_{t+1} + \gamma G_{t+1}

Vπ(s)=Eπ[Rt+1+γGt+1St=s]V_\pi(s) = \mathbb{E}_\pi[R_{t+1} + \gamma G_{t+1} \mid S_t = s]

接下来要把期望展开。在状态 ss 下,智能体先按策略 π(as)\pi(a|s) 选动作 aa,执行后环境以概率 P(ss,a)P(s'|s,a) 转移到下一状态 ss',并给出即时奖励 R(s,a)R(s,a)。所以期望要对动作和下一状态分别求和:

Vπ(s)=aπ(as)sP(ss,a)[R(s,a)+γEπ[Gt+1St+1=s]]V_\pi(s) = \sum_a \pi(a|s) \sum_{s'} P(s'|s,a) \Big[R(s,a) + \gamma\,\mathbb{E}_\pi[G_{t+1} \mid S_{t+1} = s']\Big]

注意到 Eπ[Gt+1St+1=s]\mathbb{E}_\pi[G_{t+1} \mid S_{t+1} = s'] 正好就是 Vπ(s)V_\pi(s') 的定义,代入后得到:

Vπ(s)=aπ(as)sP(ss,a)[R(s,a)+γVπ(s)]V_\pi(s) = \sum_a \pi(a|s) \sum_{s'} P(s'|s,a) \Big[R(s,a) + \gamma\,V_\pi(s')\Big]

由于 R(s,a)R(s,a) 不依赖 ss',可以把它提出来,最终整理为贝尔曼方程

Vπ(s)=aπ(as)[R(s,a)+γsP(ss,a)Vπ(s)]\boxed{V_\pi(s) = \sum_a \pi(a|s)\left[R(s,a) + \gamma \sum_{s'} P(s'|s,a)V_\pi(s')\right]}

它说的是一件很朴素的事:

当前状态的价值 = 当前一步能拿到的奖励 + 下一状态价值的折现期望。

同样地,我们也可以推导出动作价值函数的递归形式。从 QπQ_\pi 的定义出发:

Qπ(s,a)=Eπ[GtSt=s,At=a]Q_\pi(s,a) = \mathbb{E}_\pi[G_t \mid S_t = s, A_t = a]

代入 Gt=Rt+1+γGt+1G_t = R_{t+1} + \gamma G_{t+1},注意这里动作 aa 已经确定,所以只需对下一状态 ss' 求期望:

Qπ(s,a)=sP(ss,a)[R(s,a)+γEπ[Gt+1St+1=s]]Q_\pi(s,a) = \sum_{s'} P(s'|s,a) \Big[R(s,a) + \gamma\,\mathbb{E}_\pi[G_{t+1} \mid S_{t+1} = s']\Big]

到了下一状态 ss' 后,智能体重新按策略选择动作 aa',所以 Vπ(s)=aπ(as)Qπ(s,a)V_\pi(s') = \sum_{a'}\pi(a'|s')Q_\pi(s',a')。代入得到:

Qπ(s,a)=R(s,a)+γsP(ss,a)aπ(as)Qπ(s,a)\boxed{Q_\pi(s,a) = R(s,a) + \gamma \sum_{s'} P(s'|s,a)\sum_{a'} \pi(a'|s')Q_\pi(s',a')}

如果我们关心最优策略,那么递归里不再是期望,而是直接选最优动作:

V(s)=maxa[R(s,a)+γsP(ss,a)V(s)]V^*(s) = \max_a \left[R(s,a) + \gamma \sum_{s'} P(s'|s,a)V^*(s')\right]

贝尔曼方程真正厉害的地方,在于它把“看完整个未来”的问题,变成了一个“只看一步”的递归关系。后面几乎所有 RL 算法,本质上都在用不同方式逼近这个关系。

常见算法,其实是在回答同一件事

很多人学 RL 时会被一堆算法名词打散。其实可以把它们看成同一条演化路径上的不同阶段。

动态规划:环境模型已知时的理想解法

如果你知道环境转移概率 P(ss,a)P(s'|s,a) 和奖励函数 R(s,a)R(s,a),就能直接用贝尔曼方程反复迭代。

核心流程通常是:

  1. 策略评估:先算出当前策略的价值
  2. 策略改进:根据价值函数改进策略
  3. 反复迭代直到收敛

它很优雅,但现实世界里往往拿不到完整环境模型,所以更多时候它像一个理论起点。

蒙特卡洛方法:等一整局结束再回头总结

蒙特卡洛方法不需要环境模型。它的做法很朴素:先完整跑完一轮 episode,再用最终回报回头估计状态或动作的价值。

优点是直观、无偏;缺点是更新太慢,而且方差通常比较大。你得等游戏打完,才能知道前面每一步大概值多少。

时序差分学习:边走边学

TD(Temporal Difference)学习的核心思想,是不用等整局结束,就在每一步用贝尔曼方程的单步近似来更新价值。

贝尔曼方程告诉我们:

Vπ(s)=E[Rt+1+γVπ(St+1)St=s]V_\pi(s) = \mathbb{E}\left[R_{t+1} + \gamma V_\pi(S_{t+1}) \mid S_t = s\right]

于是最基本的 TD 更新式就是:

V(St)V(St)+α[Rt+1+γV(St+1)V(St)]V(S_t) \leftarrow V(S_t) + \alpha \left[R_{t+1} + \gamma V(S_{t+1}) - V(S_t)\right]

其中

Rt+1+γV(St+1)R_{t+1} + \gamma V(S_{t+1})

通常叫作 TD Target,而

δt=Rt+1+γV(St+1)V(St)\delta_t = R_{t+1} + \gamma V(S_{t+1}) - V(S_t)

就是 TD Error

你可以把它理解成:用“下一步真实看到的反馈 + 对未来的当前估计”,持续修正自己对当前状态的判断。

为什么 SARSA 和 Q-Learning 总被拿来一起讲

这两个算法都属于 TD 家族,也都在学习动作价值函数 Q(s,a)Q(s,a),但更新方式略有不同。

SARSA:按照自己真实执行的动作来更新

Q(St,At)Q(St,At)+α[Rt+1+γQ(St+1,At+1)Q(St,At)]Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left[R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t)\right]

因为它使用的是下一时刻真实执行的动作 At+1A_{t+1},所以属于 On-Policy 方法。

Q-Learning:直接朝理论最优动作看齐

Q(St,At)Q(St,At)+α[Rt+1+γmaxaQ(St+1,a)Q(St,At)]Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left[R_{t+1} + \gamma \max_a Q(S_{t+1}, a) - Q(S_t, A_t)\right]

它不管下一步实际上做了什么,而是直接取下一状态的最大 Q 值,所以属于 Off-Policy。

这也是 Q-Learning 经典且强大的地方:哪怕行为策略还不够好,也能利用这些数据向更优策略逼近。

从表格到神经网络:为什么会出现 DQN

Q-Learning 在状态空间不大时很好用。可一旦状态变成图像、连续传感器信号,或者高维输入,就不可能再给每个状态-动作对维护一张表。

这时就会用神经网络去近似 Q 函数:

Q(s,a;θ)Q(s,a;\theta)

这就是 DQN(Deep Q-Network)的出发点。

DQN 之所以成为深度强化学习的代表性算法,很大程度上是因为它解决了“神经网络 + 强化学习”不稳定的问题。它主要依赖两个关键技巧:

  • 经验回放(Experience Replay):把交互样本存进 buffer,训练时随机采样,打破样本相关性
  • 目标网络(Target Network):使用一个延迟更新的旧网络来构造 TD Target,降低训练震荡

这两个技巧让 DQN 在 Atari 游戏上取得了里程碑式的结果,也让深度强化学习真正进入大众视野。

另一条路线:直接学习策略

到这里,前面的算法基本都属于“先学价值,再由价值推出动作”的路线。

但如果动作空间是连续的,或者 argmaxaQ(s,a)\arg\max_a Q(s,a) 本身就很难求,那么直接学习策略往往更自然。

策略梯度(Policy Gradient)直接参数化策略 πθ(as)\pi_\theta(a|s),并通过梯度上升来最大化期望回报:

J(θ)=Eτπθ[tRt]J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\left[\sum_t R_t\right]

策略梯度定理给出了它的核心优化形式。下面来一步步推导。

目标函数可以展开成对所有状态和动作的加权求和:

J(θ)=sdπθ(s)aπθ(as)Qπθ(s,a)J(\theta) = \sum_s d^{\pi_\theta}(s) \sum_a \pi_\theta(a|s)\, Q_{\pi_\theta}(s,a)

其中 dπθ(s)d^{\pi_\theta}(s) 是策略 πθ\pi_\theta 下的状态访问分布(stationary distribution),表示智能体在各个状态上待的时间比例。

怎么理解这个分布?想象智能体按照策略 πθ\pi_\theta 不断和环境交互,走了非常多步之后,统计它在每个状态出现的频率——这个频率就是 dπθ(s)d^{\pi_\theta}(s)。比如在一个迷宫里,如果策略总是让智能体在起点附近徘徊,那起点附近状态的 dπθ(s)d^{\pi_\theta}(s) 就很大;如果策略很高效地穿过迷宫,那沿途各状态会被更均匀地访问。

它在目标函数里的作用也很自然:我们关心的不只是"在某个状态下能拿到多少回报",还要乘以"这个状态实际上会被访问到多少次"。一个状态价值再高,如果策略根本不会走到那里,对总回报也没有贡献。所以 J(θ)J(\theta) 是对所有状态的回报做 dπθ(s)d^{\pi_\theta}(s) 加权的平均。

θ\theta 求梯度。策略梯度定理的一个关键结论是:虽然 dπθ(s)d^{\pi_\theta}(s)Qπθ(s,a)Q_{\pi_\theta}(s,a) 都依赖 θ\theta,但我们只需要对 πθ(as)\pi_\theta(a|s) 求导就够了(证明涉及状态分布的递归展开,这里略去):

θJ(θ)=sdπθ(s)aθπθ(as)Qπθ(s,a)\nabla_\theta J(\theta) = \sum_s d^{\pi_\theta}(s) \sum_a \nabla_\theta \pi_\theta(a|s)\, Q_{\pi_\theta}(s,a)

接下来用一个叫 log-derivative trick 的恒等式。对任意函数 f(x)f(x),有:

θf(θ)=f(θ)θlogf(θ)\nabla_\theta f(\theta) = f(\theta)\, \nabla_\theta \log f(\theta)

这一点很容易验证:因为 θlogf=θff\nabla_\theta \log f = \frac{\nabla_\theta f}{f},两边乘以 ff 就回来了。把它用在 πθ(as)\pi_\theta(a|s) 上:

θπθ(as)=πθ(as)θlogπθ(as)\nabla_\theta \pi_\theta(a|s) = \pi_\theta(a|s)\, \nabla_\theta \log \pi_\theta(a|s)

代入上式:

θJ(θ)=sdπθ(s)aπθ(as)θlogπθ(as)Qπθ(s,a)\nabla_\theta J(\theta) = \sum_s d^{\pi_\theta}(s) \sum_a \pi_\theta(a|s)\, \nabla_\theta \log \pi_\theta(a|s)\, Q_{\pi_\theta}(s,a)

注意到 sdπθ(s)aπθ(as)[]\sum_s d^{\pi_\theta}(s) \sum_a \pi_\theta(a|s)[\cdots] 正好就是在策略 πθ\pi_\theta 下对状态和动作求期望,所以最终得到策略梯度定理

θJ(θ)=Eπθ[θlogπθ(as)Qπθ(s,a)]\boxed{\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta}\left[\nabla_\theta \log \pi_\theta(a|s)\cdot Q_{\pi_\theta}(s,a)\right]}

这个公式背后的直觉非常清晰:

  • 如果某个动作带来的回报 QQ 很高,就增大 logπθ(as)\log \pi_\theta(a|s),也就是让策略更倾向选这个动作
  • 如果某个动作回报很低,梯度方向会让策略降低选它的概率

REINFORCE:最直接的策略梯度算法

策略梯度定理里需要 Qπθ(s,a)Q_{\pi_\theta}(s,a),但在实际训练中我们并不知道它的真实值。REINFORCE 的做法是最朴素的:直接用蒙特卡洛采样的实际回报 GtG_t 来替代。

因为 GtG_t 本身就是 Qπθ(st,at)Q_{\pi_\theta}(s_t, a_t) 的一个无偏估计(QQ 的定义就是 GtG_t 的期望),所以替换后梯度估计仍然是无偏的:

θJ(θ)t=0Tθlogπθ(atst)Gt\nabla_\theta J(\theta) \approx \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t)\cdot G_t

对应的参数更新规则就是:

θθ+αt=0Tθlogπθ(atst)Gt\theta \leftarrow \theta + \alpha \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t)\cdot G_t

整个算法流程非常简单:

  1. 用当前策略 πθ\pi_\theta 跑完一整条轨迹 (s0,a0,r1,s1,a1,r2,)(s_0, a_0, r_1, s_1, a_1, r_2, \ldots)
  2. 对每个时刻 tt,计算从该时刻起的实际回报 Gt=k=0Ttγkrt+k+1G_t = \sum_{k=0}^{T-t}\gamma^k r_{t+k+1}
  3. 用上面的公式更新参数 θ\theta
  4. 重复

REINFORCE 概念清楚,但有一个很大的缺点:方差太大。因为 GtG_t 是整条轨迹的累计回报,受到很多随机因素影响,不同轨迹之间的 GtG_t 波动可能非常大,导致梯度估计很不稳定。

一个常见的改进是引入 baseline,通常取状态价值函数 b(s)=V(s)b(s) = V(s)

θJ(θ)t=0Tθlogπθ(atst)(Gtb(st))\nabla_\theta J(\theta) \approx \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t)\cdot (G_t - b(s_t))

减去 baseline 不会改变梯度的期望(因为 baseline 不依赖动作),但能显著降低方差。直觉上,GtV(st)G_t - V(s_t) 衡量的是"这个动作比平均水平好多少",而不是"这个动作的绝对回报有多高",信号自然更稳定。

这个思路再往前走一步——用神经网络来学习 baseline V(s)V(s)——就自然过渡到了下面的 Actor-Critic 方法。

Actor-Critic:为什么很多现代算法都长这个样子

Actor-Critic 可以理解成把两条路线拼在一起:

  • Actor 负责输出策略,决定怎么做
  • Critic 负责评估当前状态或动作值,告诉 Actor 做得好不好

写成更新思路,大致就是:

θθ+αθlogπθ(as)A(s,a)\theta \leftarrow \theta + \alpha \nabla_\theta \log \pi_\theta(a|s)\cdot A(s,a)

其中优势函数通常定义为:

A(s,a)=Q(s,a)V(s)A(s,a) = Q(s,a) - V(s)

这样做的好处是:

  • 保留了策略梯度对连续动作的友好性
  • 又借助价值函数降低了训练方差

很多现代强化学习算法,本质上都能看作 Actor-Critic 框架的变种,比如 A2C、A3C、DDPG、PPO 等。

强化学习里还有一个永恒问题:探索还是利用

如果模型永远只选当前看来最优的动作,它可能会过早陷入局部最优;如果它总在乱试,又永远学不会稳定策略。

这就是强化学习里经典的探索-利用(Exploration vs. Exploitation)问题。

  • 利用:选择当前已知最好的动作
  • 探索:尝试新的动作,看看会不会更好

最常见的入门策略是 ε\varepsilon-greedy:

  • 以概率 ε\varepsilon 随机探索
  • 以概率 1ε1-\varepsilon 选择当前最优动作

它不一定最优,但足够直观,能帮助你建立对探索机制的第一层理解。

怎么快速记住这些方法的区别

方法需不需要环境模型怎么更新代表特点
动态规划需要反复迭代贝尔曼方程理论起点,现实里常不适用
蒙特卡洛不需要等整局结束再更新直观,但方差大
TD 学习不需要每一步都能更新边交互边学习
Q-Learning不需要用最大 Q 值更新Off-Policy,经典值函数方法
DQN不需要神经网络近似 Q 值把 Q-Learning 推到高维输入
策略梯度不需要直接优化策略更适合连续动作
Actor-Critic不需要策略和价值一起学现代 RL 的主流骨架

最后总结

如果把强化学习压缩成一条主线,可以这样记:

  1. 它研究的是如何通过与环境交互,学到长期最优策略
  2. 价值函数和贝尔曼方程提供了最基本的数学框架
  3. Q-Learning 和 DQN 代表“基于价值”的路线
  4. 策略梯度和 Actor-Critic 代表“直接学策略”的路线
  5. 真正的难点,不只是优化算法,还包括探索、稳定性和样本效率

当你把这条线看顺之后,再去读 PPO、SAC、DDPG 之类的现代算法,会轻松很多,因为你知道它们不是凭空冒出来的,而是在前面这些基本思想上的继续发展。

参考阅读:Lilian Weng 的 A (Long) Peek into Reinforcement Learning 依然是一篇非常值得反复回看的经典综述。