• 强化学习(Reinfment Learning) 简介


     本文内容来自以下两个链接:

    https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/

    https://zhuanlan.zhihu.com/p/24446336?utm_source=weibo&utm_medium=social

    Q-learning Algorithm:

    整个算法就是一直不断更新 Q table 里的值, 然后再根据新的值来判断要在某个 state 采取怎样的 action. Qlearning 是一个 off-policy 的算法, 因为里面的 max action 让 Q table 的更新可以不基于正在经历的经验(可以是现在学习着很久以前的经验,甚至是学习他人的经验).

    Sarsa Algorithm:

    整个算法还是一直不断更新 Q table 里的值, 然后再根据新的值来判断要在某个 state 采取怎样的 action. 不过于 Qlearning 不同之处:

    • 他在当前 state 已经想好了 state 对应的 action, 而且想好了 下一个 state'和下一个 action'(Q learning 还没有想好下一个 action')
    • 更新 Q(s,a) 的时候基于的是下一个 Q(s', a') (Q learning 是基于 max Q(s'))

    所以,我们Sarsa比Q learning更具有探索性,多了一个action。 现在我们来思考下,这个算法为什么叫做Sarsa?其实可以顾名思义,Sarsa的意思是State(s)-Action(a)-Reward(r)-State(s')-Action(a')。我们同样能从算法的名字中知道sarsa算法的更新方法了。

    这种不同之处使得 Sarsa 相对于 Q learning, 更加的胆小. 因为 Qlearning 永远都是想着 maxQ 最大化, 因为这个 maxQ 而变得贪婪, 不考虑其他非 maxQ 的结果. 我们可以理解成 Qlearning 是一种贪婪, 大胆, 勇敢的算法, 对于错误, 死亡并不在乎. 而 Sarsa 是一种保守的算法, 他在乎每一步决策, 对于错误和死亡比较铭感.  两种算法都有他们的好处, 比如在实际中, 你比较在乎机器的损害, 用一种保守的算法, 在训练时就能减少损坏的次数.

    -------------------------------------------------------------------------------------------------------------------------------

    在传统的Q Learning中,Q值被储存在一个Q表格中,想象一个表格行为所有可能的 state 列为所有可能的 action。 这个方法可以很好的解决一些问题,尤其是 state 并不多,比如可以用几个量来表示的时候。但是在现实中,我们经常要用一些 raw image 来作为 state 的表示,一张10 × 10 像素 8 位的灰度图像就会有256^{100
} 个不同 state, 我们不可能建立如此大的一个Q table,这也导致了Q Learning 很难被应用到现实问题中去.

    那没法建立这么大的Q table 怎么办? 现在该是 Deep Q Learning登场的时候了。我们知道神经网络Neural Network可以很好对图片提取特征信息,进行抽象,分类等。那能否用Neural Network进行 Q 函数的模拟,让它去学习一副图片 state 所对应的 Q 值呢?

    Deep Q learning Algorithm:

    整个算法乍看起来很复杂, 不过我们拆分一下, 就变简单了. 也就是个 Q learning 主框架上加了些装饰.

    这些装饰包括:

    • 记忆库 (用于重复学习)
    • 神经网络计算 Q 值
    • 暂时冻结 q_target 参数 (切断相关性)

     

    用模拟器不停地模拟采取各种动作,收到各种反馈,再用 Bell equation 不停的训练 Q Network,并且得到一个能相对准确的估计Q值的网络以后。

    我们只要在给定Q值的情况下选择相应的策略即可,比如epsilon贪心策略

    Policy Gradient

    低配乞丐版 Policy Gradient Algorithm

    Deep Q Learning的思维还是非常受Q Learning影响,基本的框架依然是Q Learning只是用神经网络去代替了Q Table,那还有一种更加 End to End的方法,叫做Policy Gradient。和 Deep Q Learning 用Q网络去估计Q 表然后在规定一种策略去依据Q值采取行动不同,Policy Gradient值的策略网络直接输出的就是策略,比如采取每一种行动的概率(对于离散控制问题),或者每一个动作的值(对于连续控制问题)。

    Policy Gradient 相对于 Deep Q Learning有两个主要优点,

    • 一来是这样更加的 End to End,不用借用强化学习的理论框架。
    • 二来是这样既可以通过直接输出动作相应的连续量处理连续的控制量(比如对于汽车来说,油门的力度,刹车力度,转向角度),而用通过Q值选动作的方法则无法处理连续量。

    在 Policy Gradient 中我们希望学会一个策略能够达到最大的期望回馈。用pi_	heta(s)表示策略, 	heta表示策略网络的weights,通过学习不断更新。目标函数可以表示为J(	heta) = E_{pi(	heta)}[r]。David Silver在RL课程中为我们推导它对	heta的导数:

    由此导数,我们可以把每轮的折扣回馈v_t看做该state真实价值G_t的无偏估计。利用Gradient ascent的方法去, alpha的 learning rate,不停地更新	heta训练一个能够达到最大期望回馈的策略网络。

    Deep Deterministic Policy Gradient

    高配 Deep Deterministic Policy Gradient Algorithm 

    Policy Gradient 听起来很美好是不是,但是呢,试试就发现,它基本没法学会任何东西啊!低配乞丐版的 Policy Gradient 理论上一切都好,但是实践中会有很多致命的问题让它很难收敛,例如:

    • 反馈分配,反馈在大多时候都是不存在的,比如赛车游戏,只有游戏结束,例如到达终点或者撞墙而亡的时候才收到反馈,那如何将反馈很好的和之前进行的一系列策略和动作联系到一起去是一个很大的问题。
    • 我们的算法有一个内在的假设,假设所有的抽样都是独立,并且处于相同分布的(independently and identically distributed, iid ), 但是实际上,在游戏进行的过程中,同一时间段前后的抽样是明显具有相关性的,这个iid假设并不成立,也就会影响到学习的效果。
    • 在我们通过获取反馈,折扣,然后TD来更新Q值的方法,或者直接估计策略的方法中,这些反馈信号都有非常多的噪声,这些噪声可能会让整个网络很难收敛,甚至很容易发散。

    我在尝试的过程中也确实遇到了基本所有的这些问题,经常怎么训练都没法看到整个网络开始收敛,直到发现这个更加高级的方法DDPG:Continuous control with deep reinforcement learning

    在这个方法中,除了有一个动作网络 Actor Network 用于直接估计动作之外,还有一个校正网络 Critic Network 用来估计Q值,其中 Actor Network 就像低配版 Policy Gradient中的 Policy Network,输入State,输出动作值 Actions。而 Critic Network 则在输入 State 的同时还输入由Actor Network 产生的 Actions,输出相应的 Q 值,并不断的用 bellman equation来进行更新。Actor Network 则是从Critic Network 对应 Actions 输入计算出的导数来进行更新。

    用上面文章中的定义,动作方程 actor function 表示为mu (s|	heta^mu), 校正方程 critic function 表示为 Q(s,a|	heta^Q), Cost function J 对于	heta的导数为:

     

    这个算法将对动作的Q值估计策略估计分离,让 agent 能够在探索更多的同时保持对一个确定策略的学习,让整个网络学习变得更容易。

     除了将 Actor Network 和 Critic Network 分离以外,以下的一些小技巧也能更有利于网络的收敛(结果来看,这些小技巧才是重点……)。

    Replay Buffer:这是一个近乎于无限大的缓存,每次进行动作以后得到的 状态-动作-反馈- 新状态(s_t, a_t, r_t,  s_{t+1})都会被保存到这个缓存中去,不同于之前的方法直接拿游戏进行过程中得到的 (s_t, a_t, r_t,  s_{t+1}) 来进行训练,采用了Replay Buffer 以后,训练采用的 sample 则从这个缓存中随机抽样,通过这样的方法,理论上可以打破抽样直接的相关性,解决iid假设不成立的困扰

    Target Network : 在训练过程中,由于环境是相对混沌的,用于更新Q网络的反馈具有很大的噪声,直接训练一个网络会非常容易让它发散而非收敛。因此,在DDPG的文章当中,有一种叫做目标网络Target Network的方法,创建Actor和Critic网络的副本mu'(s|	heta^{mu'})Q'(s,a|	heta^{Q'})来计算目标值,然后以	au的比例缓慢的跟随原网络更新	au	heta'leftarrow 	au	heta+(1-	au)	heta'。如此一来,目标值就会相对变得稳定许多,非常有利于学习的效果。

     未完待续。。。

  • 相关阅读:
    bootstrap表头固定
    JS:二维数组排序和获取子级元素
    JavaScript 变量声明提升
    一道经典面试题-----setTimeout(function(){},0)
    排序
    基础知识:Promise(整理)
    几个兼容相关的重要函数
    JSON
    关于由ajax返回的数据在for循环中只能取到最后一个数的问题
    如果要遍历除了for循环,你还知道什么?——JavaScript的各种遍历方式
  • 原文地址:https://www.cnblogs.com/skykill/p/6810159.html
Copyright © 2020-2023  润新知