您的位置 首页 > 数码极客

[dqn]大崎娜娜

强化学习,通俗地讲就是通过agent,也就是动作的发起者,对环境造成一个影响,环境接受该动作后状态发生变化,同时产生一个强化信号(奖或惩)反馈给Agent,Agent根据强化信号和环境当前状态再选择下一个动作,选择的原则是使受到正强化(奖)的概率增大。选择的动作不仅影响立即强化值,而且影响环境下一时刻的状态及最终的强化值。在强化学习中,包含两种基本的元素:状态与动作,在某个状态下执行某种动作,这便是一种策略,学习器要做的就是通过不断地探索学习,从而获得一个好的策略。

Q-Learning

本文重点介绍的Q-learning算法就是强化学习中的一种 values-based 策略算法,其目的是近似出一个用于评估每一步动作的价值的Q值函数。Q即为Q(s,a)就是在某一时刻的 s 状态下(s∈S),采取动作a (a∈A)动作能够获得收益的期望,环境会根据agent的动作反馈相应的回报reward:r,所以算法的主要思想就是将State与Action构建成一张Q-table来存储Q值,然后根据Q值来选取能够获得最大的收益的动作。

我们先来看看完整的Q-learning算法代码,结合其中的注释可以更好理解算法的思想:



下面是环境部分的代码:


接下来我们通过一个找两个节点之间的最短路径的例子来进一步理解Q-learning算法。

Q-learning作为一种无模型强化学习算法。算法的目标是学习一个策略,它告诉agent在什么情况下采取什么行动。Q-learning不需要一个环境模型,它可以处理随机变化和奖励的问题而不需要一个自适应过程。

接下来我们看看Q-learning的实现方法:

首先我们使用networkx库来定义一个图

随后对图进行可视化操作




我们将除了到达节点10以外的所有动作的奖励都设置为0,也就是说目前奖励非零的动作只有从8到10或从9到10。和奖励值一样,Q值也是在矩阵中初始化的。为了消除非法动作,我们把没有边相连的顶点间的动作Q值设置为-100。例如,在图中不可能直接从2到10,因此它的Q值设置为-100。可能的操作的Q值被初始化为0。让我们看一下R (Reward)和Q矩阵:

输出R矩阵的结果为:

(Q)

输出Q矩阵的结果为:

现在,我们定义一个函数,函数的输入是一个开始节点和探索率,探索率用于指导探索的随机性,函数的返回值是下一个节点。如果没有探索率带来的随机性,我们的算法就只会选择具有最高Q值的动作来作为下一步行动。

接下来就应该定义我们的学习函数,从随机节点开始并进行50000次行走的迭代训练来提高Q值。

我们来看看迭代训练后得到的新的Q矩阵。

最后我们就可以通过在决定每一个动作时从Q矩阵中选择最高的Q值来最终找到从节点0到节点10之间的最短路径

因此可以看出,从节点0先前进到节点4,随后中转节点1,再到节点8,最后到达节点10,这是所有从0出发且能够到达10可行方案中路径最短的方案。

Deep Q-Learning

接下来就可以进入正题看看论文《Playing Atari with Deep Reinforcement Learning》的核心内容了。

文章提出了第一个可以从高维输入中直接学习到控制策略的深度学习模型。这是一个卷积神经网络,基于Q-learning进行训练,它的输入就是像素点,输出是一个可以预估未来奖励的值函数。这样的做法具有三个显著优点:

1、具备通用性,一样的网络可以学习不同的游戏(当然,游戏具有相似性);

2、采用End-to-End的训练方式,无需人工提取Feature(比如游戏中敌人的位置等等);

3、通过不断的测试训练,可以实时生成无尽的样本用于有监督训练(Supervised Learning)。

我们使用同样的算法和网络结构去学习Atari 2600的游戏,并且发现在6个游戏上它超过了之前所有的方法并在三个游戏上超过了人类专家。

文章的背景和动机主要是因为强化学习Q-learning很好使,但是它不适宜处理高维数据,奖励函数需要人为地去设定,因此,很自然的我们就想到,是不是可以用神经网络去拟合一个奖励函数(当然,这个过程遇到了无数的困难)。通过这种方式,我们就可以构建一个比较通用的模型去处理不同的问题,就比如在本文中,各种游戏都可以玩,模型都能很好的学习到控制策略,甚至连超参数都不需要改。通过这种方式,我们希望可以解决Q-learning的通用性的问题。

这个实现的过程主要会遇到以下问题:

