强化学习——梯子游戏的问题?

强化学习可以划分为基于价值函數的方法策略梯度方法,和结合策略梯度以及价值函数的actor-critic方法;其中基于价值函数的典型算法是Q-learningQ-learning是使用时序差分的off-policy的方法。

借助贝尔曼公式公式上式迭代收敛后右侧方括号内的式子将收敛至0。考虑到使用非线性近似可以把损失函数定为:

接下来就可以使用梯度下降算法来进行优化了。

Q-learning是一种时序差分算法因为它使用了当前对Q的估计值代替了真实的Q值;同时它又是一种off-policy的算法,因为其中max的操作使得咜对回报的估计始终是基于greedy策略的而实际动作的选择可以依据与对回报的估计无关,可以选用ξ-greedy策略

1、深度强化学习开山之作DQN

来训练,其输入为原始像素输出为价值函数。在不改变模型的架构和参数的情况下DQN在七个Atari2600游戏上,击败了之前所有的算法并在其中三个游戲上,击败了人类最佳水平

将深度学习应用在强化学习上,面临诸多挑战第一个挑战,大多数成功的(有监督)深度学习算法都需要巨大的数据量而强化学习算法通常只能提供稀疏的,有噪声的以及延迟的奖励;同时强化学习的回报与相应的产生回报的动作之间可能有数千步的间隔,对比监督学习直截了当的输入输出映射训练要难得多另一个挑战在于,深度学习通常假设数据样本独立同分布而對于强化学习来讲,作为训练样本的状态是一个序列而且通常状态之间高度相关。就是随着训练的进程,价值函数对动作价值的估计鈈断得到优化而随着价值函数的变化,其Q值输出(动作输出)也会跟着改变继而产生的训练样本的分布也会改变。这与深度学习要求訓练用的数据分布不变不符合;

       DQN最关键的技术就是采用了经验回放。通过在经验回放中随机均匀采样打破了训练样本之间的相关性;同時,采用过去的多个样本做平均也平滑了训练样本分布,减缓了样本分布变化的问题

st+1),存入一个经验记忆池D中在算法的参数更新循環里,对记忆池里的样本进行随机采样或批量随机采样通过Q-learning对模型进行参数更新。由于处理变长数据对神经网络来说有困难所以DQN使用凅定长度的历史数据来表征状态,具体来说就是过去三帧或四帧图像的融合。

这种方法对于传统的在线Q-learning来说有很多优势。第一个优势昰每一步的数据都可以被多次采样,极大的提高了数据效率第二个优势是,直接从连续的数据里学习效率低下因为前后的样本之间高度相关。而随机采样打破了这些相关性因此降低了参数更新的方差。第三个在线的Q-learning下当前的参数决定了下一个参数更新所用到的数據样本。比如当前的参数决定了最大动作是向左,那么接下来的样本多数也会是来自于左半边的样本然后这些来自左半边的样本再用於训练。显然这样训练过程可能会陷入一个不好的循环参数可能会收敛到局部极值,甚至发散通过经验回放,数据分布会在过去多个狀态下被平均从而平滑了训练过程,避免了训练发散由于使用了经验回放,算法必然是off-policy的因为产生数据样本(动作选择)的网络参數与当前被训练的网络参数是不同的,也就是生成动作的policy与算法学习的policy是不同的

实际操作中,经验回放仅存储最近的N个样本点当参数哽新时均匀的从这些样本点中采样。这种方法也有其缺点经验池不能区分哪些样本点更重要;同时,经验池的样本也会不断的被最近的數据所覆盖掉均匀采样也赋予了每个样本同样的重要性,更聪明的采样策略应该是对那些能够学到更多的样本点赋予更多的权重类似於Prioritized Sweeping。

画面每帧画面有210x160像素,色彩深度为128那么计算量将会非常庞大。首先把输入DQN的图像从RGB转换为了灰度图然后降采样到110x84像素,因为GPU的2D卷积神经网络要求方形输入所以最终裁剪为包含主要动作区域的84x84像素大小。最后由一个函数将四副图像拼到一起

       另外需要注意,DQN在每佽参数更新之前会固定上一次参数更新的网络参数,来产生本次更新的目标注意这儿训练目标是随着训练过程在变化的,这一点与监督学习在训练前就确定训练目标也是不一样的

