本文是基于台大李宏毅教授2021年的强化学习课程制作的课程笔记,旨在用通俗易懂的语言对强化学习进行介绍,搬运至bilibili的课程视频链接:视频链接https://www.bilibili.com/video/BV18r421j7S4/?spm_id_from=333.337.search-card.all.click&vd_source=22173a6fa342ecf648e799cd933213c5
另外,本文还有英文版本,欢迎访问我的个人主页进行查看,正文如下:
What is RL?什么是强化学习?
An Example 一个例子
我们用一个例子来介绍什么是强化学习
下围棋时,AlphaGo观察棋盘作为模型的输入,将落子作为输出,在多数情况下,它得不到任何奖励。
如果AlphaGo获胜,它得到奖励:1
如果AlphaGo失败,它受到惩罚:-1
AlphaGo根据得到的奖励或惩罚来判断自己做的好或者做的不好,再做出相应的调整
这就是强化学习
Machine Learning to Reinforcement Learning 机器学习到强化学习
我们使用机器学习的框架进行类比
(1)首先定义一个参数未知的函数
(2)定义一个loss函数来进行模型训练
(3)优化(调参)
你的policy network是一个actor,像素集(图片)是输入(observation),不同action的分数(或概率)是actor的输出
注意:
1.输入可以是几个简单的参数,也可以是整个图像
2.根据你的输入方式,你需要用不同的模型设计你的网络,如线性函数,CNN,RNN,transformer......
3.一般采用随机抽样的方式来选择动作,这样你的动作选择就具有一定的随机性
动作完成后,actor会从环境中获得reward,并获得新的observation,根据新的observation再计算模型的输出,完成action,以此往复......
直到游戏结束,整个游戏都是一个episode
所有r的总和是total reward(or return)
注意:
total reward越大越好
同时,我们可以将其定义为loss函数,即-total reward越小越好
我们刚刚说过,一个observation对应一个输出,输出将会指导我们的actor做出action,action再使得环境发生变化,从而使我们到一个新的observation……
我们将得到一系列的输入和输出,叫做trajectory
此外,基于一个输入和一个输出,我们也可以得到相应的reward,将这些reward加起来,我们就得到一个total reward
optimizer的作用是找到一组参数,使网络输出的一组action的总回报最大化
但问题在于,与传统机器学习不同的是,强化学习的过程中实际上存在两个巨大的不确定性:
第一个随机性是行动的选择实际上是基于概率的随机抽样,而不是绝对选择谁的得分最高
第二个是输出动作后对环境的答案不一定是绝对的,你向环境输出两次相同的动作,可能会得到两个不同的结果
所以强化学习的一个大问题是我们如何设置optimizer,以便在这种不确定的情况下获得最大的total reward
Policy Gradient 策略梯度
那么,我们如何让actor采取特定的行动呢?我们简单地定义一个Loss函数来实现这一点
如果我们希望参与者采取行动a^,我们定义L = e(Dkl(a^||a)),在这种情况下,我们将L最小化
另一方面,如果我们不希望参与者采取行动a^,我们定义L = -e并找到它的最小值
是什么KL散度https://blog.csdn.net/weixin_73404807/article/details/142456818
类似地,如果我们想让我们的行动者采取a^而不采取a^',那么我们只需定义L=e1-e2并求解L的最小值。
简单来说,我们希望e1尽可能小,e2尽可能大
好了,现在我们知道了如何控制行为人做什么和不做什么,我们能不能为不同的情况收集一组a^然后告诉行为人什么时候做什么时候不做?
我们甚至可以用其他数字代替+1,-1来表示我们有多希望actor做这件事,或者我们有多不想做这件事
例如两个action分别对应15和8,那么说明我们认为两件事都是积极的,但更希望actor做前者
理论上,是的,但是我们遇到了问题
我们如何找到这么多{s,a^}以及我们如何定义A
现在我们来解决这个问题
我们设置一个随机actor,让他根据观察在环境中采取随机行动,并获得环境的奖励,直到游戏结束,每一个episode都可以收集{s,a}的若干组数据
同时,每次我们输出一个动作,我们都会得到奖励
当奖励是正的,这意味着这个行为得到了积极的回应,反之亦然。
所以,我们难道不应该把每个奖励都看作是该行为的A吗?
事实上,这是完全错误的,原因有两个:
1. 每个行动都会影响随后的行动序列,当然也包括奖励序列
2. actor可以选择牺牲当前的奖励来换取更长的奖励
也就是说,用眼前的回报来定义A只会导致一个短视的actor,ta只关心眼前的利益而忽视长期的利益
这里,我们就需要引入Version1了
我们发现我们的每一个行为都会影响到后续的行为,所以reward会影响所有当前和后续的行为所获得的total reward。
然后我们把t时刻的奖励和t时刻之后的所有奖励加起来,形成cumulative reward,也就是我们的Gt。
用Gt表示An,这就是我们的Version1
如果我们仔细思考,我们仍然可以在Version1中发现问题。如果我们的rn离r1很远,r1对rn的影响似乎很小,所以这个时候把rn加到G里是不是不合理?
所以我们提出了我们的Version2,我们引入了一个折扣因子γ,其中动作离t越远,它对t的影响就越小。这里我们用Gn'来表示An
我们知道好与坏是可以比较的,所以A也是如此。
我们知道当A是正数时,这意味着我们鼓励行为人做这个行为,当A是负数时,我们不希望行为人做这个行为。
在这种情况下,A是相同的,我们需要从所有A中减去A =b(基线)来得到一个正数或者负数,这样参与者就可以趋向于、或者排斥做这个动作
好的,以上就是我们整个过程的伪代码,我们可以找到一个与传统机器学习完全不同的地方,数据收集是在for循环中,也就是说我们需要在每一集收集数据,然后才能做一个训练
这就是为什么我们的强化学习训练过程如此缓慢的原因,因为我们需要在每次更新之前经历一个漫长的数据收集过程
这就很容易提出这样一个问题:为什么不收集一次数据,然后一直用它来训练呢?
这个问题可以用一句中国古话来解释:汝之蜜糖,吾之砒霜。
我们用一次观察的数据进行训练,这只意味着我们从这一次的比赛中获得了知识,但是下一场比赛的情况和这次完全一样,这显然是不可能的。
所以我们不能用我们在一种情况下学到的东西来解决我们在所有情况下遇到的所有问题,这就是为什么我们需要尝试学习不同情况下的策略
当训练并与外部世界交互的actor是相同的时,这种方法称为on-policy
但是当我们的训练actor和交互的actor不相同时,也就是说,当我们的actor使用其他actor的交互数据进行训练时,这种方法被称为off-policy
但我们刚才不是说过:汝之蜜糖,吾之砒霜吗?那么,为什么会有一种off-policy的方法呢?
实际上,所使用的off-policy方法需要让actor知道它与其他行动者是不同的,即选择性学习。
就像如果你问克里斯·伊凡如何赢得一个女孩的心,他会告诉你:你只需要勇敢地说出来,我从来没有那样失败过。
但这种方法显然并不适用于所有人,所以了解我们与其他人的区别是很重要的。
关于off-policy的具体方法,我们已经在这张幻灯片上贴出了链接,如果你需要的话可以自己学习
此外,还有一个更重要的机制,那就是探索,我们需要让行为人在规则之外采取行动,去探索未知的奖励,就像毛主席说的:梨甜不甜,只有尝过才知道
科学家们通过增大entropy或在参数中加入噪声来增加行为者随机采取行动的概率
Actor-Critic 演员-评论家结构
Critic 评论家
拥有一套关于actor的参数θ,用来批判actor看到一个场景时预测未来的discounted reward
注意:
Vθ和游戏处在的时间有关,中盘可能剩下的积分多,尾盘可能少
Vθ和actor有关,即不同的actor对于不同的一套θ,所以同一个s下,不同的actor收益也不同
MC方法:在看到state后,预估Vθ(s),利用Gs进行拟合
这样拟合固然简单,但是我们可以发现,每次估计都需要一个完整的epoch,即完成游戏后才能进行更新,那么假如游戏很长呢?我等不及完成游戏,能不能进行实时更新呢?
这时就需要用到TD,TD先估计st的V,再估计St+1的V‘,通过推导我们发现,V-γV’=rt,所以此时我们只需要一个rt就可以对Vθ进行估计
实际上MC和TD在处理同一个问题时,得到的效果也不一定相同
我们这里举了一个例子能够很好的说明
8轮episode的sr序列如上,假设γ=1,每次训练对V的贡献相同
我们先计算V(sb):
用MC算,第一个ep和第八个ep的V一个是0,中间六个都是1,此时平均下来就是3/4
用TD算,也是3/4
这时看起来二者的答案似乎都是一样的,那么我们再算下V(sa)
用MC算,sa出现一次,就是第一个ep中,此时G(sa)=0,那么显而易见,V(sa)就是0
用TD算呢,G(sa)-G(sb)=rsa→sb=0
即G(sa)=G(sb),那么G(sa)也等于3/4
此时,二者完全不同
那么critic如何帮助actor进行训练呢?我们之前讲到,A的值需要一个normalization的过程,即给他们减掉b,使得有正有负,告诉actor有的动作该做有的不该做,那么每一步骤的G’实际上都在变化,这个b怎么样才能较好的审视此时的价值呢?
我们发现,一个较好的方式是使用V来作为b进行标准化
因为我们的动作a一定程度上是随机选择的,所以我们要分辨出哪些随机动作是好的,哪些是坏的
V实际上是所有可能发生情况的V求数学期望,属于一个平均值
那么此时,倘若G-V>0,说明我们选择动作获得的收益高于平均值,是一个好动作,倘若小于零则恰恰相反
但此时,联想到MC和TD的关系,我们发现依旧是一个ep结束后才能得到G,那么我们能否用预测减去预测来得到A呢?
Advantage Actor-Critic
事实上也确实和TD想法相同,我们通过rt+V(st+1)对G’t进行拟合,这样就完成了策略的实时更新
这种算法就是著名的ACA
另外,因为actor和critic输入相同,我们可以公用CNN网络的前几层
Sparse Reward 稀疏奖励
agent下围棋等,只有最后结束时才会得到reward,但难道之前的aciton都没有意义吗,其实完全不是,围棋手们在全局都会仔细思考得失。
那么agent怎么样才能解决这个问题呢?
第一人称设计游戏Vizdoom
在当年的游戏比赛中,RL被用于Vizdoom中,第一名的游戏团队做了很多reward shaping工作,即在稀疏奖励的工作环境中设计更多的reward
例如
活着会扣一定的分数:使得agent趋向于寻找对手而不是躲避
一直停留会扣分:让agent趋向于探索地图
一直移动会加分:与上面同理
同理,机械臂也是一样的道理,要让板子插入柱子
一方面,我们可以设计奖励:让板子靠近柱子
另一方面,我们还可以设计奖励:让板子平行于地面会扣分
比较有代表性的工作是:利用好奇心进行对稀疏奖励的缓解,详情参考论文
需要注意的是,如何探索有意义的新而不是没有意义的新
Inverse Reinforcement Learning 逆强化学习
上面我们讲到,我们使用reward shaping来缓解奖励稀疏的问题,做法事通过人为设定一些奖励来进行训练,但人为设定的奖励很容易出现问题
举一个比较极端的例子,电影《i,robot》当中
人们为机器人设置了三条规则:
1.不能够伤害人类,也不能坐视人类被伤害
2.在不违反第一条的情况下,机器人不能违反人类的命令
3.机器人要保护自己,在不违反第一条规则的情况下
但最后,机器人却基于这三条laws得到了结论:
我们要把人类都监禁起来,这样人类就不会伤害自己了
所以,人定的reward不一定是最好的
这里就要引入模仿学习
Imitation Learning 模仿学习
模仿学习的过程中,actor与环境互动,但不产生reward,那么我们的agent怎么知道该做什么呢?
答案是利用专家信息trajectory of exports
例如给计算机输入人类驾车的数据让他们学习,又或者用人手操纵机械手臂进行示范教学……
既然如此,那么逆强化学习就是让机器人完全克隆人类的行为吗?
这显然存在问题:
agent经历的事情不可能和export完全相同
例如自动驾驶中,export数据都是安全行驶的数据,倘若完全克隆,那么自动驾驶汽车遇到相撞的情况怎么办?这是export中所没有提及的
这里,我们就要介绍IRL,逆强化学习了
IRL
逆强化学习的过程和强化学习完全相反:
传统强化学习中,我们通过训练agent的价值函数来判断agent采取什么动作,进而继续与环境交互,再从互动中得到reward从而再次训练我们的agent,以此往复
但逆强化学习中,我们通过export数据训练价值函数,再让agent与环境进行互动
其算法过程如上
核心思想为:让老师永远都是最好的
首先定义actor
在每次迭代中,先让actor与环境进行交互,获取一些trajectory
定义奖励函数,使得export数据强于actor的trajectory
让后更新actor参数使得得到奖励函数的最大值,以此往复
流程图如上
标签:李宏毅,actor,学习,奖励,2021,强化,reward,我们 From: https://blog.csdn.net/mmh_Wall/article/details/143217400