zoukankan      html  css  js  c++  java
  • Reinforcement Learning学习笔记|Deep Q-learning算法

    An introduction to Deep Q-Learning: let’s play Doom

    在上一篇博文,我们学习了Q-learning这种用来产生Q-table的算法。但是我们可以发现,产生和更新Q-table的过程在大的状态空间环境下效率低。

    在这篇文章中,我们学习Deep Reinforcement Learning

    如今,我们会创建Deep Q Neural Network,而不是使用Q-table,我们将使用神经网络。

    在这篇文章,我们学习到:

    ·        What is Deep Q-Learning (DQL)?

    ·        What are the best strategies to use with DQL?

    ·        How to handle the temporal limitation problem

    ·        Why we use experience replay

    ·        What are the mathematics behind DQL

    ·        How to implement it in Tensorflow

    Adding ‘Deep’ to Q-Learning

    我们使用了Q-learning 函数来创建和更新Q-table。可以将这个表格看做帮助我们找到未来的最佳奖励的动作。这是一个不错的策略,但是不是可伸缩的。

    想象一下我们这次要做的事情,我们要创建一个agent来学习如何,玩Doom游戏,这是一个有着巨大的状态空间的超大环境,创建和更新Q-table对我们这个环境来说将会效率很低。

    在这种情况下,最好的idea就是创建一个神经网络,这个网络会根据给出的当前状态近似地给出不同行为的Q-value。

    ‎‎

    How does Deep Q-Learning work?

    我们的Deep Q Network 取四个框架作为输入,这些框架被传输进网络,然后输出一个在当前状态下,对于每一个可能的行为其对应的Q-values。我们需要选择向量中最大的值做我们的最佳Action。

    开始的时候表现不好,时间久了表现变得优异。

    Preprocessing part

    预处理是一个重要的步骤,我们想降低状态的复杂性,来减少训练时所需要的计算量。首先我们将我们的每一个状态灰度处理(因为演示对于我们的结果的得出并不能给出重要的信息,这次降低了2/3),接下来,我们精简帧,之后,我们降低帧的尺寸,最后我们把4个子帧叠加在一起。

    Why?

    为了处理时序限制的问题。因为多帧可以看出物体的运动情况。当然也可以使用LSTM。

    Using convolution networks

    帧需要被三层卷积处理,这些层允许你对图像进行空间的关系处理,同时,你也可以通过这些帧得到一些控件属性。

    在每一个卷积层将会使用ELU作为激活函数,ELU已经被证明是一个很好的激活函数。即我们使用待遇ELU激活函数的全连接层和一个输出层来产生每一个action的Q-value估计。

    Experience Replay: making more efficient use of observed experience

    经验重现会帮助我们处理以下两件事情:

    ·        Avoid forgetting previous experiences.

    ·        Reduce correlations between experiences.

    Avoid forgetting previous experiences

    我们现在有一个大问题,就是权重的多边性,因为在action和state之间有着高相关性。

    对于增强学习来说,在每一个时间点,我们接受一个元组(state, action, reward, new_state),我们从中学习,之后得到经验。

    我们的问题是我们从同我们的环境交互到我们的神经网络给了一系列的序列实例,但是,这样会趋于忘记之前的经验,因为旧的经验会被新的经验复写。

    因此,如果可以通过多次学习利用之前的经验,将会变得更加有效。我们的解决方案是创建一个重现缓冲池,它会存储与环境交互得到的经验元组,并且我们会将小量的元组喂给我们的神经网络。

    可以吧重现缓冲池想象成一个每一份文件都是经验元组的文件夹,你通过与环境交互丰富这个文件夹,之后你随机选择一些文件喂给神经网络。这样会防止神经网络只从刚刚完成的任务学习的情况发生。

    Reducing correlation between experiences

    We have another problemwe know that every action affects the next state. This outputs a sequence of experience tuples which can be highly correlated.

    If we train the network in sequential order, we risk our agent being influenced by the effect of this correlation.(该段文字可以通过以下的实例进行理解)

    通过从重现缓冲池采样,我们可以打破这种的关联,这会防止动作和值震荡或者灾难性发散。

    用一个例子来说明:假设我们玩一款FPS游戏,在游戏中,怪兽可以出现在左边或者右边,我们的目标是射中关守,这里有两把枪和两种动作,向左或者向右。我们根据经验得知,如果我们射中怪兽,下一次怪兽出现在同样方向的概率是70%,在这个案例中,这是我们经验元组之间的关系。假设怪兽出现在右侧,我们射中,又出现在右侧又射中,循环以往。问题就是,这种方法一直在增加用右侧枪的值。如果我们没有看到一些左边的样本,那么我们的agent肯会不管怪物在哪里出现都会选择右侧,这是不理智的。

    我们有两种策略去处理这个问题。

    首先,我们在与环境交互的时候停止学习,我们应该尝试不同的事情,即随机探索状态空间,我们要将这些经验存入重现缓存池。

    接下来我们回忆这些经验并从中学习,结束后,我们用更新后的值函数玩游戏。

    这将帮助我们避免一直学习同一个动作,这种方法可以被看做一种监督学习的方法。在以后的文章中我们可以看到“优先经验重现”,这让我们向神经网络展示更加重要、稀少的元组。

    Our Deep Q-Learning algorithm

    回想一下,我们用Bellman公式更新我们的Q值。现在我们想通过更新我们的神经网络减小误差。

    在我们的这个例子中,我们想通过降低误差的方式更新我们的神经网络。

    误差是通过计算Q_target(从下一个状态开始,可能取到的最大值)和Q_value(我们现在预测的Q值)的差别来得到的。

    Initialize Doom Environment E
    Initialize replay Memory M with capacity N (= finite capacity)
    Initialize the DQN weights w
    for episode in max_episode:


    s = Environment state

    for steps in max_steps:


    Choose action a from state s using epsilon greedy.
    Take action a, get r (reward) and s' (next state)
    Store experience tuple <s, a, r, s'> in M
    s = s' (state = new_state)

    Get random minibatch of exp tuples from M
    Set Q_target = reward(s,a) + γmaxQ(s')
    Update w = α(Q_target - Q_value) * w Q_value

    在这个算法中,有两个过程:

    1. 我们从环境中采样,即我们在该环境中执行动作并且存储观察到的经验元组到重现记忆中。

    2. 随机选择一小批元组,并用梯度下降的更新步骤从中学习。

     原博客地址

  • 相关阅读:
    谈谈近两年维护的一个最最坑爹项目
    LintCode 丑数
    nova 配置文件
    python 网络编程
    python
    python
    cocos2d-js导弹跟踪算法(一边追着目标移动一边旋转角度)
    nginx和apache
    Service绑定模式
    类对象作为成员
  • 原文地址:https://www.cnblogs.com/billdingdj/p/10477324.html
Copyright © 2011-2022 走看看