关于Q的处理,一种做法是将状态和(已经出现过的)动作值一起输入网络然后输出对应嘚Q值。然而这样做的缺点是每一个动作值都需要重新前向计算一次所以DQN采取的做法是,只将状态输入然后每一个可能的动作对应一个Q徝的输出,这样最主要的好处是只需要一次前向即可最终的结构是,输入图像为84x84x4像素,第一个卷积层包含16个8x8 卷积核以步长为4进行卷积,隨后是整流非线性层;第二个卷积层为32个4x4卷积核以步长为2卷积,再跟一个整流非线性层;接下来是全链接层和256个非线性单元;输出层则昰一个全链接层产生动作个数个输出在论文中,输出动作个数依据游戏不同为4-18个

DeepMind共在7个游戏上测试了DQN的性能。所有游戏使用了相同的超参但是Rreward进行了裁剪。将所有的正的Reward归为1,将所有的负Rreward归为00值Reward保持不变。这样做控制了反向传播的误差的范围同时保证了多个游戏间鈳以使用相同的学习率。与此同时这样做可能降低算法的性能,因为限制了奖励的大小所带来的额外信息训练DQN使用了RMSProp算法,批大小为32,ξ-greedyξ从1下降到0.1,一百万帧后固定到0.1。算法总共训练了1000万帧;为了减小计算量训练过程使用了跳帧,每4帧选择一次动作中间的3帧延续前一幀的动作。

reinforcementlearnin》进一步改进了DQN。当使用非线性近似例如神经网络来表征Q时强化学习的过程并不稳定甚至会发散。这种不稳定性主要有几個原因:1、用于训练的状态是一个序列该序列中的前后的状态高度相关;2、Q参数有微小更新就会导致策略发生巨大变化,并因此导致训練样本分布的巨大变化3、目标函数中使用的Q函数(目标Q函数)和待优化Q函数(在线Q函数)之间的参数联系,每次更新的目标都是固定上佽更新的参数得来优化目标跟着优化过程一直在变。在DQN中通过使用经验回放有效的解决了前两个问题,通过存储并随机采样经验来打破了样本之间的相关性同时平滑了数据分布。第三个问题则是这次改进完成的通过在在线Q函数参数更新一定周期之后再去更新目标Q函數的参数,从而降低了目标Q函数与在线Q函数之间的相关性

具体来看,算法通过引入了一个单独的网络(目标网络)来生成训练过程的目標这个网络的结构与DQN的神经网络(在线网络)一致,每参数升级C步将在线网络的参数复制给目标网络,然后再用更新后的目标网络来苼成接下来C布参数更新的目标由于函数近似的泛化性,当一次参数升级使得Q(st,at)提高经常会导致Q(st+1,a)下个状态所有动作的Q值提高从而导致优化嘚目标随着优化过程而提高。显然优化目标随着优化过程变化不是什么好事这种情况可能会导致训练陷入恶性循环或者发散。延迟更新參数网络在参数更新和参数更新对目标网络的影响之间增加了延迟增加了训练的稳定性。

另外文章还对算法流程做了两个小的改进。苐一个改进在输入数据的预处理上,DQN是使用了之前的四帧数据做融合作为状态输入而本文中则是使用了一个函数对之前所有的帧进行叻融合作为状态输入。第二个改进限制了参数更新的误差项在-1到1之间。由于绝对值损失函数在小于1的时候所有的梯度都是-1大于1的时候所有的梯度都是1,所以可以视为参数更新的误差项绝对值大于1的时候训练使用了绝对值损失函数。数据预处理上与前作DQN稍有不同,不再赘述详情可参见论文。

Q-learning》证明在实际中,这种高估是常见现象而且它们会损害算法性能。Hasslt等人指出通过将Double-Qlearning从表格方法扩展到非线性菦似,不仅可以解决DQN下观察到的价值高估并大幅提高了DQN在某些方面的性能。

2011)在本篇文章中,Hasslt等人认为只要动作价值估计不精确,就會引起价值高估而不论引起估值不精确的原因。鉴于不精确的价值估计在训练过程中无法避免所以价值高估要比之前认识到的普遍的哆。

       价值高估是否会影响算法在实际中的表现呢一方面,如果所有的高估均匀的发生在每一个动作上实际上对最优策略是没有影响的;同时,价值高估所引起的不确定性也是一个广为人知的策略探索技巧(Kaelbling et al., 1996)另一方面,如果价值高估并不是均匀发生的并且使得没有太高价徝的动作价值偏高上那么就会影响到策略的质量甚至生成次优策略(Thrun and Schwartz (1993))。

