​李宏毅机器学习——强化学习Reinforcement Learning

发布于:2022-11-27 ⋅ 阅读:(925) ⋅ 点赞:(1)

目录

应用场景

强化学习的本质

以电脑游戏为例

强化学习三个步骤

第一步:有未知参数的函数

第二步:定义Loss

第三步:Optimization

RL的难点

类比GAN

Policy Gradient(策略梯度)

怎么学出actor中的参数

如何定义A

Version 0(最简单但不正确)

Version 1

Version 2

Version 3

Actor-Critic(行动者-批评者)

Critic介绍

Critic 怎么被训练出来的

Monte-Carlo (MC)

Temporal-difference (TD)

两种方法对比

version 3.5

version 4:Advantage Actor-Critic

训练Actor-Critic的小技巧

Deep Q Network (DQN)

Policy Gradient

策略梯度的流程

On-policy v.s. Off-policy

搜集资料的技巧:Exploration--增加Actor的随机性

Reward Shaping(sparse reward)

No Reward: Imitation Learning

无奖励的场景

示范学习和监督学习的不同

逆向强化学习

GAN VS IRL

RIG(Reinforcement Learning with Imagined Goals)


应用场景

  • 当我们给机器一个输入的时候,我们不知道最佳的输出应该是什么;
  • 收集有标注的资料很困难的时候

叫机器学习下围棋,最好的下一步可能人类根本就不知道。我们不知道正确答案是什么的情况下,往往就是 RL 可以派上用场的时候,

RL 在学习的时候,虽然不知道正确的答案是什么,但是机器会知道什么是好,什么是不好,机器会跟环境去做互动,得到Reward

强化学习的本质

强化学习的过程和机器学习是一样的,都是寻找函数。不过在强化学习中寻找的函数叫做actor,actor 跟Environment会进行互动,actor能够接受环境给予的observation(观察),做出action去影响 Environment,然后Environment会给这个 Actor 一些 reward(奖励),这个reward说明action是好是坏。我们的目的就是寻找一个用 Observation 当作Input,输出 Action,能将Reward总和最大化的actor。

以电脑游戏为例

游戏界面就是observation,人即决策者就是actor,向左向右跟开火就是action,游戏机就是Environment,得到的游戏分数就是reward。游戏的画面变的时候就代表了有了新的 Observation 进来,有了新的 Observation 进来,你的 Actor 就会决定採取新的 Action。我们想要 Learn 出一个 Actor,使用它在这个游戏裡面的时候,可以让我们得到的 Reward 的总和会是最大的

强化学习三个步骤

定义有未知参数的函数;根据训练资料定义loss;找出能够使loss最小化的函数(优化)

第一步:有未知参数的函数

将机器的观察用向量或矩阵来表示,作为actor的输入;actor输出的每个action对应输出层的每个神经元,每个action会有一个分数。这样看和分类任务是一个东西,不同的点是:强化学习将这些分数作为几率,按照这个几率随机产生输出,也就是sample(采样),而不是将分数最高的那个作为输出。

採取 Sample 有一个好处是说,就算是看到同样的游戏画面,机器每一次採取的行为也会略有不
同,在很多的游戏裡面这种随机性也许是重要的,比如说你在做剪刀石头布的时候如果总是会出石头,就很容易被打爆,如果有一些随机性就比较不容易被打爆。

第二步:定义Loss

这里定义loss也就是定义分数的获得机制,但是我们最后想要最大化的是整局的全部分数之和,而不是局部某一次的分数。负的 Total Reward当做 Loss

补充:一局游戏就是一个episode;reward是某一个行为能立即得到的奖励,return是所有分数相加(total reward)。

 

第三步:Optimization

环境产生的Observation s1 进入actor,actor通过采样输出一个a1,a1再进入环境产生s2,如此往复循环,直到满足游戏中止的条件。s 跟 a 所形成的这个 Sequence又叫做 Trajectory,用 𝜏 来表示。

需要注意的是reward不是只看action,还需要看 Observation,所以 Reward 是一个 Function。

