美文网首页机器学习与数据挖掘
几个比较经典的强化学习算法,以及在NLP中的应用

几个比较经典的强化学习算法,以及在NLP中的应用

作者: VanJordan | 来源:发表于2019-03-15 12:55 被阅读100次

    从没有转移方程的强化学习说起

    在深度学习里面的强化学习方法基本上是没有转移概率的,所以不能直接有贝尔曼方程求解。


    无法通过转换方程求解,我们使用蒙特卡洛采样方法求解

    因为实际上使用bellman方程,迭代的得到状态-行动值函数是求期望,而通过采样的方式同样也可以求期望。



    时序差分法(TD法)

    使用蒙特卡洛法需要从当前状态开始一直采样,直到游戏结束,但是这样有个问题是如果状态序列特别长,需要采样的次数也太多了,非常的耗费计算资源,如果采样的次数过少那么期望的方差就很大,导致训练很不稳定,TD法解决这个问题的策略是对于下一个时刻的状态我们使用估计得来,而不是采样得来,那么需要采样的仅仅就是下一个状态以及动作了,需要采样的次数大大降低。




    TD算法在整儿系统都没有达到最优的情况下,估计是有偏差的,但是由于只是估计了一步,所以方差会比较小,本质少来说就是为了降低方差而牺牲了偏差,而降低方差的方式是使用估计值代替长序列的采样值,这样就能减少需要采样的次数。

    Q-learning算法

    Q(s,a)指的是从在状态s下,采取动作a,那么直到游戏结束所能获取的reward的期望,Q-learning法是对时序差分法的一种改进,是一种off-learning的方法,因为他不是使用真实的交互序列来进行训练的,他总是假设,在下个状态的时候会做出reward最大的动作。



    Q-learning算法的性质以及和DeepQ-learning算法的引入

    DeepQ-learning算法的改进

    • 第一就是机器学习算法有一个很强的前提就是要求训练数据和测试数据是独立同分布的,而直接交互得到的数据是有时序相关性的,而且如果交互后样本直接被丢弃,相当于一个数据仅仅训练一个epoch,太过于浪费,那么我们就需要花更多的时间与环境进行交互,所以引入了replay buffer这个数据结构,用于解决这两个问题。



    DQN存在的问题,以及改进
    • DQN存在过高估计的问题,因为在参数更新的时候有max操作使得估计的值函数比值函数的真实值大。如果值函数每一点的值都被过估计了相同的幅度,即过估计量是均匀的,那么由于最优策略是贪婪策略,即找到最大的值函数所对应的动作,这时候最优策略是保持不变的。也就是说,在这种情况下,即使值函数被过估计了,也不影响最优的策略。强化学习的目标是找到最优的策略,而不是要得到值函数,所以这时候就算是值函数被过估计了,最终也不影响我们解决问题。然而,在实际情况中,过估计量并非是均匀的,因此值函数的过估计会影响最终的策略决策,从而导致最终的策略并非最优,而只是次优,可以想象如果一个Q值被过高的估计了,那么接下来的和他有关的一系列Q值都会被过高估计,而且如果下次采样到这一系列中的Q值会继续过高的估计,所以这个过程是发散的,长期训练下去,导致偏差越来越大。
    • 这一问题被 DoubleDQN所缓解,具体原理是取max的是behavior网络,哪怕一个Q值被过高的估计了,那么也不会传递到behavior网络的其他的Q值上去,因为计算和更新Q值是Target Network,这样阻断了误差的传播,因此一定程度上解决了这个问题。

    解决冷启动问题

    image.png

    Policy Gradient

    • 所谓的baseline是同一起始点的不同序列在同一时刻的长期回报,注意是同一state下的回报,而不是所有总的reward的平均。

    Policy Gradient和最大似然的区别与联系

    • 最终的梯度求解形式,我们的理想目标是优化这个表达式,但是不可能每次都取出全部的数据计算梯度,所以我们要拿出mini-batch的数据,但是有个问题就是如果取出mini-batch就要求在这个batch内部数据是独立同分布的,但是如果是在一个序列里面的样本的(每个状态和下一个状态明显是有关系的)显然不满足这个要求,在seqGANs中把每个动作拆开来计算梯度,好处是加速了训练,因此一个样本的每个状态下的动作都可以进行训练,相当于将生成一个句子变成了好多个样本进行训练,但是坏处就是不满足独立同分布的要求,可能训不出来什么东西,比较好的方式就是一个动作序列使用一个reward,但是这样的坏处就是需要大量的训练数据才能让模型知道在具体的状态下,那个动作是好的或者坏的,感觉一个很大的学习率+SGDM优化器训练比较合适,缺点就是需要非常大的采样,因为动作序列一般都比较长,只有超大量的采样以后才知道那个状态下的动作是好的,在NLP中比如说是生成一个长度为20的句子这样的强化学习任务,词表是3000的话那么总共的状态空间是3000^20次方,想要通过抽样来选出一个比较好的动作序列是非常难的。
    • 因为我们想要如果一个动作序列是好的那么我们就增大他出现的可能性,如果一个动作序列是差的就减少他的可能性,但是如果所有reward是正的话,一个动作是不好的也会略微的增强其产生的可能性,因此我们需要减去一个baseline

    Actor-Critic

    Policy Gradient的关系就像是MCTD的关系,都是使用估计来代替轨迹长期回报。

    • 就上面policy gradient的问题,因此采样的空间太大了,所以经常是欠采样的,导致方差很大,难以训练,我们要想办法减少采样次数。
    • AC是使用一个单独的function来估计长期的回报。



    • 策略梯度类型的方法不能直接使用off-policy 的原因是因为更新一次策略就会改变,因此必须要重新采样。


    • A3C因此使用多线程采样并异步计算梯度,然后汇总更新。


    • 可以想象动作空间太大的难以训练的问题只有在训练的早期会出现,因此这时候选择到好的动作的概率是很难的,如果是快收敛的时候,因为大部分状态下好的动作的概率都很大,所以一小部分欠训练状态的好的动作也是比较容易被训练到的,而使用多步回报估计法就是为了加速早期收敛。





    • A3CA2C的区别:A2C将决策和训练的任务集中到了一处,其他进程只负责环境模拟工作。


    其他强化学习算法


    层次强化学习

    • 为了解决反馈稀疏问题,层次强化学习是制定各个小目标,然后专注完成这个小目标。


    课程学习

    • 如果任务太过于复杂,那么我们应该首先对由易入难的进行学习



    模仿学习


    AlphaZero








    强化学习算法可以分为value-based的方法和,policy-based方法,value-based的方法是根据一个值函数网络估计出当前状态下进行各个动作的value,然后选出value最大的action,policy-based的方法是直接学出一个policy,这个policy可以在当前状态下选取最佳的动作,可以看到policy based的方法是比较直接的,但是两个直接也是由交集的就是actor-critic的方法,这种方法是做出了一个动作然后有一个critic进行打分,迫使actor做出reward高的动作。


    policy-based

    直接参数化一个策略函数



    然后就是为了寻找最优的参数,确定强化学习的目标函数,这里我们直接说明是累积回报的期望

    actor-critic

    value-based

    最为经典的方法是Q-learning,之前都是使用表格来装Q值函数,但是这种函数是有缺陷的,即如果当状态空间很大的话,需要大量的存储空间,第二个就是当问题规模变大以后,想要准确地计算出这张表中的每个值需要的时间开销是巨大的,而且在许多实际的任务中,有些状态和东欧是永远不会出现的,导致价值函数难以准确的计算,并且在实际的任务中,许多状态和动作是永远也不会出现的,这就导致了价值函数很难准确计算。

    Q-learning 和DQN

    学习动作值函数,即输入一个状态以及一个动作,需要得到这个动作的期望分数。

    这个期望分数是对直到游戏结束所能获得的总的奖励
    Q-learning 步骤
    Q-learning算法
    如何选择一个动作?使用epsilon greedy strategy策略:
    因为初始的时候Q表示随机分布的,因此我们需要在开始的时候随机的进行动作探索,但是在快训练好的时候需要尽可能的选择Q值最大的动作。
    于是我们先指定一个探索率叫做epsilon,在开始的时候我们设置他为1,于是我们在[0,1]之前选择一个随机数,这个随机数如果小于epsilon,那么我们就做随机探索,如果这个随机数字大于epsilon那么就选择Q值最大的动作。
    epsilon
    更新公式:
    是一个bellman equation

    采用的trick

    1. 使用深度卷积网络来逼近值函数。
    2. 使用经验回放对强化学习的学习过程进行训练,DQN有一个记忆库用于学习之前的经历,所以每次DQN更新的时候,都可以随时抽取一些之前的经历回放,随机抽取这种做法打乱了经历之间的相关性,使得神经网络更新更有效率。[可以想象在传统的训练文本分类的时候,不同类别的数据进来的第一件事就是打乱标签],这两个的道理差不多吧。
    3. 独立设置了目标网络来单独处理时间差分算法中的TD偏差问题,目标网络也是一种打乱相关性的机理,也就是说DQN中使用两个结构相同但是参数不同的神经网络,其中需要评估的Q神经网络具备最新的参数,而目标Q神经网络使用的参数是很久之前的,这样使得训练更加robust[??].
      训练步骤:
    4. 首先初始化两个Q网络的参数。
    5. 随机选择一个初始的状态,然后利用概率选取一个随机的动作at。
    6. 执行行动策略采样,得到大量经历数据(例如百万级的)以(st,at,rt+1,st+1) 的形式存储在内存里。
    7. 从记忆库中随机抽取一个batch 的数据,数据格式为(s,a,r,s')。
    8. 从目标Q网络中产生Q目标值,这里的目标值相当于标签数据,而另外一个评估Q网络用来评估策略,更新参数,注意,这里的目标Q网络的参数是评估Q网络上一轮迭代对应的参数[这里有点不理解]。
    9. 最后使用半梯度下降的方式,来优化Q网络和Q目标值之间的最小平方差:


      半梯度下降

    相关文章

      网友评论

        本文标题:几个比较经典的强化学习算法,以及在NLP中的应用

        本文链接:https://www.haomeiwen.com/subject/ttclmqtx.html