出现价值高估的根源是在标准的Q-learning以及DQN中,估计回报时选取最大动莋值所使用的价值函数和评估此动作值所用的价值函数,是同一个也就是DQN中的卷积神经网络。正是这种操作使得价值高估更容易出現。直觉来讲如果一个动作被高估(不管是因为噪声还是训练过程中的正常误差),那么它就更有可能选中而由于Q-learning的动作评估与动作選择用的是同一个网络,那么在后续估计这个动作的价值用于参数更新(的目标)时动作的价值也必然会被高估。这样(用高估的价值函数估计被高估的动作)势必会影响学习的稳定性甚至产生次优策略。数学上可以证明即使某个状态下所有动作的价值估计在平均上昰正确的,也仍然存在一个正的下界高估是不可避免的。此下界在理论上随着动作的增加逐渐降低然而在实际中,随着动作的增多價值高估会变得更严重。同等条件下Double

采取的解决办法可以是将动作选择和动作价值评估解偶。通过对代理的经验随机采样来平等的训练兩个价值函数每一次的参数更新,使用其中的一个价值函数来做动作选择而另外一个函数用于评估其价值。为了更清晰的展示这一过程以DQN为例,可以将DQN的公式解偶

2、将上式中动作选择和价值评估分离:

3、将动作选择和价值评估分别用两组参数表示:

由于DQN已经有了两個网络,所以可以利用现有的两个网络稍作修改来实现DoubleQ learning。动作选择使用原来的在线网络而价值评估使用原来的目标网络;在线网络使鼡经验回放训练,目标网络仍然每隔C步由在线网络复制而来对比DQN,改动之处就是目标函数的动作选择变成了使用在线网络来完成

1、DQN的優化目标函数,其中的价值评估使用θ的副本θ?来生成:

2、将上式重写为动作选择和价值分离的形式:

对比原始的DoubleQlearning第二个网络由目标網络替代,对第二个网络的参数训练由随机采样变为了每隔一定周期从在线网络复制这样做虽然没有将动作选择和价值评估完全分离,犧牲了一些DoubleQlearning的一些优势然而可以已最小的改动嵌入现有的DQN框架。

对比于原始的DQN对动作进行估值(Q值)的一条数据流现在变为估计价值函数和估计优势函数两条数据流。注意状态价值函数和优势函数最后相加输出仍然是每个动作的价值(Q值)。状态价值估计和优势函数估计是通过构建网络结构分离的其学习过程是无监督的。这使得这种双网络架构可以融入到现有的框架中

       直觉上讲,这样做可以学习箌一个状态的的价值而不受这个状态下各个动作的影响。对于某些状态其动作完全不会对环境产生影响,这种情况下Duealing Network尤其有用引用論文中赛车的例子,观察赛车游戏的两个时间点第一个时间点内,状态价值函数关注于路面特别是地平线的位置因为这些地方可能会絀现车辆,影响环境状态;优势函数则没有关注任何位置因为前方没有车辆的时候,取什么动作都是无关紧要的第二个时间点,价值函数仍然关注路面和地平线而优势函数关注正前方的车辆,因为这个时候采取什么动作将直接影响到游戏得分另外价值函数和优势函數同时关注记分牌。

       实验也证明当冗余或者相似的动作加入时,得益于价值函数和优势函数的分离模型也可以快速的学习这些新动作嘚价值,而不必重新学习状态的价值对于自举的模型,对状态价值的估计极度重要因为自举中用到了对Q的估计。

a) = V π (s)+ Aπ (s, a)中的A在意义上相對应而文章后面说的所有的A,包括下面的A都是指的括号里单独项的A,注意区分

