【强化学习全景系列 之八】DQN:里程碑,让AI睁眼看世界,玩转雅达利游戏

发布于:2025-08-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

【强化学习全景系列 之八】

DQN:里程碑,让AI睁眼看世界,玩转雅达利游戏

在上一章,我们掌握了Q-Learning和SARSA这两把利器。它们是如此的优雅和强大,让我们相信,只要有足够的时间去探索,我们就能在任何一个有限的世界里找到最优的路径。我们学会了如何“摸着石头过河”,在“同策略”的稳重与“异策略”的远见之间做出选择。

但我们很快就会撞上一堵墙,一堵由现实世界的复杂性筑成的、看似无法逾越的高墙。我们手中的Q表格,这个看似万能的工具,在浩瀚的状态空间面前,显得如此脆弱和渺小。这,就是“维度诅咒”。

本章,我们将讲述一个激动人心的故事:当强化学习遇到了深度学习,当古老的Q-Learning思想被赋予了神经网络的强大“大脑”时,迸发出了怎样璀璨的火花。我们将深度剖析DQN,这个不仅能玩转雅达利(Atari)游戏,更奠定了整个深度强化学习领域基石的算法。我们将揭开它成功的两大核心“秘诀”,理解它们是如何驯服了这头曾经难以驾驭的“巨兽”。

【上一篇】【强化学习全景系列 之七】 Q-Learning vs. SARSA:通往最优策略的两条寻宝路


一、我们撞上的墙:Q表格的“维度诅咒”

到目前为止,我们所有关于价值学习的讨论,都建立在一个朴素的假设之上:我们可以用一张表格来存储所有状态-动作对的价值。这张Q表格,是智能体的大脑,是它的记忆核心。

  • 在走迷宫时:状态是智能体在网格中的位置(如 (行, 列)),动作是{上, 下, 左, 右}。如果是一个10x10的迷宫,那么Q表格的大小就是 ( 10 × 10 ) × 4 = 400 (10 \times 10) \times 4 = 400 (10×10)×4=400 个条目。这完全没问题。
  • 在玩井字棋时:状态是棋盘的布局。粗略估计,状态数量在几千个的量级。Q表格的大小大概是 3000 × 9 3000 \times 9 3000×9,也还在可控范围内。

但现在,让我们把目光投向一个稍微复杂一点,但依然非常古老的游戏——雅达利2600主机上的《太空入侵者》或《乓》(Pong)

这个游戏的“状态”是什么?是屏幕上显示的画面

让我们来算一笔账。雅达利游戏画面的原始分辨率是210x160像素。为了简化计算,DeepMind的论文中将其预处理为一张84x84的灰度图。

  • 一个像素的灰度值有256种可能(从0到255)。
  • 屏幕上总共有 84 × 84 = 7056 84 \times 84 = 7056 84×84=7056 个像素。
  • 那么,理论上可能存在的、独一无二的游戏画面(状态)总数是多少?答案是 256 7056 256^{7056} 2567056

这是一个什么概念?宇宙中所有原子的总数估计“只有” 10 80 10^{80} 1080 左右。而 256 7056 256^{7056} 2567056 这个数字,你甚至无法在任何一台计算机上完整地表示出来。为它建立一张Q表格,不仅是存储空间上的“不可能”,更是物理定律层面的“不可能”。

这就是维度诅咒 (Curse of Dimensionality)。当状态空间的维度(在这里是像素的数量)急剧增加时,总的状态数量会呈指数级爆炸,达到一个天文数字。

这张Q表格的崩溃,还带来了两个更深层次的问题:

  1. 无法学习:在如此浩瀚的状态空间中,智能体穷尽一生,也无法将所有状态访问一遍。绝大多数状态,它将永远遇不到。如果一个状态从未见过,那么Q表格中对应的条目就永远不会被更新,智能体面对这个新状态时将束手无策。
  2. 缺乏泛化 (Generalization):想象一下,在《太空入侵者》中,一个外星人向左移动了一个像素。对于人类玩家来说,这两个游戏画面几乎是一模一样的,我们采取的策略也应该基本相同。但对于Q表格来说,这是两个完全不同的、独立的、毫不相干的状态!它无法理解这两个状态之间的相似性,必须从零开始为这个“新”状态学习价值。这种死记硬背、缺乏举一反三的能力,是表格方法的根本缺陷。