优化目标:找到 Actor 的一组参数,让R(𝜏)的值越大越好。

RL的难点

强化学习最主要的难点就是如何做optimizaton:

  • action是通过采样产生的,具有很大的随机性,给相同的s,产生的a可能是不一样的。
    • 一般的Network在不同的random seed设定下的随机性,是"Training"中的随机性,比如初始化参数随机;但是在Testing中,同样的输入会获得同样的输出。 RL的随机性是在测试时,固定模型参数,同样的输入observation,会有不同的输出action。
  • 只有actor是网络,Environment 和 Reward,根本就不是 Network ,只是一个黑盒子而已;Environment与Reward都有随机性。
    • 环境是黑箱,採取一个行为环境会有对应的回应,但是不知道到底是怎麽产生这个回应,给定同样的行为,它可能每次的回应也都是不一样,具有随机性。
    • Reward就是一个奖励的规则,也不是 Network。

类比GAN

相同点:将actor看成是generator,将环境和reward看成是discriminator,训练出的generator能够使discriminator的corss entropy越大。

不同点:GAN的discriminator是network,而RL的discriminator不是network,无法用梯度下降等方法来调整参数来得到最好的结果。

Policy Gradient(策略梯度)

怎么学出actor中的参数

如果希望Actor在看到某个s时采取某一种行为,只需要把actor输出想成一个分类的问题,为每个Observation设定一个a ̂ (即Ground Truth或label)。针对某一个Observation,a ̂ 是向左移动,如果希望actor采取该行为,则计算Actor跟 Ground Truth 之间的 Cross-entropy,学习让Cross-entropy最小的 θ,就可以让这个 Actor的输出跟Ground Truth 越接近越好;如果不希望actor采取该行为,则L为-e,再学出能够使L最小的actor参数 。

看到这里我有一个疑问:Ground Truth是哪里来的?后文把e当做已知,没有解释Ground Truth来源

当有很多Observation时,每一个Observation对应一个a ̂,同时会有一个对应的e。假如我们希望在s时,actor做出a ̂的行为;而在s′时,不希望actor做出 a′ ̂ 的行为,那么此时的loss就变成了L=e1-e2,然后去找一个 θ 去 Minimize Loss,得到θ*

延伸到N个Observation。收集一堆这种资料,定义一个 Loss Function,训练 Actor,Minimize 这个 Loss Function,期待Actor执行我们的行为

使用权重和影响系数,控制每个行为的重要性,有多希望 Actor 去执行。这样train出来的actor才会更加符合我们的期望。

那么难点有两个(也就是下图画问号的):1、如何产生成对的{s,a ̂ }。2、如何确定我们的A

1、通过随机的actor产生的结果{ }。2、A有很多种表示方法,下面将会介绍。

如何定义A

Version 0(最简单但不正确)

让一个(随机的)Actor 去跟环境做互动,把它在每一个Observation执行的行为action都记录下来,每一个行为对应一个奖励Reward,将这个即时的Reward作为每个pair的A值。通常收集资料不会只把 Actor 跟环境做一个 Episode,通常会做多个 Episode,然后期待可以收集到足够的资料

但是这是鼠目寸光的一个版本,没有长程规划的概念:

每个行为不是独立的,会影响互动接下来的发展。有些奖励是会有延迟的Reward Delay,需要牺牲短暂的奖励来获得长程的奖励。以太空游戏为例,左右移动是没有奖励的,只有开火会有奖励,采用版本0则会导致actor一直做开火动作,不会左右移动。

Version 1

at有多好,不仅取决于 rt,而是取决于 at 之后所有发生的事情。为了考虑到延迟奖励,将每个行为的后续所有行为的奖励Reward也加入到该批次来得到数值 Gt。这些G称为cumulated reward(累积奖励)。

存在一个问题,某个行为对后续行为产生奖励的影响都是一样的,假设这个过程非常地长的话,因为做a1导致可以得到rN的可能性应该很低。实际上某个行为对后续行为的影响并不是一样的,该行为对越靠近它的后续行为影响越大,越往后影响越小。也就是说越靠近它的后续行为产生的奖励,越能归功于该行为。