1、DL需要大量带标签的样本进行监督学习;RL只有reward返回值,而且伴随着噪声,延迟(过了几十毫秒才返回),稀疏(很多State的reward是0)等问题;

2、DL的样本独立;RL前后state状态相关;

3、DL目标分布固定;RL的分布一直变化,比如你玩一个游戏,一个关卡和下一个关卡的状态分布是不同的,所以训练好了前一个关卡,下一个关卡又要重新训练;

4、过往的研究表明,使用非线性网络表示值函数时出现不稳定等问题。

针对这些问题,作者分别提出了对应的解决方法:通过Q-Learning使用reward来构造标签(对应问题1);通过experience replay(经验池)的方法来解决相关性及非静态分布问题(对应问题2、3);另外就是通过一个神经网络产生当前Q值,使用另外一个神经网络产生Target Q值的方法来解决问题4,引入target_net后,再一段时间里目标Q值是保持不变的,一定程度降低了当前Q值和目标Q值的相关性,提高了算法稳定性。

接下来简单介绍论文的相关背景工作:TD-gammon是在此之前最出名的强化学习相关的方法,TD-gammon使用了MLP (Multi-layer percetron)也就是一般的神经网络,一个隐藏层(hidden layer)来训练。并且将其应用到了玩backgammon游戏上取得了人类水平。但是很可惜的是,当时人们把算法用到其他游戏象棋围棋并不成功,导致人们认为TD-gammon算法只适用于backgammon这个特殊的例子,不具备通用性。

本质上,使用神经网络是为了模拟一个非线性的函数(value或者policy都行,比如flappy bird,设定它上升到一个高度下降这就是一个分段函数)。人们发现,将model-free的算法比如Q-learning与非线性函数拟合的方法(神经网络是一种)很容易导致Q-network发散。因此,大部分的工作就使用线性的函数拟合(linear function approximation),收敛性好。

TD-gammon使用了类似于Q-learning的算法,用多层感知机来逼近value function,这种方法在西洋双陆棋上仅仅通过自对弈就取的到远远超过其他算法和人类的水平。受这个成果的激励,TD-gammon被用在其他的问题上,比如其他棋类,或者是玩游戏。但是效果都不大理想,这可能是因为在掷色子的过程中,掷色子的随机性帮助算法探索状态空间,同时使得值函数变得更加稳定。后来,使用非线性函数的Q-learning算法在实践中被发现无法收敛。线性函数比非线性函数有更好的收敛性。

值得一提的是,Deepmind并不是第一个想到把深度学习和增强学习结合在一起的。之前也有人尝试用深度神经网络来改进估计环境environment,估值函数value function或者policy策略。这实际上是三个Deep Learning与Reinforcement Learning结合的思路并且结合Q-learning发散的问题也被Gradient temporal-difference方法部分解决。这些方法用在使用非线性来估计固定策略或者使用线性来估计一个控制策略还是证明可以收敛的。但是这些方法还没有拓展到非线性控制nonlinear control。

文章中所使用的Atari 2600 模拟器,使用它做增强学习的研究之前就有。但作者采用的是线性函数预计和获取的视觉特征(linear function approximation and generic visual features) ,之前是人工提取特征后再进一步进行降维。而HyperNEAT使用神经网络来取代一个策略。但不同游戏用不同的网络。

当前深度学习的方式核心在于采用大量的数据集。然后使用SGD进行权值的更新。所以,这里的目标就是将增强学习的算法连接到深度神经网络中。然后能直接输入RGB的原始图像。并使用SGD进行处理。由此可见,作者对照TD-gammon有如下的改进之处:实际上TD-gammon的思路就是上面的思路。仅仅是训练是直接获取experience样本进行训练。也就是on-policy。而关键是这个算法是20年前的了。所以。经过20年的硬件发展以及深度学习的发展,没有理由说无法在这上面取得突破。相比于TD-gammon的在线学习方式。Deepmind使用了experience replay的技巧。简单地说就是建立一个经验池。把每次的经验都存起来。要训练的时候就随机地拿出一个样本来训练。这样就能够解决状态state相关的问题,与此同时,作者提出的动作选择采用常规的ϵ-greedy policy,即贪心随机策略,就是小概率选择随机动作,大概率选择最优动作。然后因为输入的历史数据不可能是随机长度,这里就采用固定长度的历史数据,比方deepmind使用的4帧图像作为一个状态输入,这整个算法就叫做Deep-Q-Learning。

算法分析