我们需要的,不再是一个只能记录有限“地点”的地图,而是一个能够理解世界、触类旁通、举一反三的“智慧大脑”。它需要能够看到一个前所未见的游戏画面,并基于过去的经验,泛化出对当前情况的判断。

而这个“大脑”,就是深度神经网络


二、革命性的飞跃:用函数近似代替表格

当一个问题无法通过穷举来解决时,我们自然会想到用一个更紧凑、更通用的模型来近似它。

这个“啊哈!”时刻的想法是:我们能否抛弃Q表格,转而训练一个函数 Q ( s , a ) Q(s, a) Q(s,a)?我们输入一个状态 s s s 和一个动作 a a a,这个函数就能输出对应的Q值。更进一步,我们能否训练一个函数 Q ( s ) Q(s) Q(s),输入一个状态 s s s,它能一次性输出所有可能动作的Q值?

这个用来近似真正Q函数的函数,我们称之为函数近似器 (Function Approximator)。我们的目标,就是找到一个函数 Q ( s , a ; θ ) Q(s, a; \theta) Q(s,a;θ),其中 θ \theta θ 是这个函数的一组参数。通过调整 θ \theta θ,我们希望让这个函数无限逼近真实的、我们无法存储的 Q ∗ ( s , a ) Q^*(s, a) Q(s,a)
Q ( s , a ; θ ) ≈ Q ∗ ( s , a ) Q(s, a; \theta) \approx Q^*(s, a) Q(s,a;θ)Q(s,a)
用什么函数来做近似器呢?

  • 线性函数:我们可以用一个简单的线性模型 Q ( s , a ; θ ) = θ T ϕ ( s , a ) Q(s, a; \theta) = \theta^T \phi(s, a) Q(s,a;θ)=θTϕ(s,a),其中 ϕ ( s , a ) \phi(s, a) ϕ(s,a) 是从状态-动作对中提取的一组特征。这在一些简单问题上有效,但对于像图像这样复杂的、非线性的输入,线性模型的能力远远不够。
  • 深度神经网络 (Deep Neural Network, DNN):根据万能近似定理,一个足够大的神经网络可以以任意精度近似任何连续函数。它强大的非线性表达能力,使其成为处理复杂输入的完美候选者。特别是卷积神经网络 (Convolutional Neural Network, CNN),它被专门设计用来处理图像数据,能够自动从原始像素中逐层提取从边缘、纹理到具体形状的特征。

于是,一个伟大的构想诞生了:用一个深度卷积神经网络来扮演Q函数的角色。 这,就是深度Q网络 (Deep Q-Network, DQN) 的核心。

DQN的架构

一个典型的DQN网络架构如下:

  1. 输入:为了捕捉游戏中的动态信息(比如小球的运动方向),DQN的输入通常不是单张游戏画面,而是最近的4帧(84x84x4)叠在一起。
  2. 卷积层:输入首先经过几个卷积层。这些卷积核像一个个小小的“特征探测器”,在图像上滑动,以识别出游戏中的关键模式,如小球、挡板、砖块、敌人等。
  3. 全连接层:卷积层提取出的高级特征图被展平,然后送入几个全连接层,对这些特征进行整合与分析。
  4. 输出:网络的输出层是一个全连接层,其神经元的数量等于游戏中可能动作的数量。例如,在《乓》中,可能有6个动作(如上、下、左、右、左上、右下),输出层就有6个神经元。关键在于,第 i i i 个输出神经元的值,就代表了在当前输入状态下,采取第 i i i 个动作的Q值

这种设计非常高效,因为我们只需要让网络进行一次前向传播,就能得到当前状态下所有动作的Q值,方便我们从中选择价值最大的那个动作( max ⁡ a Q ( s , a ) \max_a Q(s, a) maxaQ(s,a))。

如何训练DQN?—— 借用Q-Learning的灵魂

