DQN 原理(二):理解 DQN 中的“Q”

继续讨论 DQN(Deep Q Networks)。可能读者对“Deep”和“Networks”已经有一定了解,但对“Q” 的含义不甚明朗。

本文仍然结合上一篇《DQN 原理(一):环境,行为,观测》和上上篇《利用 TensorFlow + Keras 玩 Atari 游戏》的代码及论文【1】进行学习和理解。

AI 在每个时刻 t,根据其观测到的选择一种行为,用策略函数表示。

策略函数 实现从观测状态到行为的映射关系,即  =。细心的读者可能发现了, 的输入是游戏画面,输出是控制下一步的行为,相当于人类大脑的作用,完成“识别——评估——决策”这个复杂流程。

环境接收到后,会更新状态,观测变为,同时会向 AI 反馈即时奖励。借用上一篇《DQN 原理(一):环境,行为,观测》中给出的代码:


img, r_t, gameover, info = env.step(env.action_space.sample()) 


游戏玩家常用策略是让每一局获得的累积奖励最大。

由于游戏的因果性,一个行为产生的奖励肯定发生在行为之后(应该很容易理解吧?),而且随着时间推移,越晚发生的奖励,与最早的动作关系越远,所以用公式表达就是这样:



其中 T 表示游戏终止时间, Rt 表示累积奖励值(从 t 时刻直到游戏结束的所有奖励累积之和),gamma(就是上图写得像 8 的那个字母 ^_^)是一个衰减因子,取值范围 0<= gamma <= 1,距离 t 时刻越远的奖励衰减越显著。


怎样评价 t 时刻的行为  的价值?

不管,我只要得分最高。

好的,那就用这个公式来定义吧:


公式左边的 Q 函数称为从状态 s 开始,使用 a 作为第一个行为的最大累积奖励值,又称作价值函数(value-function)。E 表示取期望值。

说通俗点?

就是玩打砖块时,你看到球运动方向,于是左右调整挡板去拦,假设时刻 t 你按下了“左”,那么 Q 函数就告诉你,后面你得分的期望值是 XXX(是的,如果你后面操作都遵循“最优”策略,那么最终累积得分的期望值只和 t 时刻行为、观测相关)。


那么问题来了,怎样实现“最优”策略 =)?

如果用有监督学习的方法,我们需要通过资深游戏玩家的历史记录收集大量的(,) ,训练得到,然而训练数据收集相当困难,作为替代,唯一可利用的训练信息是每个 step 的即时奖励 


逼近策略函数的方法称为策略方法(policy-based method)。

还有一种逼近 Q 函数的方法,称为价值方法(value-based method)。


在著名的 AlphaGo 中,使用神经网络逼近两个函数,称为策略网络(Policy network)、价值网络(Value-network)。


我们这篇文章用后一种方法,即逼近 Q 函数的方法。

最优的 Q 函数是什么样的呢?


即从所有策略中选择能让 Q 最大的那个,也就代表了累积奖励最高的那个策略,符合我们上面“不管,我只要得分最高。”的设定。


直接用大量重复实验也许可以获得最优 Q 函数,但这不经济,因为玩一局打砖块游戏至少有上万步,穷举法要算到三生三世也未必算得完……


有个哥们脑洞大开,说我们干嘛要把 t 之后所有步骤都算一遍呢,活在当下不好么?于是建立了著名的 Bellman 等式:



上式中,a' 表示 t+1 时刻的行为,s' 表示 t+1 时刻的观测,也就是 t 时刻采取动作 a 之后获得的新观测。


如果 t 时刻的 Q 函数是最优的, t+1 时刻的 Q 函数也是最优的,这二者之间只差 t 时刻的奖励 r,另外还要考虑衰减因子 gamma,表达出来就是上面的等式了。


最优 Q 函数不好搞到解析解,工程上一般用一个线性函数或非线性函数(像这里用神经网络)来逼近。



上式中 theta 表示逼近函数的参数。像这里用 CNN 逼近,那么 theta 就是 CNN 的权值。此时的神经网络称为 deep Q-network,简称 DQN。


上式定义了损失函数。就是按照前面 Bellman 等式移项后,取 L2 loss 得到的,利用随机梯度下降法可以对 DQN 的权值进行优化,使得损失函数最小,逐渐逼近最优 Q 函数,即一旦满足 Bellman 等式,损失函数为 0,就可以认为逼近函数达到了最优解。


上式中:

这一项在某些论文中直接用 y 表示。后面代码实现也是这么做的。


梯度计算公式:


另外,为了保证算法稳定收敛,还使用了经验回放(experience replay)技术。所谓 t 时刻的经验 e_t ,就是 t 时刻的观测、行为、奖励和 t+1 时刻的观测集合。


将时刻 1 到 t 所有经验都存储到 Dt 中,称为回放记忆(replay memory)。

每次迭代,会从 D 中均匀采样得到一组经验,对当前权值使用 SGD 算法进行更新。这样避免了使用相邻经验的过度耦合(游戏中相邻几帧的观测都是非常近似的,容易造成训练发散)。训练 Q 网络时,输入(s, a) 变为序列输入

(s1, a1), (s2, a2), ..., (sn, an)。


整体计算框架如下图所示:

可见,为了计算公式中的损失函数,需要两个相同结构、不同权值的 Q 网络实现,其中 Target Q Network 对应上面公式中

这一项,而 Q Network 则对应

这一项。

回放记忆则为两个 Q 网络提供了不同时刻的输入状态或行为,为计算 DQN 损失函数提供了奖励值 r。


DQN 训练的代码实现请继续看下一篇。




Reference

【1】DeepMind, Playing Atari with Deep Reinforcement Learning, https://arxiv.org/abs/1312.5602

【2】Richard S. S. Reinforcement Learning : An Introduction, The MIT Press.

【3】Arun Nair, Massively Parallel Methods for Deep Reinforcement Learning

【4】Tom M. Michell, Machine Learning, Chapter 13, "Reinforcement Learning".

【5】Kevin Chen, Deep Reinforcement Learning for Flappy Bird, http://cs229.stanford.edu/proj2015/362_report.pdf


猜你喜欢

转载自blog.csdn.net/qq_41352018/article/details/80274299
DQN