深度Q学习变体及其他流行强化学习算法介绍
1. 深度Q学习算法变体
深度Q学习算法有一些变体可以稳定并加速训练过程,下面为你详细介绍几种重要的变体。
1.1 固定Q值目标
在基本的深度Q学习算法中,模型既用于预测,又用于设定自身目标,这就像狗追自己的尾巴一样,会形成反馈循环,导致网络不稳定,可能出现发散、振荡、冻结等情况。
为了解决这个问题,研究人员使用了两个深度Q网络(DQN):
-
在线模型
:在每一步进行学习,并用于控制智能体的行动。
-
目标模型
:仅用于定义目标。目标模型是在线模型的克隆体,通过以下代码实现克隆和权重复制:
target = tf.keras.models.clone_model(model) # 克隆模型架构
target.set_weights(model.get_weights()) # 复制权重
在
training_step()
函数中,计算下一个状态的Q值时,使用目标模型而非在线模型:
next_Q_values = target.predict(next_states, verbose=0)
在训练循环中,需要定期(例如每50个回合)将在线模型的权重复制到目标模型:
if episode % 50 == 0:
target.set_weights(model.get_weights())
由于目标模型的更新频率远低于在线模型,Q值目标更加稳定,反馈循环得到抑制,其影响也不那么严重。为了进一步稳定训练,还可以使用较小的学习率(如0.00025),每10000步更新一次目标模型,使用包含100万条经验的大型回放缓冲区,缓慢降低epsilon值(从1在100万步内降至0.1),并让算法运行5000万步。此外,DQN可以采用深度卷积网络。
1.2 双深度Q网络(Double DQN)
目标网络容易高估Q值。例如,当所有动作的Q值理论上相同时,由于近似误差,目标模型可能会随机选择一个略大的Q值,从而高估真实的Q值。
为了解决这个问题,研究人员提出了双深度Q网络(Double DQN)。在选择下一个状态的最佳动作时,使用在线模型;仅使用目标模型来估计这些最佳动作的Q值。以下是更新后的
training_step()
函数:
def training_step(batch_size):
experiences = sample_experiences(batch_size)
states, actions, rewards, next_states, dones, truncateds = experiences
next_Q_values = model.predict(next_states, verbose=0) # ≠ target.predict()
best_next_actions = next_Q_values.argmax(axis=1)
next_mask = tf.one_hot(best_next_actions, n_outputs).numpy()
max_next_Q_values = (target.predict(next_states, verbose=0) * next_mask
).sum(axis=1)
[...] # 其余部分与之前相同
1.3 优先经验回放(Prioritized Experience Replay)
传统的经验回放是从回放缓冲区中均匀采样经验,而优先经验回放则更频繁地采样重要经验。重要经验是指那些可能导致快速学习进展的经验,可以通过测量时间差分(TD)误差δ = r + γ·V(s′) – V(s)的大小来估计。
当经验被记录到回放缓冲区时,其优先级被设置为一个非常大的值,以确保至少被采样一次。每次采样后,计算TD误差δ,并将经验的优先级设置为p = |δ|(加上一个小常数以确保每个经验都有非零的采样概率)。采样优先级为p的经验的概率P与pζ成正比,其中ζ是一个超参数,控制重要性采样的贪婪程度:
- 当ζ = 0时,等同于均匀采样。
- 当ζ = 1时,是完全的重要性采样。
由于样本会偏向重要经验,在训练时需要通过降低经验的权重来补偿这种偏差。每个经验的训练权重定义为w = (n P)–β,其中n是回放缓冲区中的经验数量,β是一个超参数,控制对重要性采样偏差的补偿程度:
- β = 0表示不补偿。
- β = 1表示完全补偿。
1.4 对决深度Q网络(Dueling DQN)
对决深度Q网络(DDQN)与双深度Q网络不同,但两者可以轻松结合。状态 - 动作对(s, a)的Q值可以表示为Q(s, a) = V(s) + A(s, a),其中V(s)是状态s的值,A(s, a)是在状态s下采取动作a相对于其他可能动作的优势。
在对决DQN中,模型同时估计状态的值和每个可能动作的优势。由于最佳动作的优势应为0,模型会从所有预测的优势中减去最大预测优势。以下是一个使用函数式API实现的简单DDQN模型:
input_states = tf.keras.layers.Input(shape=[4])
hidden1 = tf.keras.layers.Dense(32, activation="elu")(input_states)
hidden2 = tf.keras.layers.Dense(32, activation="elu")(hidden1)
state_values = tf.keras.layers.Dense(1)(hidden2)
raw_advantages = tf.keras.layers.Dense(n_outputs)(hidden2)
advantages = raw_advantages - tf.reduce_max(raw_advantages, axis=1,
keepdims=True)
Q_values = state_values + advantages
model = tf.keras.Model(inputs=[input_states], outputs=[Q_values])
这些变体可以相互结合,例如可以构建双对决DQN并结合优先经验回放。
1.5 变体总结表格
| 变体名称 | 解决的问题 | 主要实现方式 |
|---|---|---|
| 固定Q值目标 | 网络不稳定 | 使用两个DQN,定期更新目标模型权重 |
| 双深度Q网络 | 目标网络高估Q值 | 用在线模型选动作,目标模型估Q值 |
| 优先经验回放 | 均匀采样效率低 | 按经验重要性采样并补偿偏差 |
| 对决深度Q网络 | 分离状态值和动作优势 | 模型同时估计状态值和动作优势 |
1.6 深度Q学习变体流程图
graph LR
A[基本深度Q学习算法] --> B[固定Q值目标]
A --> C[双深度Q网络]
A --> D[优先经验回放]
A --> E[对决深度Q网络]
B --> F[稳定网络训练]
C --> F
D --> F
E --> F
2. 其他流行的强化学习算法
除了深度Q学习的变体,还有许多其他流行的强化学习算法,下面为你逐一介绍。
2.1 AlphaGo
AlphaGo使用基于深度神经网络的蒙特卡罗树搜索(MCTS)变体,在围棋比赛中击败了人类冠军。MCTS会进行多次模拟,从当前位置反复探索搜索树,在最有希望的分支上花费更多时间。当到达一个未访问过的节点时,它会随机下棋直到游戏结束,并根据最终结果更新每个访问节点的估计值。
AlphaGo基于相同的原理,但使用策略网络来选择移动,而不是随机下棋。这个策略网络使用策略梯度进行训练。最初的算法涉及三个以上的神经网络,后来在相关改进中,使用单个神经网络来选择移动和评估游戏状态。相关算法还得到了进一步推广,使其不仅能处理围棋,还能处理国际象棋和将棋。
2.2 演员 - 评论家算法
演员 - 评论家算法是一类将策略梯度与深度Q网络相结合的强化学习算法。一个演员 - 评论家智能体包含两个神经网络:策略网络和深度Q网络(DQN)。
DQN通过从智能体的经验中学习进行正常训练。策略网络的学习方式与常规策略梯度不同且更快,它依赖于DQN估计的动作值,就像运动员在教练的帮助下学习一样。
2.3 异步优势演员 - 评论家(A3C)
这是DeepMind研究人员在2016年引入的一种重要的演员 - 评论家变体。多个智能体并行学习,探索环境的不同副本。每个智能体定期但异步地将一些权重更新推送到主网络,然后从该网络拉取最新权重。这样,每个智能体都有助于改进主网络,并从其他智能体的学习中受益。此外,DQN估计每个动作的优势,而不是Q值,这有助于稳定训练。
2.4 优势演员 - 评论家(A2C)
A2C是A3C算法的变体,它消除了异步性。所有模型更新都是同步的,因此梯度更新在更大的批次上进行,这使得模型能够更好地利用GPU的计算能力。
2.5 软演员 - 评论家(SAC)
SAC是2018年由相关研究人员提出的演员 - 评论家变体。它不仅学习奖励,还最大化其动作的熵,即尽可能地不可预测,同时尽可能多地获得奖励。这鼓励智能体探索环境,加速训练,并减少在DQN产生不完美估计时反复执行相同动作的可能性。与之前的算法相比,SAC具有惊人的样本效率。
2.6 近端策略优化(PPO)
PPO算法由OpenAI的研究人员提出,基于A2C,但对损失函数进行裁剪,以避免过大的权重更新,从而防止训练不稳定。它是之前的信任区域策略优化(TRPO)算法的简化版本。OpenAI在2019年4月推出了基于PPO算法的AI“OpenAI Five”,在多人游戏Dota 2中击败了世界冠军。
2.7 基于好奇心的探索
强化学习中一个常见的问题是奖励的稀疏性,这使得学习非常缓慢和低效。研究人员提出了一种有趣的方法来解决这个问题:让智能体对探索环境充满好奇心,使奖励成为智能体内在的驱动力,而不是来自环境。
智能体不断尝试预测其动作的结果,并寻找结果与预测不匹配的情况。如果结果可预测,它会去其他地方;如果结果不可预测但智能体无法控制,它也会逐渐感到无聊。通过这种方式,研究人员成功地在许多视频游戏中训练了智能体。
2.8 开放式学习(OEL)
OEL的目标是训练能够不断学习新的、有趣任务的智能体,这些任务通常是程序生成的。例如,相关算法会生成多个包含颠簸和孔洞的模拟2D环境,并为每个环境训练一个智能体,智能体的目标是尽可能快地行走同时避开障碍物。
算法从简单的环境开始,逐渐增加难度。每个智能体只在一个环境中训练,但需要定期与其他环境中的智能体竞争,获胜者会被复制并替换原环境中的智能体。这样,知识在不同环境之间转移,最终训练出的智能体比在单一任务上训练的智能体更优秀,能够应对更具挑战性的环境。
2.9 其他流行算法总结表格
| 算法名称 | 主要特点 | 优势 |
|---|---|---|
| AlphaGo | 基于MCTS和深度神经网络 | 在棋类游戏中表现出色 |
| 演员 - 评论家算法 | 结合策略梯度和DQN | 学习速度较快 |
| A3C | 多智能体异步学习 | 加速训练并稳定网络 |
| A2C | 同步更新模型 | 更好利用GPU计算能力 |
| SAC | 最大化动作熵 | 样本效率高 |
| PPO | 裁剪损失函数 | 避免训练不稳定 |
| 基于好奇心的探索 | 以好奇心驱动探索 | 解决奖励稀疏问题 |
| 开放式学习 | 不断生成新任务 | 训练通用能力强的智能体 |
2.10 其他流行算法流程图
graph LR
A[强化学习算法] --> B[AlphaGo]
A --> C[演员 - 评论家算法]
C --> D[A3C]
C --> E[A2C]
C --> F[SAC]
A --> G[PPO]
A --> H[基于好奇心的探索]
A --> I[开放式学习]
B --> J[棋类游戏应用]
D --> K[稳定高效训练]
E --> K
F --> K
G --> K
H --> K
I --> K
3. 强化学习相关问题及练习
3.1 常见问题解答
以下是一些强化学习中的常见问题及解答:
1.
如何定义强化学习,它与常规监督或无监督学习有何不同?
:强化学习是智能体通过与环境交互,根据环境反馈的奖励来学习最优行为策略的过程。与监督学习不同,它没有明确的标记数据;与无监督学习不同,它有奖励信号引导学习。
2.
能否想出三个未提及的强化学习应用?
:例如自动驾驶、资源管理、游戏AI等。以自动驾驶为例,环境是道路和交通状况,智能体是自动驾驶汽车,可能的动作包括加速、减速、转弯等,奖励可以是安全到达目的地、遵守交通规则等。
3.
折扣因子是什么,修改折扣因子会改变最优策略吗?
:折扣因子用于权衡未来奖励的重要性。修改折扣因子可能会改变最优策略,因为它会影响智能体对短期和长期奖励的偏好。
4.
如何衡量强化学习智能体的性能?
:可以通过累计奖励、成功率、完成任务的时间等指标来衡量。
5.
什么是信用分配问题,它何时发生,如何缓解?
:信用分配问题是指在一系列动作后,难以确定每个动作对最终奖励的贡献。它通常在延迟奖励的情况下发生。可以通过使用合适的算法(如策略梯度)和设计合理的奖励函数来缓解。
6.
使用回放缓冲区的目的是什么?
:回放缓冲区可以打破数据之间的相关性,提高数据的利用率,使训练更加稳定。
7.
什么是离策略强化学习算法?
:离策略算法使用不同于当前正在学习的策略来生成数据,这可以使学习更加高效。
3.2 练习建议
如果你想进一步学习强化学习,可以尝试以下练习:
1. 使用策略梯度解决OpenAI Gym的LunarLander - v2环境。
2. 使用双对决DQN训练一个智能体,使其在著名的Atari Breakout游戏(“ALE/Breakout - v5”)中达到超人水平。需要将观察到的图像转换为灰度图,裁剪并下采样,合并两到三个连续图像形成每个状态,并且DQN主要由卷积层组成。
3. 如果你有一定预算,可以购买树莓派3和一些廉价的机器人组件,在上面安装TensorFlow,进行机器人相关的强化学习实验。例如,让机器人转动以找到最亮的角度或最近的物体,并向该方向移动;如果机器人有摄像头,可以尝试实现目标检测算法,使其检测到人并向人移动。
强化学习是一个快速发展且令人兴奋的领域,每天都有新的想法和算法涌现,希望这些介绍能激发你对这个领域的探索欲望。
超级会员免费看
13

被折叠的 条评论
为什么被折叠?