我们有了一个网络 Q ( s , a ; θ ) Q(s, a; \theta) Q(s,a;θ),如何调整它的参数 θ \theta θ 呢?答案是回到我们熟悉的Q-Learning。

Q-Learning的更新规则是:
Q ( S t , A t ) ← Q ( S t , A t ) + α [ R t + 1 + γ max ⁡ a ′ Q ( S t + 1 , a ′ ) ⏟ 我们期望的目标值 (TD Target) − Q ( S t , A t ) ⏟ 我们当前的预测值 ] Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left[ \underbrace{R_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a')}_{\text{我们期望的目标值 (TD Target)}} - \underbrace{Q(S_t, A_t)}_{\text{我们当前的预测值}} \right] Q(St,At)Q(St,At)+α 我们期望的目标值 (TD Target) Rt+1+γamaxQ(St+1,a)我们当前的预测值 Q(St,At)
这个公式给了我们一个完美的监督信号。我们可以把它看作一个监督学习问题:

  • 输入 (Input):状态 S t S_t St
  • 预测 (Prediction):网络对采取动作 A t A_t At 的Q值估计,即 Q ( S t , A t ; θ ) Q(S_t, A_t; \theta) Q(St,At;θ)
  • 目标 (Target / Label):我们通过Q-Learning思想计算出的TD目标,即 y t = R t + 1 + γ max ⁡ a ′ Q ( S t + 1 , a ′ ; θ ) y_t = R_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a'; \theta) yt=Rt+1+γmaxaQ(St+1,a;θ)

我们希望“预测”尽可能地接近“目标”。在深度学习中,衡量这种差距的工具就是损失函数 (Loss Function)。一个自然的选择是均方误差 (Mean Squared Error, MSE)
L ( θ ) = E ( s , a , r , s ′ ) ∼ D [ ( r + γ max ⁡ a ′ Q ( s ′ , a ′ ; θ ) ⏟ TD Target − Q ( s , a ; θ ) ⏟ Prediction ) 2 ] L(\theta) = \mathbb{E}_{(s,a,r,s') \sim \mathcal{D}} \left[ \left( \underbrace{r + \gamma \max_{a'} Q(s', a'; \theta)}_{\text{TD Target}} - \underbrace{Q(s, a; \theta)}_{\text{Prediction}} \right)^2 \right] L(θ)=E(s,a,r,s)D TD Target r+γamaxQ(s,a;θ)Prediction Q(s,a;θ) 2
有了损失函数,我们就可以使用深度学习中强大的随机梯度下降 (Stochastic Gradient Descent, SGD) 及其变体(如Adam),通过反向传播算法来计算损失函数对网络权重 θ \theta θ 的梯度,并沿着梯度的反方向更新权重,从而让损失越来越小。


三、难以驾驭的巨兽:为何简单的DQN会失败?

理论上,上述框架看起来天衣无缝。然而,如果你真的去实现这个“朴素”的DQN,你会发现训练过程极度不稳定,损失函数剧烈震荡,网络性能可能还不如随机策略,甚至完全发散。

为什么会这样?因为我们鲁莽地将强化学习的组件直接嫁接到深度学习的框架上,却忽略了两者之间两个根本性的冲突。这头由RL和DL结合而成的“巨兽”,在被驯服之前,狂野而危险。

冲突一:数据的剧毒——高度相关性

标准的监督学习算法,如SGD,其有效性的一个核心前提是:训练数据是独立同分布的 (independent and identically distributed, i.i.d.)。这意味着每一个数据样本都是从一个固定的分布中独立抽取的。比如在图像分类中,训练集里的每张猫的图片都与其他图片无关。

但在强化学习中,我们的数据是如何产生的?是通过智能体与环境的连续交互。这意味着,我们采集到的经验序列 ( S t , A t , R t + 1 , S t + 1 ) , ( S t + 1 , A t + 1 , R t + 2 , S t + 2 ) , … (S_t, A_t, R_{t+1}, S_{t+1}), (S_{t+1}, A_{t+1}, R_{t+2}, S_{t+2}), \dots (St,At,Rt+1,St+1),(St+1,At+1,Rt+2,St+2), 之间存在极强的时间相关性 (temporal correlation)

  • S t + 1 S_{t+1} St+1 S t S_t St 的画面可能只差了几个像素的移动。
  • 如果智能体在一个区域里“卡关”了,它可能会在很长一段时间内反复采集到非常相似的经验。

