Basic Components
在强化学习中,主要有三个部件(components):actor、environment、reward function。其中env和reward function是事先就定好的,你不能控制的。唯一能调整的是actor的policy,使actor能获得最大的reward。
Policy of Actor
- Policy 是一个参数为的网络
- input:以向量或矩阵表示的机器的observation
-
output:对应于输出层中的神经元的每个动作
Example: Playing Video Game
-------------------------------------------------------------------
actor 的目标就是将 Total reward R 最大化。
Actor, Environment, Reward
其中 代表的是environment,一般我们没办法控制这一部分。我们能控制的是采取不同的(policy网络的参数),进而影响,最终对产生影响。
给定一个可以得到一局游戏的R,我们要做的就是调整actor中的参数,使得最大化。但是注意不是常量scalable,而是随机变量random variable,因为采取哪个action是有随机性的,而环境给出哪个state也是有随机性的。
所以对于R我们要计算他的期望。穷举所有的trajectory并计算每个出现的概率,最后计算。或者可以这样理解,从的分布中采样出一个,然后计算的期望。
那很明显我们要做的就是最大化Expected Reward,所以可以采用policy gradient来做。
Policy Gradient
为了使得最大化,我们需要做gradient ascent,即对求梯度,注意中没有必要是可微的,但不影响。是无法计算的,所以sample出N个,对每个求在求和求平均。
如下:因为
由环境决定,我们无法知道,并且该项本来和没有关系,只能对计算梯度,本质上就是对计算梯度,最后课改写为
若在下执行使得为正,则增加概率,为负责减少在执行的几率。
在实际实验中,我们会让actor去和environment做互动,产生左边的数据。左边的方框是做sample,获得很多 (s, a) 的pair(代表在s下采取a,得到)。然后将这些数据送入训练过程中计算 ,然后更新模型的参数
注意数据只用一次,就是说更新一次参数后前面收集的所有数据就不能再用了,效率比较低。因为policy gradient ascend是on-policy的算法。
采集一次数据,更新一次参数后,要重新采集一次数据。
minimize cross entropy就是maximize likelyhood
Tip 1: Add a Baseline
蓝色柱子的代表在某一state下,采取三种动作的概率,绿色箭头则代表每种动作的Reward,长的标示Reward比较大。
之前约定的做法:假如执行 action a 后 R 为正,则提高 action a 出现的概率;R 为负,则降低 action a 出现的概率。
但是可能某个游戏不管什么执行动作得到的 reward 都是正的(比如0-20),则若执行 action a 后 R 的增加量大,则 action a 出现概率增加得大;执行 action b 后R的增加量小,则 action b 出现概率增加得小。(注意在reward恒为正的情况下,看起来无论如何执行某 action 的概率都会增加,只是增加多少的问题) 因为所有action出现的概率和为1,那么在理想情况下,在归一化后相当于 action a 出现概率上升而 action b 出现概率下降。(即增加得少的归一化后相当于下降,增加得多的归一化后才上升)
问题是在sample中可能有些动作没有sample到,比如 action a(我们不知道这个action得到的reward是大是小),但归一化后 action a 出现的概率会必然下降(因为 action b/c 出现的概率无论如何都会上升,这样就把 action a 出现的概率给压下去了),这显然是不妥的。
为了解决这个问题,我们希望reward不要总是正的,所以将,
,b是一个baseline,这样如果一个 reward 是一个很小的正值,减掉b后就会变负。可以用的平均值代替。
Tip 2: Assign Suitable Credit
由上图可知,在同一场游戏中,不管其中的某个 action 是好是坏,总会乘上相同的权重 R,这显然也是不公平的。
比如上图左边部分,整场游戏的 reward 是+3,按规定其中三个都要被乘上 3 的权重,但是未必见得好,因为执行后的即时得分是 -2。如果我们sample的次数够多,可能会看出不够好,这个问题能够得到解决。但是实际中可能没办法搜集足够多的数据,所以在sample次数不够多的情况下,我们希望每个action的权重不同。
解决的方法是,不把整场游戏的 R(+5+0+-2=+3)作为统一权重,而将执行该动作后剩下序列的【reward之和】作为该动作的权重。比如对于 ,它的权重应该为(+0-2=-2)。即执行某个 action 前得到多少 reward 都跟该 action 无关,该 action 只影响之后的游戏过程。
还需要考虑的一点是,当前的 action 对之后游戏的影响会随之时间推移而减弱,所以我们要有 discount,在求和的每一步都乘上一个小于1的(比如0.9),这样 action 之后的动作越多,即时分数乘上的 越多,越往后得到reward就会打上更大的折扣。
把 这一项称作Advantage Function,也叫优势函数。它表示在actor在下采取,相较于其它action有多好。
上标 代表采用参数为的policy 的 actor 。
网友评论