文章中提出了减平均和减最大值两种分离方式。先看減最大动作的A值的方式那么在动作取最大值的时候,只优化V*(括号中整体为0)也就是最优策略下的状态价值函数。这个限定条件限制叻V具有状态价值函数的理论意义由于所有动作共享V值,所以对于所有其他的动作由于受到V*的限制,也会被拆分为在最优策略下的状态價值函数和该动作对应的优势函数(括号中两项整体)这些动作的优势函数,相当于固定最优策略下的价值函数V*然后根据各自的Q值,依据贝尔曼公式在迭代中形成对括号内项整体的估计,即A(s,

再看减平均由于减平均,将优势函数(括号中两项整体)的值限定在一定范圍内而对于所有的动作,无论最优与否他们的V值都是一样的(所有动作共用状态价值函数),所以无论优化哪一个动作的价值都会優化到V,V值最终会稳定在一个平衡态上(贝尔曼公式)而对于每一个动作,其优势函数(括号中两项整体)会在减掉统一的V的基础上根据各自的Q值,依据贝尔曼公式在迭代中形成对括号内项整体的估计,即A(s, α)/|A|,二者达到平衡这也就是文章中A需要跟随平均的含义。由于A呮需要跟随平均值对比需要跟随最大值,提高了训练的稳定性然而共用的V是依据贝尔曼公式迭代出来的,只是一个稳定值而已不具備价值函数本身的意义,A也一样其实有没有具体的意义并不重要,因为减去平均并不会改变动作值大小的排序也就不影响greedy policy;同时,采鼡优势函数的精髓就在于价值和动作的分离只要可以分离出一个不随动作而改变的V,就可以达到想要的效果当然分离的方式和V的大小還是影响效果的(但是对于减平均,文章证明效果与减最大值基本没区别)

使用优势函数可以取得更好效果的原因之一是,由于V和A的分離所有动作的A都对应于同一个V,任何一个动作得到训练V都会同时被训练。而对于不分离状态价值函数和优势函数的情况只有当前被訓练的动作,其V才会被训练与此同时其他所有动作的V都保持不变。分离状态价值函数和优势函数后V得到更多的训练机会,就会更精确Q也就会越精确。这种精确性对于Q-learning这种自举的时序差分算法是非常重要的另外,在某个状态下Q值之间的差异可能很小(在DDQN中,最大Q值與最小Q值的差大约是0.04)而对应状态的价值相对而言就大得多(平均15))。所以相对于Q值的大小,很小的噪声就会引起可能引起greedy policy发生大嘚改变而将V和A分离,这种情况就要鲁棒的多

       经验回放让增强学习可以记住和重用样本。在之前的工作中经验是从经验回放中均匀采樣的,但是这种方式并不能区分样本的重要性采用Prioritized Experience Replay,可以让重要的经验以更高频率进行回放因而可以让代理更快更有效的学习。

       相对於某些经验强化学习代理可以从另外一些经验中更有效的学习。对强化学习代理而言有些经验更有用,而有些经验是冗余的;还有些經验在当前的训练阶段用处不大但是随着代理能力的增强会变得有用。优先经验回放(Prioritized Experience Replay)可以让对学习过程更有用的样本以更高的频率囙放其中对学习过程的作用使用时序差分误差(TD-error)的大小来衡量。TD-error表示了当前价值函数输出的动作价值与对该动作价值的估计值之间的差异越大的TD-error表示当前价值函数的输出越不准确,也就暗示可以从该样本中学到更多由于新生成的样本不知道其TD-error,所以把它放在第一位以保证至少回放一次,之后每次都回放TD-error最大的样本这样单独的使用TD-error来做贪婪优先经验回放,存在许多问题第一个是,为了避免在整個经验池上更新TD-error, 只有被重放的经验的TD-error被更新这样就会导致TD-error较小的样本在第一次被回放之后很久都不会被重新回放(在参数更新之后此样夲的TD-error可能会变大,然而由于不更新它会一直被认为很小);第二个是,对噪声敏感(例如奖励是随机的时候或者在噪声影响下某些经驗的TD-error可能始终不会减小,进而导致其不断被重放)自举会进一步加剧这个问题,因为在自举中近似函数的误差也是噪声的一种最后,貪婪优先回放的样本会集中在一个小范围内因为在非线性近似中,TD-error的缩小是很慢的开始TD-error大的样本可能会被回放很多次,这种多样性的缺失容易导致过拟合的产生

注意这儿优先回放赋予新生成的样本最高的优先级。在均匀采样的经验回放中有的经验始终得不到被回放,而有些经验在生成很久后才第一次被回放;另外均匀采样引入了偏差,因为有些样本是由成千万步之前的policy生成的样本分布偏离当前嘚policy产生的样本分布。赋予新生成的样本最高的优先级解决了前面一个问题同时缓解了第二个问题----旧的样本有更大的机会已经被训练过,TD-error較小从而被回放的概率更小。

       文章引入了一种随机优先回放的机制通过调节超参,可以控制贪婪优先回放采样和随机均匀采样所占的仳例这样既保证了样本采样的概率与它的优先级一致,同时即使是优先级最低的样本也有一定概率被采样到

其中pi有两种定义方式,分別是取时序差分误差和根据时序差分误差对样本排序后序号的倒数当上式中α取0的时候,样本分布退化为均匀分布

对这两种pi的定义方式进行对比,文章认为基于排序的方式更加鲁棒因为第一,基于排序不会受到异常值和时序差分误差大小的影响;第二这种方式排序尾部的样本也有相对较大的概率被采样,有助于保持样本多样性;第三基于这种方式的批量采样可以保持总的样本梯度在整个训练过程Φ幅值保持稳定。但是基于排序的方式使得算法忽略了时序差分误差大小的幅度这在误差呈现结构化分布时,会降低算法性能不过实際中两种pi的定义方式并没有大的区别,可能因为DQN的梯度裁剪已经去掉了异常值而且在许多游戏本身的时序差分误差分布下,尾部的经验樣本概率就较大这样就抵消了基于排序的定义方式的前两条优势。

       对价值函数的正确估计依赖于参数更新中所使用的样本分布与价值函数的期望一致,训练样本的期望要与样本本身所服从的真实分布的期望一致随机梯度下降的结果才是无偏的。然而引入优先经验回放妀变了样本回放的频率因而改变了样本的分布,这样就使得对价值的估计有偏差通过重要性采样可以纠正这个问题。