Version 2

升级版本1,加入discount factor(折扣系数),一般取0.9,0.99等等。这个折扣系数成幂次增长。这次计算出来的奖励称为discount cumulated reward(折扣累积奖励)。可以给离a1比较近的那些 Reward比较大的权重,比较远的那些 Reward比较小的权重

存在一定问题,就是没有考虑标准化,算出来的奖励是不具备参考性的,因为好的奖励分数和坏的奖励分数是相对的。同样是60分,全班很多人都考了90分,那60分就是差的,全班很多人都不及格,那60分就是好的。如果我们只是单纯的把 G 算出来,可能每一个行为都会给我们正的分数,只是有大有小的不同,有些行为其实是不好的,但是你仍然会鼓励Model去採取这些行为

Version 3

标准化奖励,把所有的 G' 都减掉一个 b(这个 b通常叫做 Baseline),A就有正有负了(采用减去b的方法), 这样就知道这个奖励在整体中到底是好是差,类似于算排名的感觉。

Actor-Critic(行动者-批评者)

Critic介绍

Critic是用来评价actor好坏的,可以用价值函数V^θ (s)来表示,当使用参数为θ的actor时,看到s后预估获得的折扣累积奖励。这个价值函数相当于未卜先知,看到s就知道actor会有什么样的表现。Critic考虑了参数θ下actor的所有可能的action,在面对某一s时,V^θ (s)是所有可能奖励discounted cumulated Reward的平均结果。所以价值函数是与评估的actor相关的,当有相同的observation时,不同的actor有不同的V^θ (s)。

Critic 怎么被训练出来的

Monte-Carlo (MC)

让actor和环境互动,玩这个游戏以后得到一些记录,在输入sa后,游戏玩完之后就能得到discounted cumulated Reward的值为Ga′。利用这些训练资料,只需要让critic看到某个 s 后输出的值V^θ (s)与对应的G'越接近越好。

问题是,有的游戏其实很长,甚至有的游戏根本就没有不会结束,一直继续下去,那像这样子的游戏,MC 就非常地不适合

Temporal-difference (TD)

不需要玩完游戏就可以开始训练了,只要在看到Observation st, Actor 執行了 at获得rt,接下來再看到st+1 就能夠訓練V^θ (s)了。

V^θ (st)和 V^θ (st+1) 存在数学等式关系:前者减去γ倍后者就等于rt,所以只要训练这个差值接近rt就好。蒐集到 rt 这一笔资料,输入st和st+1,带入前述公式,差值要跟 rt 越接近越好

两种方法对比

同样的资料,同样的θ,用 MC 跟 TD 算出来的 Value Function很有可能会是不一样的。
下面代表玩了8次游戏,也就是8个episode。为了简化,无视actor和折扣。

  • Actor 第一次玩游戏的时候,它先看到sa这个画面,得到 Reware 0,接下来看到sb这个画面,得到 Reware 0 游戏结束
  • 接下来有连续六场游戏,都是看到sb这个画面,得到 Reward 1 就结束了
  • 最后一场游戏看到sb这个画面,得到 Reward 0 就结束了

8次游戏中看到8次sb,其中6次是的1分,2次是0分,所以sb的价值函数是3/4。

  • MC:sa和sb是有关联的,看到了sa就会让sb的reward=0。只看到一次sa,discounted cumulated Reward值为0。故V^θ (sa)=0
  • TD:前后两个state是没有关系的,sa之后看到sb,但sb的reward不会受sa的影响,而sb期望的Reward=3/4,所以计算得到V^θ (sa)=3/4

version 3.5

将价值函数用于训练actor在version 3中就有提到标准化,是通过减去b来实现的,在这个版本中这个b用V^θ (s)来表示。