用这样高度相关的数据去训练神经网络,会带来灾难性的后果:

  • 低效学习:网络会反复看到相似的数据,导致梯度方向非常片面,学习效率低下。
  • 灾难性遗忘 (Catastrophic Forgetting):网络会迅速过拟合到最近的一段经验上。比如,它刚刚在游戏左侧玩了一百步,可能会完全忘记游戏右侧的玩法。

这就像教一个孩子学英语,不是让他读一本包罗万象的词典,而是让他把“The cat sat on the mat”这句话连续读上一百万遍。他或许能把这句话背得滚瓜烂熟,但对整个英语世界依然一无所知。

冲突二:目标的幻影——追逐移动的目标

再回来看我们的损失函数:
L ( θ ) = E [ ( Target − Prediction ) 2 ] L(\theta) = \mathbb{E} \left[ ( \text{Target} - \text{Prediction} )^2 \right] L(θ)=E[(TargetPrediction)2]
其中,Target y t = R t + 1 + γ max ⁡ a ′ Q ( S t + 1 , a ′ ; θ ) y_t = R_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a'; \theta) yt=Rt+1+γmaxaQ(St+1,a;θ),而 Prediction 是 Q ( S t , A t ; θ ) Q(S_t, A_t; \theta) Q(St,At;θ)

问题出在哪里?问题在于,我们用来计算目标的那个Q函数,和我们正在更新的预测的Q函数,是同一个网络(都使用参数 θ \theta θ)。

