zoukankan      html  css  js  c++  java
  • 论文笔记之:Human-level control through deep reinforcement learning


    Human-level control through deep reinforcement learning

    Nature 2015 Google DeepMind

     

    Abstract 


     

      RL 理论 在动物行为上,深入到心理和神经科学的角度,关于在一个环境中如何使得 agent 优化他们的控制,提供了一个正式的规范。为了利用RL成功的接近现实世界的复杂度的环境中,然而,agents 遇到了一个难题:他们必须从高维感知输入中得到环境的有效表示,然后利用这些来将过去的经验应用到新的场景中去。显著地,人类和其他动物看起来可以通过一个和谐的RL 和 层次感知处理系统的有效组合进而解决这个问题。前者通过丰富的神经数据解释了由多巴胺能神经产生的相位信号和 TD Reinforcement learning 算法之间的显著的并行得到验证。于此同时, RL agents 在一些领域已经取得了很多的成果,之前他们的应用基本上被限制在领域内,即:手工设计的有用的特征,全部观测到的domains,低维的状态空间等等。此处,我们利用最近发展迅速的深度神经网络来开发一种新颖的智能 agent,叫做: deep Q-network, 利用end-to-end 的RL, 可以直接从高维感知输入中学习到成功的策略。我们在具有挑战性的经典Atari 2600 games,测试了该 agent。实验证明,该 deep Q-network agent,仅仅接收像素 和 游戏得分 作为输入,利用相同的算法,网络设计 和 超参数可以超过之前任何的算法,达到和专业游戏玩家的水平。该工作桥接了 高维感知输入 和 动作,能够处理各种具有挑战性的任务。

      

         我们要设计一个算法,其能够开发一个广泛的处理多种任务的能力 ---- 一般的人工智能,无法达到这个效果。为此,我们发展了一种新的 agent, a deep Q-network(DQN),可以结合RL 和 深度神经网络。特别注意的是,最近深度神经网络的发展,几个层的结点用来建立逐渐更加抽象的数据表示,已经使得其可以直接从原始感知数据中,学习到像物体的种类这样的概念。我们用一个特别成功的结构,深度卷积网络,其利用平铺的卷积滤波来模仿感受野的效果---> uses hierarchical layers of tiled convolutional filters to mimic the effect of receptive fields. 所以,探索图像的局部空间关系,构建对自然转换的鲁棒性,像:视角和尺寸的变换。

     

      我们通过一系列的 observations, actions and rewards,考虑 agent 和 环境交互的任务。该 agent的目标是:为了得到最大的累积奖赏,而选择动作。正式的,我们利用一个深度卷积网络来近似最优的动作-值函数(the optimal action-value function):

      $Q(s, a) = max_{pi} E [ r_t + gamma r_{t+1} + gamma^2 r_{t+2} + ... + |s_t = s, a_t = a, pi ]$,

      

      RL 比较出名的一个问题就是:当用一个非线性函数估计,如:一个神经网络来表示 动作-值函数时,就会导致不稳定或者不收敛。这个不稳定主要有几个原因导致的:序列观察的相关性(the correlations present in the sequence of observations), Q值的小的更新,可能会显著的改变策略,从而改变数据分布,以及动作-值(Q) 和 目标值之间的关系。我们利用新颖的Q-Learning的变种来解决上述不稳定的问题,主要用到两个idea:

      1. 我们利用由生物学启发出来的机制,称为:experience replay,在数据中生成不规则分布。从而消除了观测序列的相关性,使得在数据分布上光滑的变化。

      2. 我们利用一个迭代更新来朝向目标值(target values) 调整 动作-值 Q ( the action-value),仅仅周期性更新,从而减少了与目标的联系。

     

      于此同时,在RL之中存在其他稳定的方法来训练神经网络,像: netral fitted Q-iteration,这些方法涉及到上百次迭代的训练网络。所以,这些方法不像我们的算法,不适合用于大型神经网络。我们利用像图1中所示的深度卷积神经网络来参数化估计的值函数 $Q(s, a; delta_i)$,其中 $delta_i$ 是第i次迭代的Q-network的参数。为了实现经验重现,我们在一个数据结合$D_t$中,在每一次时间步骤 t,存储 agent 的经验,$e_t = (s_t, a_t, r_t, S_{t+1})$。在学习的过程当中,我们采用 Q-leaning 更新,在经验样本上 (s, a, r, s') ~ U(D),从存储的样本中随机均匀的绘制。第i次迭代的Q-learning 更新,采用下列的损失函数:

      其中,$gamma$ 是折扣因子,决定了 agent的视野。

     

         

     

     

     

     


     

      The Methods:

      

      Preprocessing:直接处理 Atari 2600 帧,图像大小是 210*160。我们为了降低输入的维度,采取了一个基础的预处理的步骤,用 Atari 2600 仿真器来进行人为处理。首先,为了编码单张图像,我们采用当前编码帧和前一帧每一个像素点色彩值的最大值。移除闪烁是很有必要的,因为一些物体仅仅出现在奇数帧,而有一些则只出现在偶数帧,由于有限数量的精灵导致的 artefact 会立马显现。 第二,我们然后提取 Y 通道,也就是经常说的 亮度,然后将其resize成 84*84的。 

     

      Code availability.   代码链接:https://sites.google.com/a/deepmind.com/dqn

     

      Model architecture. 利用神经网络,有好几种不同的方法来参数化 Q。因为 Q 映射了 历史-动作对(history-action pairs)到他们的Q值,历史  和 动作 已经在之前的方法中被用于神经网络的输入。这种结构的主要缺点是:一个单独的前向传播需要计算每一个动作的Q值,导致计算代价和动作的数量成比例上升。我们则使用这样的一个结构,即:每一个可能的动作有一个单独的输出,仅仅将状态表示输入给神经网络。输出对应了每一个动作为每一个状态预测的Q值。这种结构的优势是:在一个给定的状态下,对于所有可能动作的Q值的计算,在网络中仅仅需要一个前向传播即可。

     

      图1中展示的结构,给出如下的描述:传入给神经网络的输入是预处理映射完毕后的 84*84*4 的图像。

      第一个隐层:卷积核大小为 8*8 , 然后有 32个filter,步长为4;后面跟一个非线性激活函数;

      第二个隐层:卷积核大小为 4*4, 然后有 64个filter,步长为2;后面跟一个非线性激活函数;

      第三个卷积层,64个filter,卷积核大小为 3*3,步长为1,后面也跟着一个 rectifier;

     

      最后的隐层是:全连接层,由512个rectifier units 构成;

      输出层是 一个全连接,每一个有效地动作对应一个输出。

     

      作者考虑在游戏中,有效动作的数量 从4~18之间变换。

     

      Training details

      每一个游戏,一个网络:所有的游戏都用同样的网络结构,学习算法,以及超参数设置。由于游戏的分数都不一样,所以作者将所有的 positive reward 设置为1,negative reward 设置为 -1,不变化的则设置为0. 

      训练过程中行为策略是 贪心算法。

      像之前的算法一样,本文也是采用 跳帧技术,即: the agent 看并且选择动作每隔 k 帧,而不是每一帧都做。其最后一个动作在跳过的帧上重复。

      

     


     

      Algorithm

      我们考虑这样的任务,在一个由动作,观察 和 奖励构成的序列中,agent 和环境交互。每一个时间步骤, the agent 从合法的游戏动作中选择一个动作 $a_t$。然后将此动作传输给模拟器,以修改其内部状态 和 游戏得分。总的来说,该环境可能是随机的。agent 看不到模拟器的内部状态;但是可以看到从模拟器传来的图像,即:代表当前屏幕图像信息的由像素构成的向量。此外,其还接收到代表游戏得分变换的奖励 $r_t$。既然总的来说,游戏得分可能依赖于之前序列的动作和观察;关于某动作的反馈,可能经过几千次的时间步骤才会接收到。

     

      因为 agent 仅仅观察到当前的屏幕,所以该任务是部分观测的,许多模拟器的状态是有感官上的锯齿现象的(即,仅仅从当前屏幕 $x_t$ 不可能完全的明白当前的情况)。所以,动作和观察的序列,$s_t = x_1, a_1, x_2, ... , a_{t-1}, x_t$, 输入给算法,然后依赖于这些序列进行游戏策略的学习。模拟器中的所有序列,都假设会在有限时间步骤内结束。这种形式就构成了一个大而有限的 马尔科夫决策过程(MDP),其中的每一个序列都是单独的状态。简单地将完整的序列 $s_t$ 作为第 t 个时刻的状态描述。

     

      agent 和 模拟器交互的目标是能够获得最大的累积奖励。我们做出一个标准的假设,即:奖励的奖励都被一个衰减因子 $gamma$ 相乘,(设置 $gamma = 0.99$),定义时刻t的折扣反馈为:

      其中,T 是游戏结束的时刻。

      我们定义 最优的 动作-值函数 $Q^*(s, a)$,作为最大的期待反馈,在观察了一些序列 s 之后,然后才去一些动作 a, $Q^*(s, a) = max_{pi} E[R_t|S_t = s, a_t = a, pi]$,其中 $pi$ 是映射序列到动作的一个策略。

     

       最优的动作-值函数遵循一个重要的等式,即:贝尔曼等式(Bellman equation)。这是基于如下的观察:如果序列 s‘ 在下一个时间步骤最优的值 $Q^*(s', a') $ 对于所有动作 a’ 来说都是已知的,那么最优的策略应该是选择这么一个动作 a',从而可以得到最大的期望值 $r + gamma Q^*(s', a')$:

      $Q^*(s, a) = E_{s'}[r + gamma max_{a'} Q^*(s', a')|s, a]$

      许多RL 算法基本的idea都是:利用贝尔曼等式来预测 动作-值函数 作为一次迭代更新,$Q_{i+1}(s, a) =  E_{s'}[r + gamma max_{a'} Q_i(s', a')|s, a]$。随着 i 趋于无穷大,这样的值迭代算法收敛到最优动作值函数,$Q_i -> Q^*$。实际上,这些基础的方法是不切合实际的,因为每一个动作值函数分别预测给每一个序列,没有任何 generalization。 实际上,用一个函数估计来预测 动作值函数是很common的。在RL领域经常利用线性函数逼近器,有时候也会用非线性函数,如:神经网络。我们提到 带权重的神经网络函数逼近器称为:Q-network。一个Q-network 可以通过在第 i 次迭代来调整参数 $ heta_i$而得到训练,以此降低贝尔曼等式中的均方误差 (mean-squared error),其中最优目标值 $r + gamma max_{a'}Q^*(s' , a')$ 利用之前一些迭代得到的参数 $ heta_i^-$ 替换为估计目标值 $y = r + gamma max_{a'}Q(s', a'; heta_i^-)$。这就会使得 损失函数 $L_i( heta_i)$ 的序列随着迭代次数 i 而改变:

      注意到,目标依赖于网络的权重;而有监督的学习,在学习开始之前是固定的。在每一个优化阶段,当优化第 i 个损失函数 $L_i( heta_i)$时,固定之前迭代的参数 $ heta_i^-$,就会有一系列定义好的优化问题。最后一项是 目标的方差,不依赖于我们当前优化的参数 $ heta_i$,所以可以暂时忽略。区分不同的损失函数及其对应的权重,我们有如下的梯度:

      

      注意到,本文的算法是:model-free and off-policy。

      Model-free:因为本文算法是直接从模拟器中得到的样本来解决强化学习任务,而没有显示的预测奖赏和转移概率 $P(r, s'|s, a)$。

      Off-policy:学习贪婪策略 $a = argmax_{a'} Q(s, a'; heta)$,与此同时,采用一个确保有足够状态空间探索的行为分布。实际上,该行为分布是经常被选中通过一个 $epsilon-greedy$ 策略,有 $1-epsilon$的概率来选择一个贪婪策略,有 $epsilon$ 的概率随机的选择一个 action。

      其实,off-policy 更主要的是讲:策略评估 和 策略改进的不是同一个策略。例如:Q-learning 评估的是 贪心策略,而改进的是 原始策略(即,没有采用贪心算法策略)。这里比较容易懵逼啊。。。呃呃呃。。。

      

      


      Training algorithm for deep Q-networks.

      训练深度 Q-network 的算法在 Algorithm 1中。基于Q,根据 贪心策略来指导 agent 选择和执行动作。由于,将任意长度的历史作为神经网络的输入是有困难的,我们的 Q-function 作用于 利用上述函数 产生的固定长度表示的历史。该算法从两个角度 修改了 Q-learning,使其适合大型神经网络的训练并且不会发散。

     

      首先,我们利用称为 Experience Replay 的技术,存储每一个时间步骤 agent的经历,$e_t = (s_t, a_t, r_t, s_{t+1})$,在该算法的内部循环中,我们对 experience 样本 采用 Q-learning 更新,或者 minibatch updates,$(s,a,r,s') ~ U(D)$,从存储的样本池子中随机的抽取。

     

      该方法对比传统的 online Q-learning算法有以下几个优势

      1. Experience 的每一个步骤经常用到许多权重更新中去,允许更好的数据效率。

      2. 由于样本之间强烈的相关性,直接从连续的样本中进行学习是 inefficient的;样本的随机化破坏了该相关性,从而减少了更新的方差。

      3. 当 on-policy 的学习时,当前的参数决定了用来训练参数的下一个数据样本。(when learning on-policy the current parameters determine the next data sample that the parameters are trained on.)

      例如:如果最大动作是向左移动,然后训练样本就由左边的样本主宰;如果向右移动,训练样本的分布也会交换。

      很容易发现,不想要的反馈循环(feeback loops)是如何产生的,参数也可能在一个 poor 的局部最小困住,或者直接就悲剧的发散了。

     

      第二个改动是:

      为了改善我们方法的稳定性,在 Q-learning 更新的过程中,我们使用了额外的 目标网络(target network)来产生目标 $y_j$。

      确切的讲,每执行 C 次迭代,我们将网络 Q 克隆下来,然后得到一个目标网络(target network Q'),然后用这个目标网络Q' 来在接下来的 C 次迭代中来产生 Q-learnng的目标 $y_j$。这个改变,使得算法相对标准的 online Q-learning 来讲,更加稳定,因为 普通的 Q-learning 一次更新增加了 $Q(s_t, a_t)$ 经常对于所有的 a 来讲,也增加了 $Q(s_{t+1}, a)$,所以就增加了目标 $y_j$,可能会导致震荡或者策略的发散。用一组较老的系数来产生 target,增加了 更新Q的时间 和 更新能够影响到目标 $y_j$ 的时间的延迟,使得不容易发散。

     

      还有一个“黑科技”,即:

      此外,作者还发现将更新 限制在 -1 到 1之间 能够提升算法的有效性。因为所有的 |x| 的 positive value 的梯度是1,而 negative value 的值为 -1,将平方差剪切到 -1 和 1 之间就对应了 利用一个绝对值损失函数来处理 在(-1,1)间隔之外的误差(error )。这种 error clipping 方式进一步的改善了算法的稳定性。

     

     


     

       总的算法流程如下:

     

      

     

     

     

  • 相关阅读:
    Eclipse配置Maven私服
    ubuntu下使用Nexus搭建Maven私服
    Ubuntu系统的Redis安装配置
    centos7.6安装dpdk-stable-19.11.10
    微软的分布式应用框架 Dapr Helloworld
    Caddy源码阅读(二)启动流程与 Event 事件通知
    Caddy源码阅读(一)Run详解
    Caddy 源码全解析
    假装前端工程师(一)Icework + GitHub pages 快速构建可自定义迭代开发的 react 网站
    caddy & grpc(3) 为 caddy 添加一个 反向代理插件
  • 原文地址:https://www.cnblogs.com/wangxiaocvpr/p/5580963.html
Copyright © 2011-2022 走看看