Deep-Q-learning (DQN)
环境
与环境有关,简单的环境中,state的可选个数(state space)是有限的, (16 different states for FrozenLake-v1 and 500 for Taxi-v3),但是对于大部分都环境,State space 非常大,比如 10^9 到 10^11 个可选state。如此以来,更新 Q-table 就会非常低效。
所以最好的方法是使用一个参数化的 Q-function( Qθ(s,a),theta 是网络参数 )来估计 Q-value。
Deep Q-learning,不适用 Q-table ,而是通过一个NN,这个NN 根据一个state,给出这个 state 时不同 Action 的Q-value。
![]() |
|---|
| Q vs deep Q |
Loss function
创建一个损失函数,比较 Q-value预测 和 Q-target,并使用梯度下降来更新深度 Q 网络的权重以更好地近似 Q-value。
![]() |
|---|
| Q-loss 这样计算 |
相同与Q-learning
还是会用到 epsilon-greedy policy 确定在当前 state 执行哪个Action。
输入预处理
减少不必要的计算量,减少输入的不必要信息。通常,讲reduce frame 的尺寸,并且讲frame 灰度化(这个场景下,颜色并不会指导Agent的行为,反而增加不用计算量)。即将RGB 3通道改为1个通道。
Temporal Limitation
接着处理输入,将减少信息了的 input 堆叠到一起。为什么这样做?为了处理 Temporal Limitation。
什么意思?一帧图像不能给你位置信息,至少通过 2、3 帧才能获得方向信息。(神经网络如何处理方向信息?)
神经网络
这个神经网络包含一个卷积层 + 若干个全链接层,如此才能输出在某一个state时,每个Action的 Q-value。
Q-target 和 当前 Q-value 之间的相关性
我们想要计算TD误差(即损失)时,我们计算Q目标与当前Q值之间的差异(对Q的估计)。
问题是,我们使用相同的参数(权重)来估计TD目标和Q值时,这导致,TD目标与我们要改变的参数之间存在显著的相关性。打个比方,就像是 在训练的每一步,我们的Q值和目标值都在变化。我们正在接近我们的目标,但目标也在移动。
这个问题会通过 双重深度 Q 网络 解决。想见下。
Deep-Q-Algorithm
Deep Q-Learning (DQN) 训练算法的两个主要阶段:采样 (Sampling) 和 训练 (Training)
![]() |
|---|
| Deep-Q-Algorithm |
1. 采样 (Sampling):
目的:
- 通过与环境交互,收集经验数据,用于后续的训练。
过程:
- Agent 在当前状态下,根据某种策略 (例如 ε-greedy 策略) 选择一个动作。
- Agent 执行该动作,与环境交互,观察到奖励 (reward) 和下一个状态 (next state)。
- 将 (状态, 动作, 奖励, 下一个状态) 作为一个经验元组 (experience tuple) 存储到回放记忆 (replay memory) 中。
- 重复以上步骤,直到收集到足够多的经验。
- 所以这里的“下一个状态” 是阶段性学习到的东西。
回放记忆 (Replay Memory):
回放记忆是一个缓冲区,用于存储 Agent 与环境交互的经验元组。
回放记忆通常有一个容量上限,当存储的经验元组数量超过容量上限时,会移除最早的经验元组。
回放记忆的作用是:
- 打破经验之间的相关性: 连续的经验通常是相关的,如果直接使用这些经验来训练网络,会导致训练不稳定。通过随机抽取经验,可以打破经验之间的相关性。
- 提高样本利用率: 同一个经验可以被多次使用,从而提高样本利用率。
- 避免 灾难性遗忘。
2. 训练 (Training):
目的:
- 使用采样阶段收集到的经验数据,更新神经网络的参数,使得神经网络能够更准确地估计 Q 值。
过程:
- 从回放记忆中随机选择一小批 (mini-batch) 经验元组。
- 对于每个经验元组
(s, a, r, s'),计算 TD 目标 (TD target):TD_target = r + γ * max_a' Q(s', a'; θ)。 - 计算损失函数 (loss function),例如均方误差 (mean squared error):
loss = (TD_target - Q(s, a; θ))^2。 - 使用梯度下降 (gradient descent) 算法,更新神经网络的参数,使得损失函数最小化。
- 重复以上步骤,直到训练完成。
梯度下降 (Gradient Descent):
- 梯度下降是一种优化算法,用于寻找损失函数的最小值。
- 梯度下降通过计算损失函数对参数的梯度,并沿着梯度的反方向更新参数,从而使得损失函数逐渐减小。
两个阶段的形式
交替式:在循环的每一步中,先采样后训练,更适合于在线学习 (online learning),Agent 可以根据最新的经验来更新策略。
分阶段式:先循环采样,后循环训练,更适合于离线学习 (offline learning),可以充分利用已有的数据来训练网络。
Deep Q-learning 训练中的不稳定性
原因:
- 非线性函数近似 (Non-linear Function Approximation): DQN 使用神经网络来近似 Q 函数,而神经网络是非线性模型。非线性模型在训练过程中容易出现不稳定现象,例如梯度消失、梯度爆炸等。
- 自举 (Bootstrapping): DQN 使用自举的方法来更新 Q 值,即使用 Q 值来估计 Q 值。这种方法容易导致误差累积,从而影响训练的稳定性。
- TD 目标的移动性 (Moving Target): DQN 使用 TD 目标来更新 Q 值,而 TD 目标本身也是通过神经网络估计的。由于神经网络的参数在不断更新,TD 目标也在不断变化,这使得训练过程变得不稳定。
- 经验相关性 (Correlation of Experiences): Agent 与环境交互产生的经验通常是相关的,如果直接使用这些经验来训练网络,会导致训练不稳定。
- 灾难性遗忘
在传统的在线强化学习中,智能体与环境交互,获取经验(状态、动作、奖励、下一个状态),然后立即用这些经验更新神经网络,并丢弃这些经验 。如果智能体连续遇到新的经验序列,神经网络可能会倾向于忘记之前的经验,尤其是在新经验与旧经验差异较大时。例如,智能体先在一个关卡中训练,然后进入另一个完全不同的关卡,它可能会忘记如何在第一个关卡中行动。
解决方法是经验回放:经验回放机制维护一个回放缓冲区(Replay Buffer),用于存储智能体与环境交互产生的经验元组 (state, action, reward, next state, done)。在训练时,从回放缓冲区中随机抽取一批经验样本来更新 Q 网络 。这样,网络就不会只学习最近的经验,而是可以从过去的经验中学习,从而避免灾难性遗忘
表现:
- Q 值震荡 (Oscillation):Q 值在真实值附近震荡,难以收敛。
- Q 值发散 (Divergence):Q 值不断增大或减小,最终导致训练失败。
- 策略不稳定 (Unstable Policy):Agent 的策略在训练过程中不断变化,难以找到最优策略。
不稳定性的解决方案: 为了解决 DQN 训练过程中的不稳定性问题,通常采用以下三种解决方案:
方案一:经验回放 (Experience Replay):
目的:打破经验之间的相关性,提高样本利用率。
原理:
- 将 Agent 与环境交互的经验 (状态、动作、奖励、下一个状态) 存储在一个回放缓冲区中。
- 在更新 Q 值时,从回放缓冲区中随机抽取一批经验来训练网络。而不是马上扔掉这个经验。
优点:
- 打破经验之间的相关性,减少 TD 目标的变化。
- 提高样本利用率,同一个经验可以被多次使用。
- 平滑数据分布,减少训练过程中的方差。
方案二:固定 Q 目标 (Fixed Q-Target):
目的: 稳定 TD 目标,减少 TD 目标和参数之间的相关性。
原理:
- 使用两个神经网络:一个用于估计当前的 Q 值 (Q 网络),另一个用于估计 TD 目标 (目标网络)。
- 目标网络的参数定期从 Q 网络的参数复制过来,但更新频率较低。
优点:
- 使得 TD 目标在一段时间内保持稳定,减少 TD 目标和参数之间的相关性。
- 提高训练的稳定性,减少 Q 值震荡和发散的风险。
方案三:双重深度 Q 网络 (Double Deep Q-Learning):
目的: 解决 Q 值过估计 (Overestimation) 问题。
原理:
- 在计算 TD 目标时,使用 Q 网络选择动作。使用目标网络估计 Q 值。
- 这样可以减少 Q 值过估计带来的偏差。
优点:
- 减少 Q 值过估计,提高策略的准确性。
- 提高训练的稳定性,减少 Q 值震荡和发散的风险。
除了上述三种解决方法,还有:
- Prioritized Experience Replay
- Dueling Deep Q-Learning
Double DQN
Double DQN 帮助我们减少Q值的过度估计,因此它可以帮助我们更快、更稳定地训练。
Q 网络 (Q-Network / Online Network / Policy Network):
作用:
选择动作 (Action Selection): 用于在给定状态下选择最优的动作。
更新参数 (Parameter Update): 用于根据 TD 目标更新自身的参数。
具体来说:
- 在给定状态
s下,Q 网络会输出每个动作a对应的 Q 值Q(s, a; θ),其中θ是 Q 网络的参数。 - 根据某种策略 (例如 ε-greedy 策略),选择 Q 值最大的动作
a* = argmax_a Q(s, a; θ)。 - 在计算 TD 目标时,Q 网络用于选择下一个状态
s'下的最优动作a' = argmax_a' Q(s', a'; θ)。 - 根据 TD 目标和 Q 网络的输出,计算损失函数,并使用梯度下降算法更新 Q 网络的参数
θ。
- 在给定状态
目标网络 (Target Network):
作用:估计 TD 目标 (TD Target Estimation): 用于估计 TD 目标中的 Q 值,从而稳定训练过程。
具体来说:
- 在计算 TD 目标时,目标网络用于估计下一个状态
s'下,采取动作a'的 Q 值Q(s', a'; θ'),其中θ'是目标网络的参数。 - TD 目标的计算公式为:
TD_target = r + γ * Q(s', argmax_a' Q(s', a'; θ); θ'),注意这里使用了 Q 网络选择的动作argmax_a' Q(s', a'; θ),但使用了目标网络估计的 Q 值Q(s', a'; θ')。 - 目标网络的参数
θ'定期从 Q 网络的参数θ复制过来,但更新频率较低,例如每隔 N 步更新一次。
- 在计算 TD 目标时,目标网络用于估计下一个状态
将动作选择和 Q 值估计分离,从而减少 Q 值过估计带来的偏差
【再理解吧】
DQN 的extension
Prioritized Experience Replay && Dueling Deep Q-Learning
KAQ 1. 灾难性遗忘中,agent 已经在这一步中学习到了,丢其这些经验为什么不行?经验是以什么形式存储的?
神经网络的权重更新:DQN 使用神经网络来近似 Q 函数。神经网络通过梯度下降算法来更新权重,以最小化预测 Q 值与目标 Q 值之间的误差。每次更新都会调整网络的权重,使其更好地拟合当前的训练数据。
在没有经验回放的情况下,DQN 采用在线学习的方式,即每获得一个新经验,就立即用它来更新网络。这种方式的问题在于,神经网络的权重会不断地被最近的经验所调整,而逐渐忘记之前的经验。经验表现在权值中。
如果智能体最初学习了如何向左走以获得奖励,然后开始学习如何向右走,那么神经网络可能会调整权重,使得向右走的 Q 值变高,而向左走的 Q 值变低,从而导致智能体忘记了如何向左走。
在强化学习中,智能体与环境交互产生的数据分布是不断变化的。如果只使用最近的经验来训练网络,那么网络可能会过拟合当前的数据分布,而无法泛化到其他状态。
KAQ 2. 为什么会遗忘之前的经验?
梯度更新的局部性:每次梯度更新只会影响神经网络中与当前经验相关的权重。如果某个权重对于之前的经验很重要,但与当前的经验无关,那么这个权重可能会逐渐被调整到不适合之前的经验的值。
学习率的影响:学习率控制着每次权重更新的幅度。如果学习率过大,那么神经网络可能会快速地适应新的经验,但也会更容易忘记之前的经验。
神经网络的容量限制:神经网络的容量有限,它只能存储有限的知识。当新的知识不断涌入时,旧的知识可能会被覆盖。
KAQ 3. 经验回放如何解决问题?
设置缓冲区:将所有经验存储在回放缓冲区中,而不是立即丢弃。
随机抽样:从回放缓冲区中随机抽取经验样本来训练神经网络。这样,神经网络就不会只学习最近的经验,而是可以从过去的经验中学习。
平滑数据分布:随机抽样可以平滑数据分布,减少数据之间的相关性,从而提高训练的稳定性
KAQ 4. 如何理解随机抽取经验样本?
随机抽取的经验样本 (state, action, reward, next_state, done) 包含了 agent 在过去某个时间点所处的状态 state,采取的动作 action,获得的奖励 reward,以及进入的下一个状态 next_state。这相当于在训练过程中,让 agent “回忆” 起过去某个时刻的局部环境信息和行为结果。
但,这并不是一个完整的环境模拟。agent 并没有真正回到过去,重新体验整个过程。它只是利用存储的经验数据来更新 Q 网络。
比喻:
- 错题本 (Replay Buffer):学生将做错的题目记录在错题本上。
- 随机复习 (Random Sampling):学生随机选择错题本上的题目进行复习。
- 回顾错误 (Experience):每道错题都包含了题目内容 (state)、学生的错误答案 (action)、正确答案 (reward) 和解题思路 (next_state)。
- 学习修正 (Q-learning):通过回顾这些错题,学生可以发现自己的错误,并学习正确的解题方法,从而提高考试成绩。