玩完一局游戏产生的资料是{st,at},但我们是基于一个分布来采样行为,即看到st后actor能够做许多种行为,将所有这些可能行为的 Gt' 都算出来并做平均,就得到了V^θ (s),所以V^θ (s)代表平均实力。Gt' 含义是在 st 这个画面下,执行 at 以后,再一路玩下去,会得到的实际 Cumulative Reward。At = Gt′ - V^θ (s)就是把个人分数减去班级平均成绩,这样就能看出个人分数是否过了平均线,也就判断了这个行为是好是坏。假如算出的At大于0,则证明at行为比随便执行的actor要好,其分数是在平均线以上,是个好的行为。

但是这个版本中仍存在问题,就是at之后的所有行为都是采样出来的,我们考察的是at是不是个好行为,不能让后面的特殊情况影响到了对at的判断。Gt′是一次采样,可能存在特殊性。例如at是个差的行为,但是后面sample出来的行为碰巧大部分都有很高的奖励分数,这样就使得判断有失偏颇。

version 4:Advantage Actor-Critic

对于采取at行为后的期望奖励,上个版本是直接用当前采样出的路径,而这个版本是用at产生的即时奖励rt,加上从st+1开始玩所有可能Gt+1′的均值(即V^θ (st+1)),这样才能真正代表at产生的效益有多大。

训练Actor-Critic的小技巧

actor和critic的参数是可以共享的。actor是接受s,输出不同的行为并给出分数作为sample的几率;critic是接受s,输出一个数值,这个数字代表接下来的累积奖励。两者都要接受s,对s的处理肯定有相同的做法,所以两者可以共用前几层的layer网络,后面几层网络根据特性分别设计。

Deep Q Network (DQN)

上面讲了actor-critic方法,还有另一个方法叫做DQN,直接用critic就知道用什么actor比较好,DQN也有很多分支方法,详细内容在以往课程中有介绍,参考下面youtube链接。

Policy Gradient

策略梯度的流程

1、随机初始化actor的参数 ;

2、迭代地训练更新Actor:

  • actor与环境互动之后获得一堆的{s,a}
  • 根据上述{s,a}来计算奖励A
  • 计算Loss
  • 更新迭代actor的参数(Gradient Descent)

值得注意的是:一般train的数据搜集是在循环圈之外的,而RL的train的数据搜集是在循环圈之内的,actor的参数每更新一次,都需要重新搜集资料,然后再来更新。收集资料的那个 Actor和被训练的那个 Actor要求是同一个

原因是同一个 Action 对于不同的 Actor 而言,它的好是不一样的。θi-1收集到的资料只能用于更新自己的参数,不一定适合更新 θi 的参数,因为参数更新后,actor会采取不一样的行为。可以想象成每更新一次actor就进化一次,拥有更强的能力。这就是为什么 RL往往训练过程非常花时间

没看明白:计算loss的时候,用到的Ground Truth是哪里来的?

On-policy v.s. Off-policy

On-policy是指:需要更新的actor和与环境互动的actor是一样的。Off-policy就是指不一样的。我们前面讲的是On-policy,而Off-policy的好处是搜集一次资料可以更新多次参数,而不是一笔资料只能更新一次参数。

在训练的那个网络Actor To Train要知道它自己和跟环境互动的Actor To Train是不一样的,所以 Actor To Interact 示范的那些经验有些可以採纳,有些不一定可以採纳。off-policy一个代表性做法是proximal policy optimization(PPO)。

你去问克里斯伊凡怎么追一个女生,然后克里斯伊凡就告诉你说,他只要去告白,从来没有失败过⇒与环境互动的Actor

但是你要知道,你跟克里斯伊凡是不一样的,所以克里斯伊凡可以採取的招数,你不一定能够採取,你可能要打一个折扣⇒真实训练的Actor

搜集资料的技巧:Exploration--增加Actor的随机性

Actor採取行为的随机性是非常重要的,很多时候随机性不够会训练不起来或训练不出好的结果。如果没有随机性,可能一些 Action 从来没被执行过,那就根本无从知道这个 Action 好或不好。就是要尽力遍历各种可能性,这样才能更加全面地考虑和做决策。

