引言#

为什么需要强化学习#

在讨论什么是强化学习之前,我们先讨论为什么需要强化学习。在诸如图像分类等很多任务上,我们知道给模型某种输入,模型应该产生什么输出,但是如果是下围棋这样复杂的任务,也许我们可以通过让模型学习人类高手的棋谱学会一些章法,但是人类棋手下的棋也未必是当前形式下最好的招式。总之在连人类都不知道怎么做是最好的时候,我们可能需要强化学习。

image-20230205021444858

强化学习中的要素#

强化学习的训练中一般有以下五个要素

  • Actor:我们需要训练的模型(比如AlphaGo)
  • Environment:任务的环境(在围棋中即轮到自己下棋时的棋局)
  • Observation:某个时刻下Actor对环境的观察(AlphaGo以当前棋局作为输入,用于计算下一步怎么走)
  • Action:Actor根据Observation做出的反应(AlphaGo计算出的下法)
  • Reward:评判某一个Action的好坏
image-20230205021856495

强化学习的过程#

在一般的机器学习中,可以分为三步

  1. 定义一个未知函数
  2. 定义损失函数
  3. 优化

虽然强化学习不同我们以前熟知的机器学习,但是大致步骤也类似于上面三步。

未知函数#

Deep Reinforcement Learning中,我们定义的函数也是一个神经网络,以space invader游戏为例,游戏画面作为输入,输出选择各个操作(向左移动、向右移动、开火)的概率分布,这相当于是做了一个分类任务。

image-20230205023034857

优化目标#

在强化学习中,我们希望模型在全局而不仅仅是某一个局部中取得一个良好的效果,那么我们就应该把所有Action的reward相加,并以reward的和R=rtR=\sum r_t作为优化目标。

比如在space invader游戏中,开火并消灭敌人能得到5分reward,左右移动得到0分reward。但是一直开火可能只能消灭一列上的敌人而无法得到最好的表现。所以应当以总的reward为优化目标,才能让模型学会在合适的时候左右移动。

image-20230205023335062 image-20230205023407892

优化#

Deep Reinforcement Learning中,优化是比较困难的问题,将在下一节展开讨论。

image-20230205023141489

Policy Gradient#

本部分从如何“控制”模型的行为出发,最后总结policy gradient的方法。

假设我们知道每一步我们期待模型去采取的行为a^\hat{a},那么我们可以让loss为模型的输出aaa^\hat{a}的交叉熵ee,假设我们不希望模型采取行为a^\hat{a},那么我们应当让loss为e-e

image-20230206224700780

那么这种情况下loss function

image-20230206224742443

但是很多时候仅以±1来衡量希不希望模型做某个行为是不够的,所以对每一个行为an^\hat{a_n}引入AnA_n,来评估多想/不想模型采取某个行为。

image-20230206224803407

下面我们讨论如何产生合适的AnA_n,Version 0是一种很直观的想法,它让AnA_n等于每一步的reward,即An=rnA_n=r_n,但是这样的模型是“短视”的,因为在评估每一个举措的优劣时,只会根据当前步骤后直接的reward。

image-20230206224823126

Version 1(cumulated reward)的方法是让At=n=tNrnA_t=\sum _{n=t}^N r_n ,这样模型在评估某一步行为的优劣时,可以考虑这一步对后续会造成什么影响。

image-20230206224850595

Version 1的方法的问题在于它认为某一个步之前的所有步骤对这一个步之后reward的作用是均等的,而实际上比较符合直觉的是距离较远的步骤对当前步骤的reward的影响小,距离较近的步骤对当前步骤的reward影响大。所以Version 2改为用cumulated discount reward衡量行为优劣,即在求和时,式子改写为At=n=tNγntrnA_t=\sum_{n=t}^N \gamma^{n-t}r_n

image-20230206224908629

Version 3是在cumulated discount reward的基础上对AnA_n减去一个常数bb,这样可以让AnA_n有正有负,否则如果所有行为的reward都是正值,那么可能会鼓励模型去做我们不想让它学到的行为。

image-20230206225003933

最后,得到AnA_n后,我们可以做Policy gradient,步骤如下,需要注意的是,每一轮训练时,我们都需要让模型重新产生自己的行为

image-20230206225041475

实际上我们不知道模型应该采取怎样的行为,也不能这么计算loss,这样写只是便于理解,具体的数学推导参考Understanding deep learning 中对于Policy gradient的讲解。优化的目标和迭代表达式如下:

θ=argmaxθ[Eτ[r[τ]]]=argmaxθ[Pr(τθ)r[τ]dτ] \boldsymbol{\theta}=\underset{\boldsymbol{\theta}}{\operatorname{argmax}}\left[\mathbb{E}_{\boldsymbol{\tau}}[r[\boldsymbol{\tau}]]\right]=\underset{\boldsymbol{\theta}}{\operatorname{argmax}}\left[\int \operatorname{Pr}(\boldsymbol{\tau} \mid \boldsymbol{\theta}) r[\boldsymbol{\tau}] d \boldsymbol{\tau}\right]