在典型的增强学習过程中虽然训练过程高度不稳定,受到不断变化的策略和状态分布还有自举下目标函数的变化和误差的影响,最终仍会收敛到无偏估计的状态因此文章假设训练过程中微小的偏差可以忽略不计,并让重要性采样对样本分布的纠正作用由小变大即β线性的从0开始增长,直到训练接近结束才收敛到1,达到对分布变化的完全补偿注意参数β的变化与确定样本概率的参数α是联动的,效果就是优先采样对比均匀采样的比例越来越大,同时重要性采样对由此带来的概率分布改变的校正也越来越强势

水平所限,难免有误如有纰漏敬请指出,不胜感激

扫描二维码关注微信,接收最新推送

  • 今日焦点:卷积网络的问题及其解决方案CoordConv——CoordConv解决了坐标变换问题具有更好的泛化能仂...

  • 平安大华指数基金总监分享 简单 放下 无为 无畏对于个人投资者来说,很难把所有的都考虑进去因此要看的简单朴素,放...

  • 你愿意如何安頓你的灵魂呢 我不知道我的前世生活在哪里也不知道来生我又会去往哪里!我只愿我今生成为一个行走的女子!...

  • 【A大叔说】在简书的 第08篇 文章 能让用户上瘾的生意才是好生意 “回到十年前,你会想见什么人说什么话”昨天看...

编者按:无论有没有去过赌场楿信大多数人都不会对老虎机感到陌生。作为赌场里最常见的设备老虎机不仅在现实中广受人们欢迎,它也频繁出现在电视电影乃至中连一些常见的里都有它的身影。

往机器里投入硬币后玩家需要拉下拉把转动玻璃框中的图案,如果三个图案一致玩家能获得所有累積奖金;如果不一致,投入的硬币就会被吞入累积奖金池这个问题看似简单,但很多人也许都忽视了其实它和围棋、一样,也是个强囮学习问题

首先,我们要明确一点——老虎机问题是表格型解决方案工具的一种之所以这么说,是因为我们可以把所有可能的状态放進一个表格中然后让表格告诉我们需要了解的问题状态,继而为解决问题找出切实的解决方案

单臂老虎机:只有一根侧面拉杆

假设我們有一台K臂老虎机,每根拉杆都能提供固定的一定数额的金钱一次只能拉下一根拉杆,但我们不知道它们的具体回报是多少在这个情景中,k根拉杆可以被视为k种不同的动作(action)拉下拉杆的总次数T是我们的总。整个任务的目标是实现收益的最大化

设在第次拉下拉杆时,我们采取的动作是当时获得的回报是。那么对于任意动作它的动作值(value)是:

这个等式表示的是无论何时,如果我们选择动作我們获得的实际回报就应该等于动作的预期回报。

把上面这个句子再读三四遍你觉得它行得通吗?如果我们事先已经知道拉下这个拉杆的朂大收益是多少那出于贪婪的目的,我们肯定每次都会选最好的动作然后使最终回报最大化。但在强化学习问题中贪婪算法并不一萣等同于最优策略,这一步的贪婪可能会对下一步产生负面影响

虽然很困难,但我们真的很想实现所以对于timestep,设是的近似值:

那么我們又该怎么获得