这会产生一种致命的“追逐自己尾巴”的效应:

  1. 在一步更新中,我们调整了权重 θ \theta θ,目的是让预测值 Q ( S t , A t ; θ ) Q(S_t, A_t; \theta) Q(St,At;θ) 更靠近目标值 y t y_t yt
  2. 但是,由于我们改变了 θ \theta θ,计算目标值 y t y_t yt 所依赖的 Q ( S t + 1 , a ′ ; θ ) Q(S_{t+1}, a'; \theta) Q(St+1,a;θ)同时发生了变化!
  3. 这意味着,我们每朝着目标迈出一步,目标本身也移动了位置。

这就像一个新手狙击手在瞄准一个同样在不停晃动的靶子。这种不稳定的追逐关系很容易导致策略的剧烈震荡,使得训练过程难以收敛。


四、驯服巨兽的缰绳:DQN的两大“秘诀”

面对这两个看似无解的难题,DeepMind的论文提出了两个天才般的、后来被证明是深度强化学习基石的解决方案。正是这两把“缰绳”,成功地驯服了DQN这头巨兽。

秘诀一:经验回放 (Experience Replay) —— 打破时间的枷锁

为了解决数据相关性的问题,DQN引入了一个名为经验回放池 (Replay Buffer 或 Replay Memory) 的机制。

  • 是什么? 这是一个巨大的、先进先出的有界队列(比如可以存储最近的100万个经验)。智能体与环境交互产生的每一个经验元组 ( S t , A t , R t + 1 , S t + 1 ) (S_t, A_t, R_{t+1}, S_{t+1}) (St,At,Rt+1,St+1) 都被存储到这个“池子”里。
  • 怎么用? 在训练网络时,我们不再使用刚刚产生的那个经验。相反,我们从经验池中随机采样一个小批量 (mini-batch) 的经验(比如32个)来进行训练。
  • 为什么有效?
    1. 打破数据相关性:通过随机采样,一个mini-batch中的数据可能来自于完全不同的时间点和游戏场景。一个经验可能来自游戏初期,另一个来自五分钟前的某次“险象环生”,还有一个来自刚刚的平稳阶段。这样,训练数据就近似于独立同分布了,极大地稳定了训练过程。这就像教孩子学英语,我们不再让他重复读一句话,而是从一本巨大的图书馆里随机抽取不同的句子来让他学习。
    2. 提高数据利用率:每一个经验都可以被重复使用多次,而不是像在线学习那样用完即弃。一些稀有但重要的经验(比如一次成功的躲避,或者发现了一个隐藏奖励)会被存储在池中,有机会在未来的训练中被反复“回味”,从而强化网络对这些关键时刻的记忆。

经验回放机制,巧妙地将强化学习的“在线”决策过程与监督学习的“离线”训练过程解耦,是DQN能够稳定学习的第一个,也是最重要的支柱。

秘诀二:固定Q目标网络 (Fixed Q-Targets) —— 稳住移动的靶心

为了解决“移动目标”问题,DQN引入了第二个绝妙的技巧:使用两个神经网络。

  1. 在线网络 (Online Network):这就是我们一直在讨论的、主要负责决策和学习的网络,其参数为 θ \theta θ。我们每一步都会训练和更新它的参数。
  2. 目标网络 (Target Network):这是在线网络的一个副本,拥有完全相同的结构,其参数为 θ − \theta^- θ
  • 是什么? 目标网络的作用只有一个:专门用来计算TD目标中的 Q ( S t + 1 , a ′ ) Q(S_{t+1}, a') Q(St+1,a) 部分
  • 怎么用?
    • 在计算损失函数时,预测值由“在线网络”产生,而目标值由“目标网络”产生:
      L ( θ ) = E ( s , a , r , s ′ ) ∼ D [ ( r + γ max ⁡ a ′ Q ( s ′ , a ′ ; θ − ) ⏟ 由【目标网络】计算,是稳定的 − Q ( s , a ; θ ) ⏟ 由【在线网络】计算 ) 2 ] L(\theta) = \mathbb{E}_{(s,a,r,s') \sim \mathcal{D}} \left[ \left( \underbrace{r + \gamma \max_{a'} Q(s', a'; \theta^-)}_{\text{由【目标网络】计算,是稳定的}} - \underbrace{Q(s, a; \theta)}_{\text{由【在线网络】计算}} \right)^2 \right] L(θ)=E(s,a,r,s)D 由【目标网络】计算,是稳定的 r+γamaxQ(s,a;θ)由【在线网络】计算 Q(s,a;θ) 2
    • 目标网络的参数 θ − \theta^- θ 不会在每一步都更新。它会被冻结一段时间(比如10000步)。在这段时间里,TD目标是固定的。
    • 每隔一个固定的周期(比如C=10000步),我们才将在线网络的最新权重完全复制给目标网络,即执行一次 θ − ← θ \theta^- \leftarrow \theta θθ。然后,目标网络再次被冻结,进入下一个周期。
  • 为什么有效?
    通过这种方式,我们在一段时间内将“靶心”固定住了。在线网络有了一段充足的时间去追逐一个静止的目标,这使得学习过程变得稳定得多。当在线网络学习得差不多了,我们再把靶心移动到新的位置,然后再次固定。这种“走走停停”的方式,有效地打破了更新过程中的震荡循环,是DQN能够稳定收敛的第二个重要支柱。

五、DQN算法全流程解析