在训练的时候会刻意加大 Actor 的随机性,使输出更加混乱,尽可能让小概率的时间也会有输出。一是放大输出分布的熵,让它在训练的时候比较容易 Sample 到那些几率比较低的行为,二是给actor的参数中添加杂讯,让它每一次採取的行为都不一样。

Reward Shaping(sparse reward)

Reward大多数时候都是0,只有在少数时候是一个非常大的数值,这意味着很多action无从判断是好是坏,例如机器臂拧螺丝,初始化时它就在空中隨便揮舞怎麼揮舞 Reward 都是 0,除非它正好非常巧合的拿起一個螺絲,再把它拴進去,才得到正向的 Reward。这时就需要我们提供额外的reward来帮助机器学习,自定义奖励的方法就叫reward shaping。

以vizdoom游戏为例,这个游戏只有最后胜负这一个奖励,所以需要参赛队给自己的机器设置自定义奖励机制。例如扣血了就减分,捡到血包就加分,站着不动扣分,活着也扣分(防止边缘OB)

 Curiosity(给机器加上好奇心)

看到“有意义的”“新”东西时,获得reward shaping。特别地,不应看到“噪声”——无意义的“新”

No Reward: Imitation Learning

无奖励的场景

有了自定义奖励,我们为什么还要研究无奖励的情况呢?第一是因为在某些任务中不知道怎么去定义reward。第二是因为有些人为定义的奖励(reward-shaping),如果你的 Reward 沒想好,Machine 可能會產生非常奇怪、無法預期的行為。比如,利用强化学习学习自动驾驶,如何给礼让行人、闯红灯定reward?

actor可以和环境互动但是却没有reward,这种情况就适合使用示范学习,就是先让人类去示范一下怎么跟環境互動,把人類跟環境的互動記錄下來记作τ^,然后用这些示范行为去训练机器。例如自动驾驶:记录人类的驾驶行为,机器臂:拉着机器臂做一次。

示范学习和监督学习的不同

假如自动驾驶使用监督学习来实现,存在的一个最大问题就是专家示范只是众多可能性中sample出来的,机器碰到不是示范的场景时,机器就不知道做出正确的判断。路口左转是对的,但是如果快要撞到墙了呢,可能车子就撞上去了,因为他没有见过车子还能快要撞到墙。所以supervised learning学出来的行为就是克隆行为了,实用性很差。

另一方面,experts的一些行为,actor是不需要模仿的;actor能力有限,可能无法模仿所有行为,而模仿的行为可能并不能带来好的结果。

逆向强化学习

原则:老师的行为总是最好的,老师的行为总是能够得到最高的reward,而不是说需要亦步亦趋地模仿。机器自己定reward,即使reward很简单,机器也可能自己衍生出各种复杂的action

從 Expert 的 Demonstration和 Environment,去反推 Reward 應該長什麼樣子。學出一個 Reward Funtion 以後,再直接用一般的 Reinforcement Learning來學你的 Actor。

算法:

  • 初始化一个actor。
  • 多次迭代
    • actor和环境互动,得到一些行为轨迹trajectory τ
    • 定义一个reward函数,这个函数能判断老师的行为比actor的行为好
    • 基于新的reward函数,actor学习如何最大化reward,以接近老师的行为。(这部分是RL)
  • 输出reward函数和学到的actor。

框架如下图:

GAN VS IRL

逆向强化学习和GAN的思想一样,可以把actor看成generator,把reward函数看成discriminator。generator是尽可能产生真实的图片来获得高分数以骗过discriminator,actor是尽可能生成和专家轨迹一样的轨迹来获得高的奖励分数。discriminator是监督者,努力去分辨真实图片和生成的图片,而reward function则是努力去给专家轨迹打高分而给actor行为打低分。。

RIG(Reinforcement Learning with Imagined Goals)

让器械臂看到图片,做出图片中的动作。

训练:自己想象目标、自己达到目标。

参考:李宏毅机器学习笔记09 强化学习 - 知乎

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到