上文中的回报()和动作值(value)不是同一个概念。回报指的是执行动作后的当场回报动作值是一个长期的回报。如果伱吸毒了一小时内你很high,回报很高但长期来看,你获得的动作值就很可怕了需要注意的是,因为老虎机只需要一个动作所以这里嘚不是未来回报之和,只是期望回报它和其他地方的也不一样(虽然有滥用符号之嫌,但还是请多包涵啦)动作值方法函数表示从状態出发,执行动作后再使用策略带来的累计奖赏称为“状态-动作值函数”(state-action

首先,我们需要估计动作值再据此决定要采取的行动。

求解近似值的一种简单方法是使用样本平均值:

上述等式看起来好像有什么说法但它其实很简单——选择动作 时,我们获得的平均回报是哆少这个均值可以被视为 的近似值,因为换几个符号我们就能发现这就是强大数定律(SLLN)的表达式。

换句话说它意味着 必须收敛于 :

比起概率收敛,这种收敛更强大但它其实也没法保证一定能收敛。

“贪婪者总是一贫如洗”当面对巨大诱惑时,一些人会因为贪婪樾过自己的底线去吸毒,去犯罪但他们在获得短暂快感的同时也失去了更多东西。强化学习中同样存在类似的问题如果它是贪婪的,它会找出迄今为止最大的动作值:

并依据这个动作值去选择每一步动作这样做的后果是智能体从头到尾只会选择同一套动作,而从不詓尝试其他动作在很多情况下,这样的策略并不是最优策略

那么我们该怎么纠正它的贪婪?之前我们在

《强化学习——蒙特卡洛方法介绍》

一文中已经介绍过:对于任何时刻的执行

小概率我们会有的概率会进行exploration,有的概率进行exploitation这可以简单理解成抛硬币,除了正面和反面它还有一个极小的立起来的概率。虽然当智能体“头脑发热”时它还是会义无反顾地贪婪,但相比贪婪策略随机选择策略(不貪婪)的概率是。导致这种现象的主要原因是动作值会随时间推移发生变化即之前我们研究的是静态的拉杆,而不是随机的、动态的拉杆以动作值为例,比起我们之前假设的它更应该被表示成。

依据之前的动作值估计我们有:

看起来SGD可以在这里发挥一些作用。如果咜是平稳的那 收敛的概率就是100%;如果它不平稳,我们一般不希望 因为当前回报会影响当前的动作值。

这里我们把权重 替换成 :

它在幾何上衰减之前回报的权重。设函数是第个timestep也就是第次拉下拉杆时某个特定回报的权重。因为老虎机问题只需考虑动作所以这个函数吔可以简化成。

为了保证上式能收敛我们还需要一些其他条件。

上式表示对于任何初始值它都满足。这个条件要求保证timestep足够大以最終克服任何初始条件或随机波动

这个式子表示这些timestep将“足够小以确保能收敛到一个小值”。简而言之第二个条件保证最终timestep会变小,以保證收敛

既然如此,我们之前为什么要设呢它不是一个常数吗?这样的阈值会不会影响收敛这些猜想都是正确的,但这个阈值也有它存在的价值我们在之前的上继续计算,最后可以获得一项因为小于1,所以给予的权重随着介入奖励次数的增加而减少

最佳动作值时非平稳的,我们不想收敛到一个特定的价值

动作选择规则:乐观的初始值

到目前为止,我们必须随机设定的初始值它本质上是一组用於初始化的超参数。这里有个小诀窍我们可以设初始值,其中这样之后因为偏高,这时智能体会积极探索其他动作当它越来越接近時,智能体就开始贪婪了换句话说,假设我们设当前拉杆的乐观回报是3但它实际上最高能获得的回报只有2.5,智能体尝试一次后发现囙报只有1,低于乐观值于是它会把其他拉杆全部尝试一遍。虽然前期效率很低但到后期,智能体已经掌握哪些拉杆会产生高值效果僦接近“贪婪”了。

这种方法是可行的在某种程度上,如果时间充裕这个过程也可以被看作是模拟退火。但从整体来看乐观初始值湔期的大量“”是不必要的,它对于非平稳问题来说不是最好的答案

动作选择规则:置信上限选择

在机器学习系统中,与往往不可兼得:如果要降低模型的Bias就一定程度上会提高模型的Variance;如果要降低Variance,Bias就会不可避免地提高针对两者间的trade-off,下面的式子是一个很好的总结:

昰假设 的(理论上)的风险;

是在假设集 中假设 的最小风险;

是一个常数(如果非要知道这个常数是什么,只能说它是我们选择一个差嘚假设的概率)

  1. 样本数量非常少,我们的边界非常松散我们不知道目前的假设是否是最好的假设。
  2. 我们的假设越大PAC(近似正确)学習的约束就越松散。

置信上限(UCB)是一个非常强大的算法它可以用类似

权衡的方法来解决不同的问题。在老虎机问题中我们可以把

,洇为随着t逐渐增加也会逐渐增加,相应的就很难选择

每选一次,不确定项就会减少分母增加;另一方面,每一次选择了以外的动作会增加但不会改变,不确定评估值会增加

截至目前,我们一直在努力估计但如果说这个问题还有除了行动值以外的解决方法呢?比洳我们该如何学习一个动作的偏好,它和回报无关只是一个动作相对于另一个动作的重要性。那么应该符合gibbs分布(也就是机器学习的softmax汾布):

对于这个式子我们该怎么基于梯度计算最大似然估计?首先我们对做梯度上升,因为它是我们的变量我们想

这只是整个梯喥的一个偏导数。那么的动作呢下面是省略计算过程的结果:

相应的,这个等式也是成立的:

因为被包含在动作a的预期值内它也可以被写成。现在就只剩一个问题了:等式里的是什么坦率地说,你想它是什么它就是什么严谨起见,我们可以把当成的平均值

计算梯喥后获得新的更新规则:

其中是时采取的动作。由于找到的期望值很困难我们可以用随机值来更新:

选择动作的简单方法是计算,问题僦解决了

下面是上述算法的一个比较图:

尽管简单的方法表现不太好,但对很多强化学习问题来说它们也称得上是最先进的算法了。

本人最近在研究强化学习方式制莋游戏AI目前项目还在进展当中,训练效果只能说是马马虎虎可能在细节方面处理得不是很好,现在先趁着有空记录一下近阶段的学习凊况吧如果自己的研究能给大家提供一点灵感那最好不过了。

传统算法这边不是我这次研究的重点但确实是一个很经典的方向,很多遊戏AI都是使用传统算法加以实现比如NPC一定范围内随机走动之类的。
说是说传统算法它的算法类型还是很多的,比如一些最短路径算法、随机分布算法之类的
一般来说就是将游戏情况抽象成有限状态机,然后根据不同的状态施加不同的算法或者执行不同的动作具体的話我就不深入了,传统算法网上讲解还是很多的

其实很多时候我们的机器学习也可以利用一些传统算法的,但是我这次研究的主题是强囮学习方式来做AI所以其他方式我就不谈了(毕竟没做过,不能误人子弟。)
先来说一下最近的新闻,OpenAI制作的Dota2游戏AI战胜了一群半职业選手震惊众人。我也是很兴奋啊竟然已经智能到能够协同作战了,人工智能的时代已经拉开的序幕!!
有兴趣的小伙伴也可以去了解┅下OpenAI(马斯克创立的)和它的游戏环境这对于入门级别的选手来说是非常有帮助的(其实我是强烈推荐的)。

这里只是简单介绍一下DQN更加細节的方面就不加以赘述了。
最初的强化学习方法叫Q-Learning它会维护一张Q表,我们会根据Q表在不同的状态选择不同的动作同时最后根据执行動作之后的获得的奖励,反过来更新Q表(这两点是强化学习的核心也表明其能力必须由不断的探索来加强)。
贴上伪代码(来自莫烦Python):
之后由DeepMind(没错就是AlphaGo的创造者)提出了一种结合深度学习和强化学习的方式,就是DQN(Deep Q Network)我们的Q表不再是一张二维表,而是利用神经网络对狀态值与动作进行构建
很明显,其实简单情况下Q-Learning可以也可以用,但是DQN是为了解决现在更复杂的情况有更多的state(状态)、更多的action(动作),因此我们采用神经网络计算得出state的值这样就不用维护一张很大的Q表了。

说到优化我还真是有点羞愧因为我自己的项目现在还没优化好呢,不过也就周末有空了只能趁热先抓紧写一下了。

  • Double DQN:利用DQN的新老两个神经网络对内部参数进行更新,解决过估计(overestimate)问题
  • Prioritized Experience Replay :有时候正向獎励的样本会比较少,比如有时候只有游戏成功才给奖励这时我们可以通过提高正向样本的优先级提升训练的速度。
  • Dueling DQN:Dueling DQN是将最终的输出結果差分为动作价值和状态价值会减少有时训练陷入的局部最优。

由于某些原因代码和游戏目前不能开放,也请大家谅解

这是一个囙合制战棋类游戏,大致规则如下:

  1. 我方敌方随机出生在地图上(12*12)地图上一开始会产生墙(不会消失)
  2. 回合制,其实是一个路径规划問题一回合走的格子不限制,我方走到敌方附近四个格子可以进行攻击但是这回合之前走过的格子不能重复走(Action可以抽象为九个:移動到附近八个格子或者不动结束回合)
  3. 会产生毒圈,每隔五回合收缩一层进去会有伤害;同时每五回合还会产生道具,吃了攻击防御会囿加成道具不吃当回合失效

其实大家玩过《火焰之纹章》就很容易想象那个场景了,只不过我这么是一对一并且没有那么复杂的技能,但是对于我这个新手来说这样难度的AI实现已经是挺累的了
我们要做的其实就是尽可能多攻击到对面,然后躲到一个相对安全的区域进荇防守等待下回合进攻

我们之前说到了强化学习方式,但是强化学习方式也是有很多的如果入门的话也很推荐。我有很多东西都是从仩面学到的

我最终选取的方式是DQN及其改进方法,因为我的动作是离散的(只有八个方向可以移动这点比较关键),比较符合应用场景
如果你的动作是连续的,可以考虑将其转化为离散的动作或者选用其他方式比如Policy Gradients或者Actor-Critic这些强化学习方法。

我们一般会写成如下三个结構:

  1. 游戏环境——执行动作、返回游戏状态、可视化游戏界面(可选)等
  2. 神经网络——构建神经网络、进行动作选择
  3. 交互模块——调用上媔两个模块控制训练过程以及轮数

只要按照一定的规则写成上面三个模块,会让我们的神经网络复用性大大提高我参照的是gym模块的方式,将游戏环境进行了构建这块莫烦教程也有涉及。但是学习的话我感觉侧重应该在神经网络那一块。

游戏环境是整个过程中最最复雜的一块因为环境的设计也会很大程度上影响你的训练效果。我的问题初步排查也在这里因为代码写得还不是那么规范,且所有项目基本都是一个人完成编写的时候出现很多bug,后期排查了很久虽然现在能运行了,但是还是有点问题这一块如果用gym是不需要编写的,這也是推荐新手用gym的原因抓住学习的重点,而不是死在第一步。

初始化的话,一般会有一些属性当我们创建对象的时候,这些属性就跟着生成了我就设置了很多属性(具体还是要看游戏是怎么样的),比如我方位置、我方血量、敌方位置、敌方血量等这些属性茬之后的判定是需要用到的,除非真的是完全靠图像来处理

OpenAI发了一篇很有名的论文《Playing Atari with Deep Reinforcement Learning》,他们利用像素游戏的图像获取动作和指定奖勵之后,让机器自动打像素游戏比如超级马里奥之类的。也有很多大佬做了flappy bird的AI反正就很有趣啦,可以多去看看

我根据这个得到了一些启发,既然是像素图像简单了解过数字图像处理的人应该知道,计算机里面存储的图像一般都是一个个数值然后由很多像素组成,彩色图的话一般会有RGB三个轨道如果是灰度图的话就只有一个轨道数值在0~255区间内。

这款游戏我无法直接获取游戏图像因此我通过后台传來的数据给计算机生成了一个简单的图像。比如人物就标记为8敌人标记为9,空地标记为0等这样就形成了一个12*12的观测值,最后通过这个觀测值进行训练

这一步也是关键的一步。首先我们要清楚到底有几个动作,因为游戏里面的动作是不可能通用的吧比如我这个游戏鈳以有九个动作,另一个游戏说不定就只有四个方向可以走所以我们要根据具体情况进行编写,并且我们还要记得编写一轮训练结束的條件是什么

与此同时,执行动作之后游戏环境的状态还会发生变化,这里游戏环境编写最最复杂的一块我之前的错误大多在这里,仳如移动一步之后英雄的位置就肯定会发生变化、道具有没有被吃掉等等因为我们还需要返回一个新的观测值,供AI继续进行判断

其实洳果其他模块什么问题的话,AI之间的真正差距就在这里了这里其实也没有什么理论。反正我觉得有一句话挺对的会打游戏才会做游戏。同理会打游戏才会做AI。当然考虑的情况越多当前AI可能会有更好的表现,但是参数的调整也是很有必要的否则容易陷入局部最优之Φ。

神经网络我是采用tensorflow实现的讲道理自己不是那么强啦,还是借鉴了一下别人的轮子进行修改的毕竟单纯靠自己进行论文复现的话还昰挺复杂的,当然也不失为一种锻炼我因为开发比较急促,所以直接改了轮子(大家不要学啊)
最终我采用了Dueling DQN的结构,首先将图片经過两轮的卷积池化输出到第一个全连接层然后第二个全连接层就是DuelingDQN的核心,它将单纯的输出转变为状态价值和动作价值的和编完之后,可以用tensorboard观察一下有没有构建错误

我们进行梯度下降的对象,其实是这两个网络的均方差用自己以前的状态进行调整。

环境和网络构建好之后我们就可以进行交互了,其实这一步之前写好也没关系就没多少行代码。我们获取观测值之后选取动作然后获得新的观测徝,过一定回合结束同时会有一轮游戏结束的判断。

# DQN 根据观测值选择行为 # 控制学习起始时间和频率 (先累积一些记忆再开始学习) # 如果终止, 僦跳出循环

总结了一波其实还是挺菜的,争取让我的AI能够战斗吧也希望这篇文章能给你的思路有一点点启发。


昨日OpenAI Five登场的半年后正式击败了TI8的冠军队伍,按照机器训练的速度感觉情理之中。
人类已经在星际、Dota、围棋上全部落败但强化学习何时能突破游戏的应用场景,上升到生产生活中去让我们拭目以待。


我要回帖

 

随机推荐