θθ+αθPr(τθ)r[τ]dτ=θ+αPr(τθ)1Pr(τθ)Pr(τiθ)θr[τ]dτθ+α1Ii=1I1Pr(τiθ)Pr(τiθ)θr[τi]. \begin{aligned} \boldsymbol{\theta} & \leftarrow \boldsymbol{\theta}+\alpha \cdot \int \frac{\partial}{\partial \boldsymbol{\theta}} \operatorname{Pr}(\boldsymbol{\tau} \mid \boldsymbol{\theta}) r[\boldsymbol{\tau}] d \boldsymbol{\tau} \\ & =\boldsymbol{\theta}+\alpha \cdot \int \operatorname{Pr}(\boldsymbol{\tau} \mid \boldsymbol{\theta}) \frac{1}{\operatorname{Pr}(\boldsymbol{\tau} \mid \boldsymbol{\theta})} \frac{\partial \operatorname{Pr}\left(\boldsymbol{\tau}_{i} \mid \boldsymbol{\theta}\right)}{\partial \boldsymbol{\theta}} r[\boldsymbol{\tau}] d \boldsymbol{\tau} \\ & \approx \boldsymbol{\theta}+\alpha \cdot \frac{1}{I} \sum_{i=1}^{I} \frac{1}{\operatorname{Pr}\left(\boldsymbol{\tau}_{i} \mid \boldsymbol{\theta}\right)} \frac{\partial \operatorname{Pr}\left(\boldsymbol{\tau}_{i} \mid \boldsymbol{\theta}\right)}{\partial \boldsymbol{\theta}} r\left[\boldsymbol{\tau}_{i}\right] . \end{aligned}

Actor-Critic#

Value function#

在Policy gradient中,每一轮训练我们都需要让模型“玩完整个游戏”,以此得到AnA_n。如果能定义一个函数,直接能把AnA_n算出来,或许能避免随机性带来的偏差。所以我们定义Value function,来计算cumulated discount reward。这里Value function Vθ(s)V^\theta(s)代表的是模型参数为θ\theta时某一个行为ss的平均cumulated discount value。

第一种得到Value function的方法是Monte-Carlo(MC)方法,这个方法让模型随机地进行多次任务,然后训练得到Value function。

image-20230206223827961

第二种方法是Temporal-difference(TD),这种方法利用Vθ(s)=n=tNγntrnV^\theta(s)=\sum_{n=t}^N \gamma^{n-t} r_n,导出Vθ(st)=γVθ(st+1)+rtV^{\theta}\left(s_{t}\right)=\gamma V^{\theta}\left(s_{t+1}\right)+r_{t},最后训练Value function使得Vθ(st)γVθ(st+1)rtV^{\theta}\left(s_{t}\right)-\gamma V^{\theta}\left(s_{t+1}\right)\rightarrow r_{t}

image-20230206223845123

Value function的作用#

有了Value function后,我们可以改进"Version 3"中计算AnA_n的方法为"Version 3.5",将常数bb改为这个步骤进行后的Value function,想法是如果这个行为是我们希望看到的,那么这个步骤的cumulated discount reward就会超过平均的cumulated discount reward,得到正的AnA_n,反之得到负的AnA_n

image-20230206223923836

但是Version 3.5中的方法没有考虑到某次行为之后的行为的随机性,这样可能导致误判这个行为的优劣,比如ata_t是我们希望看到的行为,但是由于采样的随机性at+1a_{t+1}或之后的行为可能是我们不希望看到的行为,那么可能就会误判ata_t为我们不希望看到的行为。为了避免这一点,我们将“玩一次游戏”产生的cumulated discount value改成由value function求出的平均cumulated discount value,这样可以避免随机性带来的影响。

image-20230206224018504

Reward Shaping#

在很多任务中,只有任务结束的时候才会产生reward,而中间过程中没有reward(比如下围棋)。那么这时候我们需要在任务规则自带的reward(比如围棋胜负)之外额外构造一些reward。

比如https://openreview.net/forum?id=Hk3mPK5gg&noteId=Hk3mPK5gg中让模型学习玩枪战游戏,除了游戏规则本身的死亡和存活会产生reward,可以设置掉血、开火、待在原地(防止模型一动不动)、存活(防止模型学会边缘ob)会得到负reward,捡到血包或弹药、移动可以得到正的reward。

但是reward shaping需要人对任务本身有足够充分的了解,否则很难设置合理的reward。

image-20230206223506498

No Reward: Learning from Demonstration#

在很多场景下,可能连reward都没有,同时人类也不知道如何设置合适的reward,那么可以让模型通过模仿来进行学习。

但是如果直接使用监督学习,那么人没有“教”模型的操作可能模型是学不会的。比如自动驾驶任务中,人无法穷尽所有的极端情况下的操作,那么自动驾驶汽车可能在极端条件下无法正确反应,这可能是致命的。

我们可以使用Inverse Reinforcement Learning的方法来解决这个问题。这个方法是在每一轮训练中同时收集人类和模型面对某种任务时的行为{τ1^,τ2^,,τK^}\{ \hat{\tau_1},\hat{\tau_2},\dots,\hat{\tau_K}\}{τ1,τ2,,τK}\{ \tau_1,\tau_2,\dots,\tau_K\},把人类行为和模型行为用于训练reward function,要求reward function对人类的行为给出的reward和大于对模型的行为给出的reward和,即R(τn^)>R(τn)\sum R(\hat{\tau_n})>\sum R(\tau_n),然后根据新的reward function去优化模型。

image-20230206222531136

可以把IRL的训练类比GAN的训练,模型看作generator,reward function看成discriminator。

image-20230206222606219

本文采用CC-BY-SA-3.0协议,转载请注明出处
作者: 核子