本文是对datawhalechina.github.io的深度强化学习教程的笔记和适当精简
原文地址:https://datawhalechina.github.io/easy-rl/
0x01 引子
强化学习中,agent(玩家)面对的是一个马尔可夫决策模型(MDP)。状态集合 S S S、策略集合 A A A和回报集合 R R R是给定的,我们无法施加改动。
为了获得更高的的收益,agent只能通过选择集合 A A A中“合适”的元素作为在给定状态之下的动作, 从动作中获取回报。Agent在各种状态 s ∈ S s \in S s∈S下选择动作的原则称为策略,记为 π \pi π。
这里,策略 π \pi π在每个状态下选择的动作可能是确定的,也可能是不确定的(用概率描述),即纯策略或者混合策略。
Agent如何选择 a ∈ A a \in A a∈A呢?
- 一种办法是基于Q值
Q
(
s
,
a
)
Q(s, a)
Q(s,a)。
Q
(
s
,
a
)
Q(s, a)
Q(s,a)反应的是:在状态s下选择动作a,接下来所有步骤都用策略
π
\pi
π决定时候的总期望奖励(return)值。假设策略
π
\pi
π是想得到最大的reward,
Q
π
(
s
,
a
)
Q^\pi(s, a)
Qπ(s,a)根据上述策略
π
\pi
π确定,则策略
π
\pi
π便是无脑选择使得Q值最大的那个a。
注1.reward是给定 s , a s, a s,a时候环境给agent的单步奖励,return指的是总的奖励,就是一局游戏里的reward加权求和;
注2.因此,Q值也常常被记为 Q π ( s , a ) Q^\pi(s, a) Qπ(s,a)。 - 另一种办法是基于策略,就是本文要讲的策略梯度(Policy Gradient)。我们会根据输入的状态s来给每一个动作打分(或者说是给一个概率),这个打分的机制希望使得agent的reward最大。
0x02 策略梯度
策略映射 π : S → A \pi:S \rightarrow A π:S→A,告诉我们在给定状态时,怎么采取动作。假设我们要使用深度学习的技术来做强化学习的话,策略就是一个网络。如上图,以atari游戏为例,输入的是一张当前游戏画面,输出的是状态(向左,向右,开火)的打分。Agent会根据这个打分来选择动作。
在一次游戏里面,我们把环境输出的
s
s
s跟演员输出的行为
a
a
a全部串起来, 叫做一个 trajectory(轨迹)
,如下式所示:
τ
=
{
s
1
,
a
1
,
s
2
,
a
2
,
⋯
,
s
t
,
a
t
}
\tau=\{s_1,a_1,s_2,a_2,⋯,s_t,a_t\}
τ={s1,a1,s2,a2,⋯,st,at}
然后,由于
π
\pi
π输出的是概率分布
P
(
a
∣
s
)
P(a|s)
P(a∣s),又已知马尔可夫决策过程的各个参数,所以我们可以求出一条轨迹
τ
\tau
τ出现的概率:
P
θ
(
τ
)
=
P
(
s
1
)
∏
P
θ
(
a
t
∣
s
t
)
P
(
s
t
+
1
∣
s
t
,
a
t
)
P_\theta(\tau) = P(s_1)\prod P_\theta(a_t|s_t)P(s_{t+1}|s_t, a_t)
Pθ(τ)=P(s1)∏Pθ(at∣st)P(st+1∣st,at)
这个概率取决于下面几个部分:
P
(
s
1
)
P(s_1)
P(s1),
P
θ
(
a
t
∣
s
t
)
P_\theta(a_t|s_t)
Pθ(at∣st)和
P
(
s
t
+
1
∣
s
t
,
a
t
)
P(s_{t+1}|s_t, a_t)
P(st+1∣st,at)。
其中除了 P θ ( a t ∣ s t ) P_\theta(a_t|s_t) Pθ(at∣st)是我们可以优化的之外,其他的东西都是模型固有的。
对每一条轨迹 τ \tau τ,我们还可以考察其return R ( τ ) R(\tau) R(τ)。这个return就是当前轨迹中每一步reward的折扣和。
于是我们考虑下面的数学期望:
∑ τ R ( τ ) p θ ( τ ) \sum_\tau R(\tau)p_\theta(\tau) τ∑R(τ)pθ(τ)
此即agent在当前策略下,可能得到的期望。我们要最大化这个期望,一个自然的想法是对这个期望做梯度上升。
上面的推导过程不做赘述,可以参考原文。
在推完上述期望值的梯度之后,我们使用样本均值代替总体均值时,可以对 τ \tau τ进行采样,对这一批 τ \tau τ进行优化。上式的最后一行,因为它是对 θ \theta θ的梯度,所以可以使用反向传播对agent的参数进行更新。
0x03 一些tip
return的平移
假如 R ( τ ) R(\tau) R(τ)总是正的,但是 R ( τ ) R(\tau) R(τ)有大有小,我们就需要减少 R ( τ ) R(\tau) R(τ)小的那个trajectory出现的概率。因此,我们只需要将上图中的所有 R ( τ ) R(\tau) R(τ)减去一个偏置项,得到 R ( τ ) − b R(\tau) - b R(τ)−b即可。
给每一个动作合适的分数
在同一场游戏里面 也许有些动作是好的,有些动作是不好的。假设整场游戏的结果是好的,并不代表这个游戏里面每一个行为都是对的。若是整场游戏结果不好,但不代表游戏里面的所有行为都是错的。所以我们希望可以给每一个不同的动作前面都乘上不同的权重。每一个动作的不同权重,它反映了每一个动作到底是好还是不好。
一个做法是计算这个对的奖励的时候,不把整场游戏得到的奖励全部加起来,只计算从这一个动作执行以后所得到的奖励,如下图所示:
REINFORCE: Monte Carlo Policy Gradient
Monte Carlo (MC) 可以理解为算法生成一个trajectory之后,再拿这个trajectory的数据去学习一手,做一次更新,也叫回合更新。我们已经拿到了一整个回合的数据的话,也能够拿到每一个步骤的奖励,就可以很方便地去计算每个步骤的未来总收益,就是我们的return。
我们介绍下策略梯度最简单的也是最经典的一个算法 REINFORCE。REINFORCE 用的是回合更新的方式。
REINFORCE的算法如上图。
其实REINFORCE的想法很简单:把下图的梯度一步步做更新。
概括一下它的想法就是:把
∑
t
=
1
T
n
R
(
τ
n
)
g
r
a
d
log
p
θ
(
a
t
n
∣
s
t
n
)
\sum_{t=1}^{T_n}R(\tau^n) grad \log p_\theta(a_t^n|s_t^n)
∑t=1TnR(τn)gradlogpθ(atn∣stn) 里的求和号拆开来一步一步做更新。为了方便编程,也可以从后往前地做更新,即算法图示中使用for t=T-1,…,1,0的顺序。