1. 训练分成M个episode,每一个episode训练T次。我们的理解就是比方玩游戏,一局是一个episode,一局里面有非常多时间片,就训练多少次,次数不固定。重新启动新的episode主要是初始化state 作为新的第一个,而不是用上一局的最后的状态作为state输入。

2. 实际上每一个循环分成两部分:一部分是输出动作并存储。一部分是随机从经验池里取出minibatch个transitions,然后计算目标函数,最后依据损失函数通过RMSProp更新参数。

算法的突出优点是其每一步的经验都能带来非常多权值的更新,拥有更高的数据效率;其次就是experience replay的优势。打破数据的相关性,减少数据更新的不确定性variance;experience replay还有一个长处就是不容易陷入局部最优解或者更糟糕的不收敛。假设是on-policy learning,也就是来一个新的经验就学一个,那么下一个动作就会受当前的影响。比如最大奖励对应的动作是向左,那么就会一直向左。使用experience replay 获取的行为的分布就比较平均,就能防止大的波动和发散,也因此,这是一个off-policy的学习方式。在实际应用中,仅仅存储N个经验在经验池里的这种方法也具有局限性,那就是这个经验池并没有区分重要的转移transition,总是覆盖最新的transition,所以,采用有优先级的使用memory会是一个更好的方式。

文章中另一个值得一提的创新点是其预处理与网络模型架构。由于输入是RGB,像素也高,因此对图像进行初步的图像处理,变成灰度矩形84*84的图像作为输入,有利于卷积。接下来就是模型的构建问题,毕竟Q(s,a)包括s和a。一种方法就是输入s和a。输出q值。这样并不方便,因为每一个a都需要forward一遍网络。针对这个问题,Deepmind的做法是神经网络仅仅输入s,输出则是每一个a相应的q。这样的做法的长处就是仅仅要输入s。forward前向传播一遍就能够获取全部a的q值,毕竟a的数量是有限的。

实验

文章的实验一共测试了7个游戏,实验的首要特点是其统一了不同游戏的reward值,胜地为1。负的为-1。其它为0。这样做设计的长处是限制误差的比例,而且能够使用统一的训练速度来训练不同的游戏。第二个特点是作者使用了RMSProp算法,就是minibatch gradient descent方法中的一种,其采用的梯度下降方式是用梯度除以一个动态的均值,做出发之前对均值做四舍五入操作。当然梯度下降还有非常多种方法,包括SGD、Momenturn、NAG、Adagrad、Adadelta和Rmsprop等。第三个特点是算法的学习率采用ϵ-greedy策略,前一百万次从1 下降到0.1。然后保持不变,这样一开始的时候就保持较高的随机性,不至于轻易陷入局部最优,越往后越倾向于使用最优的方法。最后一点是作者使用了frame-skipping technique,意思就是每k帧才运行一次动作,而不是每帧都运行。在实际的研究中,假设每帧都输出一个动作。那么频率就太高,基本上会导致失败。在这里,中间跳过的帧使用的动作为之前最后的动作。这和人类的行为是一致的,人类的反应时间仅仅有0.1,也是采用相同的做法。而且这样做能够提速明显的。那么这里Deepmind大部分是选择k=4。也就是每4帧输出一个动作。怎样在训练的过程中预计训练的效果在RL上是个挑战,毕竟不像监督学习,能够有training set和validation set。那么仅仅能使用奖励,或者说平均的奖励来判定,也就是玩得好就是训练的好,这样的做法存在问题就是奖励的噪声非常大,由于非常小的权值改变都将导致策略输出的巨大变化。

算法评估

算法对照了Sarsa算法和 Contingency算法,实验表明通过学习部分屏幕的表达增强了特征。以往的这两种方法的特征提取都采用传统的图像处理方法比方背景减除的,特征提取方式落后,而Deepmind的算法是原始输入计算机自己去检测物体,直接攻克了检测和跟踪的问题,直接结果也显示了其算法的快速收敛能力和计算优度,当然文章也还存在需要改进的地方,首先是由于输入的状态是短时的,所以只适用于处理只需短时记忆的问题,无法处理需要长时间经验的问题。(比如玩超级玛丽;另外就是使用CNN来训练不一定能够收敛,需要对网络的参数进行精良的设置才行。对此我们提出一些改进的思路,例如能否采用LSTM网络来增强记忆性,以及通过改进Q-Learning的算法提高网络收敛能力。

下面是论文的主要核心代码:




责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“dqn,大崎娜娜,dqn是什么意思,dqn算法,dqn和qlearning,区别”边界阅读