【深度之眼cs231n第七期】笔记(三十一)
目录
- 强化学习
- 什么是强化学习?
- 马尔可夫决策过程(MDP)
- Q-learning
- 策略梯度
- SOTA深度强化学习
还剩一点小尾巴,还是把它写完吧。(距离我写下前面那行字又过了好几个月了【咸鱼本鱼】)(汗颜,好久之前写了一半就忘了,后面的就直接看图吧)
cs231n的强化学习公式较多,我是看了李宏毅的强化学习才理解的。
强化学习
什么是强化学习?
总览:强化学习里有三个重要的概念:环境、agent和奖励。
它们的关系如下:
- 环境给予agent一个状态St;
- 在该状态下,agent采取行动At;
- 对于行动At,环境给出的奖励是Rt;
- 并且环境给予agent下一状态St+1,循环往复。
强化学习的目标是:学习如何行动能使奖励达到最大,我们能控制的只有行动,奖励和状态都是环境给予的。
举个具体的例子:
Atari游戏的状态是当前游戏界面;
agent可采取的行动有:上、下、左、右;
奖励:采取一步行动后,获得或减少的分数;
目标:以最高分完成游戏。
马尔可夫决策过程(MDP)
上面都是用文字描述的,现在用数学语言来描述一下强化学习S。
事实上,一个马尔可夫决策过程就是强化学习问题的数学表达。马尔可夫决策过程满足马尔可夫性。
马尔可夫性:当前状态完全刻画了世界状态,也就是说,下一状态完全依赖于当前状态。
马尔可夫决策过程由一组对象定义(S,A,R,P,γ)
- S是所有可能状态的集合
- A是所有可能行动的集合
- R是奖励的概率分布,由(状态,行动)给定
- P是跳到下一状态的概率,由(当前状态,行动)给定
- γ是奖励的衰退因子
用马尔可夫决策过程来描述强化学习:
- 在t=0时刻,环境采样初始状态S0
- 从t=0到学习结束:
- agent选择行动At
- 环境依概率给出奖励Rt(概率由R(.|St,At)决定)
- 环境依概率给出下一状态St+1(概率由P(.|St,At)决定)
- agent接收奖励Rt和状态St+1
我们所采取的行动组合a0,a1,a2……称为策略π
而强化学习的目标是找到一个策略π*,使得奖励之和最大。
最直接的解决办法是穷举所有的行动组合,计算每个组合的奖励,把奖励最大的选出来。但这其实有个问题,每次行动后,奖励和下一状态都是环境给予的,有一定的随机性。
也就是说即使每次执行的都是同一个行动组合π,最后的结果也可能相差很大,所以首先要解决奖励之和的随机性,这样我们才能比较哪个组合更好。而解决随机性最常用的方法是求期望。
所以现在问题变成了:找到一个π*,使得E(奖励之和)最大。
Q-learning
在解决如何找到最优策略π*之前,为了方便后面描述算法,先定义两个有用的函数:
值函数:在状态为s的情况下,遵从策略π后得到的E(奖励之和)
假设初始状态有3种:S0、S1和S2,那么策略π的E(奖励之和)=Vπ(S0)+Vπ(S1)+Vπ(S2)
Q值函数:在状态为s、行动为a的情况下,遵从策略π后得到的E(奖励之和)
假设状态为s时可采取的行动有3种:A0、A1和A2,那么Vπ(S0)=Qπ(S0,A0)+Qπ(S0,A1)+Qπ(S0,A2)
给定S0和A0的情况下,最优的策略π*能使Q值函数达到最大,记为Q*
而Q*满足bellman等式,这个等式想表达的东西很简单,就是当前最优的Q*=当前奖励r+下一状态下最优的Q*。
乍一看这个式子没有任何用,既然我不知道现在的Q*,当然也不会知道下一状态的Q*了。除非一直迭代到最后一个状态,但是前面提到了奖励和下一状态都是随机的,所以直接迭代会非常复杂,这条路行不通。
现在的问题是:Q*太复杂了,没办法直接表达,那能拿什么东西来替代吗?
这就轮到神经网络出场了,神经网络专门解决表达式过于复杂的问题。
假设使用神经网络QL来表示函数Q*,Q*有两个参数——状态s和行动a,那么QL也会有两个输入——s和a(如果行动是离散的,QL也可以设计为:输入s,输出n个标量,每个标量代表某一个行动下的E(奖励之和))。
QL会输出一个标量代表当前状态s和行动a的E(奖励之和),不同的输入会得到不同的E(奖励之和)
那么只要训练神经网络QL,使得QL(Si+1,Ai+1)-QL(Si,Ai)尽可能地接近Ri就可以了,这不就是一个简单的回归模型吗?
在训练好QL后,由于行动是有限的,所以可通过下面的方式找到π*:
- 在Si的状态下,使用遍历(行动是离散的)或梯度上升(行动是连续的)得到Ai,使得QL(S0,Ai)最大
- 环境根据Si和Ai给出Si+1
- 重复1、2步直到结束
- π*=A0A1A2……
上面提到的QL网络还有三个问题:
- QL的训练方式是使QL(Si+1,Ai+1)-QL(Si,Ai)尽量接近Ri,每次更新时QL(Si,Ai)和QL(Si+1,Ai+1)的值会同时改变,造成训练的不稳定。
所以在实际训练中会有两个神经网络,QL和QLtarget,QLtarget-QL尽量接近Ri。
每次反向传播时只更新QL,在经过N次迭代后再把QL的参数赋值给QLtarget
- 由于QL网络的训练方式是:与环境互动一次,更新QL,根据更新后的QL获得下一行动a,使用a和环境互动……
下一个行动a与当前行动高度相关,这会导致训练效果不好,就像进入一家新餐厅时,随机点了一道菜,味道还可以,从此以后就再也不尝试其他菜了。
解决办法是:准备一个缓冲区,每次互动后把数据存入缓冲区,再从缓冲区随机选取数据进行训练。
这种办法还有一个好处,可以多次使用训练数据。一般来说,在强化学习中,与环境互动才是最费时间的。
- 对于一个复杂的问题,比如让机器人抓住某个物体,Q函数很难通过随机尝试学到一个具体的行动来解决这个问题。那么可不可以换一个方向,不需要机器人学习具体的行动,而是学习一个“握住”的策略?
策略梯度
策略梯度网络PG的输入是状态s,输出是下一步采用某个行动的概率p(a|s)(而上面的QL网络的输出是采用某个动作后的E(奖励之和))。
在网络PG固定的情况下,可得到多个策略πθ,每个策略有一定的概率:
也可以计算出πθ的奖励之和
如果穷举所有的行为轨迹πθ,那么可以计算出E(奖励之和),记为J(θ)
J(θ)是由θ决定的,而且我们的目标是最大化J(θ),那么可以考虑对参数θ进行梯度上升(目标函数是J(θ))
课程里用了好几页PPT和大段大段的公式来讨论J(θ)能不能求导,要怎么进行梯度上升,由于我这里直接把函数看做神经网络GP了,就不展示相应的细节了(神经网络当然可以求导,进行梯度上升也很容易,神经网络牛逼!而且删掉公式之后,脉络越发清晰起来了。)
下面是一些训练技巧:
- 增加baseline
如果奖励永远都是正的,那么任何行动都会导致J(θ)增加,从而增加该行动的概率。
而所有概率之和为1,其他行动只是不幸没有被采样到就得降低概率,这是不符合要求的。
所以希望奖励有正有负,这可以通过减去一个baseline来达成,历史奖励平均值是一个常用的baseline。
SOTA深度强化学习
cs231n系列终于写完了,其实后面还有两课,一课是讲硬件加速和模型轻量化,另一课是讲“为什么稍微改变一张熊猫的照片就可以让计算机把它认为是长臂猿(人眼看不出任何差别)”,但对这两个方面不是很熟悉(轻量化还好,后一课真的一知半解的),就不乱写了。
不写的最主要的原因其实是:我进了GAN的深渊……