深度 Q 网络:用深度神经网络,来近似Q函数
- DQN(深度 Q 网络)= 深度神经网络 + Q-Learning
- Q-Learning
- 模型结构
- 损失函数
- 经验回放
- 探索策略
- 流程关联
- DQN 优化
- DDQN:双 DQN,实现无偏估计
- Dueling DQN:提高决策的准确性和效率
- Noisy DQN:增强模型的探索能力
- 优先级经验回放
- OpenAI Q* :超越人类的自主系统
DQN 算法全称 深度Q网络,以 Q-Learning 算法为基础,融合了神经网络。
因为传统Q学习,不适合处理大规模数据(连续状态空间)的问题,就可用深度神经网络来近似Q函数。
Q 值表示做出一个行为后能够获得的累计奖励,越大,越应该选择。
Q 值的组成是:当前状态s下,所有行为 a 的 Q 值。
那优化目标就是,每个状态(s)下都能做出 Q 值最大的行为(a),从而实现机器与环境的最优交互。
我们会使用表格用于存储和更新Q值,是因为这种方法提供了一种直观、清晰的方式来表示和跟踪每个状态和行为组合的预期回报。
当状态和行为的数量非常庞大时,用表格储存所有数据会占用非常多的资源。
一般就会想到状态压缩,只保存与决策相关的几个最优可能来源。
但是在强化学习中,每个状态-动作对的历史信息都可能对学习最优策略至关重要,所以不能用状态压缩。
问题就是,输入状态s、行为a,怎么计算出 Q 值?
使用神经网络可以直接学习状态、行为、Q值的关系,输入状态,就能得到每个行为的Q值。
神经网络在这的功能:从存储 3 个值的排列组合,到只存储状态。
现在的状态(St):
Q网络:
选择动作和获得奖励(R):
下一个状态(St+1):
target Q网络:
更新Q网络(loss):
在这个过程中,Q网络不断学习和更新,目的是帮助你在这个房间的世界里找到更多的糖果。
每次你选择了一个动作并看到结果,Q网络都会变得更好,帮助你做出更好的选择。
损失函数采用时序差分来,比较两个连续时间步的 Q 值来计算误差,并将这个误差用于更新神经网络的权重。
在DQN中,损失函数特别关注的是预测的奖励(我们认为采取某个动作能得到多少好处)和实际得到的奖励(实际采取动作后得到的好处)之间的差别。
上图有 2 个 Q 网络,目标 Q 网络 是 S t + 1 S_{t+1} St+1。
损失函数更新Q值规则:
使用均方差误差做损失函数:
Q w Q_{w} Qw 网络每步都更新,后面的 目标 Q 网络 隔几步才更新。
隔几步才更新目标Q网络是为了让训练更加稳定和有效,就像你在学习时每隔一段时间才询问朋友一样。
如果每步都听从朋友的建议,就会过于保守,完全用他的经验(使用已知的最佳动作)了,错过更好的动作选择。
经验回放就像是给机器一个记事本,它可以在每次玩游戏后记下自己的经验(特别是已知的最佳动作)。
这个记事本包含了机器在不同游戏情况下的经验,比如在某个特定情况下采取了哪个动作,以及随后获得了多少奖励。
在执行任务的同时,将一部分数据(通常是状态、动作、奖励和下一个状态等信息)存储到经验池中,以供后续的训练使用。
在训练过程中不仅仅使用当前的经验来更新模型,还要积累更多的经验,以便在训练中使用更多的数据。这可以有几个好处:
稳定性:通过将多个时间步的经验存储到经验池中,可以减少训练数据的相关性,使训练更加稳定。这有助于防止模型陷入局部最优解或出现训练不稳定的情况。
重复利用经验:存储的经验可以多次用于训练,这有助于更有效地学习和提高样本的利用率。有时候,某些经验可能在一开始并不显著,但随着训练的积累,它们可能变得更有价值。
但有一个问题:是选择已知的好方法(已知的最佳动作),还是尝试新方法(尝试新动作,可能有更好的方法)?
探索策略就是决定如何平衡这两种选择的方法。
如果一直按同一个按钮,它可能会错过更好的方法,但如果总是尝试新方法,它可能会很难取得进展。
在 ε-greedy 探索策略下,智能体以ε的概率选择随机动作(探索),以1-ε的概率选择当前认为最优的动作(利用)。
在一部分时间步中会尝试新的动作以发现更多信息,而在另一部分时间步中会选择已知的最佳动作以最大化奖励。
初始的时候,多探索ε要大,经验多了后,多利用ε减少
Q-Learning(时间步0):
探索策略:
环境交互:
经验回放:
损失函数计算:
DNN参数更新:
Q值网络更新:
探索策略更新:
重复:
因为 DQN 的 Q 值更新是以下一个状态为参考,我们是神经网络近似估算给的都是最大值,层层传递,会导致偏大。
真实值和估计值(True value and an estimate):
所有估计值和最大值(All estimates and max):
偏差作为状态函数(Bias as function of state):
平均错误(Average error):
在 DDQN 中,我们用两个网络分别来选择动作和评估动作的价值,这样做可以减少估计中的偏差和误差,而不是过分依赖单一的估计。
DDQN 只改变了目标值的计算方法,其他地方与DQN算法完全一致。
就像是有两个智能助手:
这两个助手轮流工作,确保你既知道往哪走,又不会对前方的好处期望过高。
损失函数的变化:
Q ( s t , a t ) ⟷ r t + 1 + γ Q ′ ( s t + 1 , a r g m a x a Q ( s t + 1 , a ) ) Q(s_t,a_t)\longleftrightarrow r_{t+1}+\gamma Q'\left(s_{t+1},\mathop{\mathrm{argmax}}_aQ\left(s_{t+1},a\right)\right) Q(st,at)⟷rt+1+γQ′(st+1,argmaxaQ(st+1,a))
具体来说:
估算网络(Evaluation Network):
目标网络(Target Network):
相互监督的实现:
结合使用两个网络的优势:
通过这种方式,两个网络相互监督,一个提供动作选择的建议,另一个提供稳定的目标值,共同工作以实现更准确的学习和决策过程。
Dueling DQN 的核心思想是将 Q 值的估计分解为两个独立的部分:状态值(Value)和优势值(Advantage)。
状态值(V(s)):这是在给定状态下,不考虑任何具体动作的情况下,智能体预计能获得的总回报。简单来说,它反映了仅凭当前状态就能判断的智能体处境的好坏。
优势值(A(s, a)):这个值衡量了相对于其他可能动作,选择某个特定动作可能带来的额外回报。如果一个动作比其他动作好得多,它的优势值就会更高。
然后,这两个值合并起来,形成了对每个动作的 Q 值的估计:
但这里有一个问题:如果我们简单地加起来,可能会有多个状态和动作对的组合导致相同的 Q 值,这样就不能正确地学习它们的区别了。
为了解决这个问题,Dueling DQN 使用了一个技巧来稳定学习过程:它会从每个动作的优势值中减去所有动作优势值的平均值:
强制让没有优势的动作(也就是平均动作)的优势值为零。
这样的结构使得网络能够更加明确地区分出在决策中状态价值和动作选择的影响。
一部分帮你看到当前位置的总体价值(比如这是不是一个好地方),另一部分让你看到每个动作(比如跳跃、下蹲或向右移动)的特别价值。
这样你就能更清楚地知道是继续在当前位置探索好,还是采取某个特别动作好。
DDQN改善了训练过程的稳定性并减少了估值偏差,而Dueling-DQN通过独立评估状态的总体价值和每个动作的相对优势,提高决策的准确性和效率。
在传统的DQN中,探索通常是通过 ε-greedy 策略实现的,即智能体有一定概率(ε)随机选择动作(探索),而不是总是选择它认为最好的动作(利用)。
随着训练的进行,这个概率逐渐降低,智能体越来越多地选择它认为的最佳动作。
Noisy DQN 采用了不同的方法来实现探索。它在网络的参数上添加可学习的噪声,使得即使在选择最佳动作时,智能体的行为也会有一定的随机性。
Noisy DQN 的创新之处在于它引入了噪声,直接添加到网络的参数中,而不是依靠外部的随机探索策略(如ε-greedy)。
这样做的好处是:
自动调整探索率:在Noisy DQN中,探索是通过网络内部的噪声决定的。随着训练的进行和智能体学习的改进,这个内部噪声可以自动调整,从而调整探索的程度。
更有效的探索:由于噪声是直接加在网络参数上的,这种方法可能比传统的随机探索更有效,因为它允许网络学习何时探索以及如何探索,而不是简单地随机选择动作,避免过早陷入固定行为模式(过度依赖经验)。
对传统的经验回放机制进行了改进。
在标准的经验回放中,智能体在训练过程中收集的经验(即从环境中得到的状态、动作、奖励和新状态的数据)被存储在一个记忆缓冲区中,然后这些经验被随机抽取来训练智能体。
这个方法的一个局限性是它假设所有经验都同等重要,但实际上并非如此。
优先级经验回放的核心思想是,某些经验比其他经验更有价值,应该更频繁地用于训练。
这种方法通过赋予每个经验一个优先级来实现,让学习率高的状态权重更大。
当前状态和动作(( s_t, a_t )):
Q值更新(( Q(s_t, a_t) ) 更新):
学习率 ( α \alpha α):
即时奖励 ( r t + 1 ) ( r_{t+1} ) (rt+1):
折扣因子 ( γ ) (\gamma ) (γ):
最大未来奖励( max Q ( s t + 1 , a t + 1 ) \max Q(s_{t+1}, a_{t+1}) maxQ(st+1,at+1)):
时序差分(Temporal Difference Error):
更新规则:
OpenAI在11月22号,给公司人员发了一封内部信,承认了 Q*,并将这个项目描述为 “超越人类的自主系统”。
Q* 是在搞 过程监督,通过奖励推理的每个正确步骤。
而不仅仅是结果监督,奖励正确的最终答案。
Q* 是 Q-learning 和 A* (可能)的组合,能大幅度提升推理能力,用于解决数学中高难度问题。
openai研究 Q-learning 的成果:https://noambrown.github.io。
Q-learning 需要大量的探索(左图二基本遍历完了),A* (左图三只遍历了一部分)。
Q* 结合了双方的优点(左图四):
最强的是不可知能力,成功破解了现代加密算法 AES,但是不可知。