结合了经验回放固定Q目标两大“法宝”后,完整的DQN算法流程如下:

  1. 初始化

    • 初始化一个容量为 N N N 的经验回放池 D \mathcal{D} D
    • 用随机权重 θ \theta θ 初始化在线网络 Q Q Q
    • 用同样的权重初始化目标网络 Q ^ \hat{Q} Q^,即 θ − ← θ \theta^- \leftarrow \theta θθ
  2. 主循环(对每一个回合 Episode)
    a. 获取游戏的初始状态 s 1 s_1 s1(通常是经过预处理的几帧图像)。
    b. 循环(对回合中的每一步 t = 1 , 2 , … , T t=1, 2, \dots, T t=1,2,,T
    i. 选择动作:根据当前状态 s t s_t st,使用 ϵ \epsilon ϵ-贪心策略选择一个动作 a t a_t at
    * 以 1 − ϵ 1-\epsilon 1ϵ 的概率,选择 a t = arg ⁡ max ⁡ a Q ( s t , a ; θ ) a_t = \arg\max_a Q(s_t, a; \theta) at=argmaxaQ(st,a;θ)
    * 以 ϵ \epsilon ϵ 的概率,随机选择一个动作。
    ii. 执行动作:在模拟器中执行动作 a t a_t at,获得奖励 r t r_t rt 和下一个状态 s t + 1 s_{t+1} st+1
    iii. 存储经验:将经验元组 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1) 存入经验回放池 D \mathcal{D} D
    iv. 采样训练
    * 从 D \mathcal{D} D 中随机采样一个mini-batch的经验 { ( s j , a j , r j , s j + 1 ) } j = 1 M \{(s_j, a_j, r_j, s_{j+1})\}_{j=1}^M {(sj,aj,rj,sj+1)}j=1M
    * 对这个mini-batch中的每一个经验,计算其TD目标 y j y_j yj
    y j = { r j 如果  s j + 1  是终止状态 r j + γ max ⁡ a ′ Q ^ ( s j + 1 , a ′ ; θ − ) 否则 y_j = \begin{cases} r_j & \text{如果 } s_{j+1} \text{ 是终止状态} \\ r_j + \gamma \max_{a'} \hat{Q}(s_{j+1}, a'; \theta^-) & \text{否则} \end{cases} yj={rjrj+γmaxaQ^(sj+1,a;θ)如果 sj+1 是终止状态否则
    * 计算损失函数 L ( θ ) = 1 M ∑ j = 1 M ( y j − Q ( s j , a j ; θ ) ) 2 L(\theta) = \frac{1}{M} \sum_{j=1}^M (y_j - Q(s_j, a_j; \theta))^2 L(θ)=M1j=1M(yjQ(sj,aj;θ))2
    * 对在线网络的参数 θ \theta θ 执行一步梯度下降来最小化该损失。
    v. 更新目标网络:每隔 C C C 步,将在线网络的权重复制给目标网络: θ − ← θ \theta^- \leftarrow \theta θθ

  3. 回合结束,返回步骤2,开始新的回合。


本章小结与下期预告

本章,我们见证了强化学习发展史上的一个伟大里程碑——DQN的诞生。它如同一道闪电,照亮了因“维度诅咒”而陷入黑暗的RL世界。

  • 核心思想:用一个深度卷积神经网络来近似Q函数,从而打破Q表格的存储和泛化限制,让智能体能够直接从高维的像素输入中学习。
  • 面临的挑战:直接结合DL和RL会导致训练极其不稳定,主要源于数据相关性移动目标两大问题。
  • 两大“秘诀”:DQN通过引入经验回放池来打破数据相关性,并通过使用固定的Q目标网络来稳定学习目标。正是这两大创新,成功地驯服了深度强化学习这头“巨兽”。
  • 历史意义:DQN是第一个在多种复杂的控制任务(雅达利游戏)上,直接从原始感官输入学习,并达到甚至超越人类水平的通用算法。它雄辩地证明了深度强化学习的可行性与巨大潜力,引爆了此后至今的深度RL研究热潮。

DQN让AI第一次真正“睁眼”看到了这个像素化的世界,并学会了如何在其中生存和游戏。它的成功是震撼性的,但它远非完美。这位初生的“游戏天才”依然存在一些固有的缺陷:

  • 它倾向于系统性地高估Q值,这可能会导致学习到次优策略。
  • 它的经验回放机制是均匀采样的,没有区分经验的“重要性”。
  • 它的网络结构设计,是否还有优化的空间?

DQN打开了一扇大门,门后的世界广阔无垠。无数的研究者沿着它开辟的道路继续前行,发展出了一系列更强大、更稳定的改进算法。

在下一章,我们将聚焦于DQN的这些“子孙后代”。我们将看到,如何通过一个小小的改动来解决Q值过估计问题(Double DQN),以及如何通过精妙的网络结构设计来提升学习效率(Dueling DQN)。我们将见证,DQN的家族是如何一步步演化,变得更加强大和聪明的。敬请期待!


网站公告

今日签到

点亮在社区的每一天
去签到