强化学习经典算法笔记19:无监督策略学习算法Diversity Is All You Need
本篇介绍一个无监督框架下的策略学习算法DIAYN,全称是Diversity Is All You Need。本文是在学习了张楚珩前辈的【强化学习 77】DIAYN和知乎ID黑猫紧张的PN-23: Diversity is All Your Need (arXiv 1802)之后写成的,向他们表示感谢。
DIAYN核心要点
DIAYN可以在一个没有奖励的环境中,自适应地产生奖励函数,并且自动探索出来一些有用的技能(Skills)。训练的方法是使用最大熵策略最大化一个构造的信息论目标函数。(信息论目标函数的具体形式在下面介绍。)学习到的技能可以用于 1)作为策略学习的初始化,加速学习过程;2)作为分层强化学习的下层策略;3)用于模仿学习。
技能(Skill)的含义:
A skill is a latent-conditioned policy that alters that state of the environment in a consistent way.
如何在没有reward的任务环境上学习不仅diverse,而且有含义、有用的skill,文章提出3个key idea:
- 不同skill访问不同的states,因而skill是distinguishable的。比如跳跃和跑动这两种动作所经历的状态很可能是不一样的。
- 用states而不是actions来区分skills,因为存在多个可能的 a t a_t at可以使 s t s_t st转移到 s t + 1 s_{t+1} st+1。比如一个推箱子的任务,如果施加的力量低于一个阈值,箱子就纹丝不动,但是我们并不清楚施加的力量到底是多少。本质是因为动作 a t a_t at无法被外界观测到,而状态 s t s_t st是可以的且唯一的。
- 让skill尽可能diverse,尽可能随机的act,但始终要保持distinguishable。尽可能的随机,但不能过于随机使得两个skill无法区分开了。diversity和distinguishable是一对矛盾。
模型定义
- S S S和 A A A是状态和动作,均看做随机变量。
-
Z
∼
p
(
z
)
Z\sim p(z)
Z∼p(z)是一个隐变量,策略依赖于
Z
Z
Z,即
π
θ
(
a
∣
s
,
z
)
\pi_{\theta}(a|s,z)
πθ(a∣s,z)。
由此引出Skill的另一个含义,一个“Skill”就是一个固定向量 Z Z Z控制的策略。 -
I
(
X
;
Y
)
I(X;Y)
I(X;Y)表示随机变量
X
X
X,
Y
Y
Y的互信息(Mutual Information)。
H ( X ; Y ) = H ( X ) − H ( Y ∣ X ) = H ( Y ) − H ( X ∣ Y ) H(X;Y)=H(X)-H(Y|X)=H(Y)-H(X|Y) H(X;Y)=H(X)−H(Y∣X)=H(Y)−H(X∣Y)
互信息表示两个变量之间的依赖程度,互信息越大, X X X和 Y Y Y的依赖程度越高。 - H ( X ) H(X) H(X)表示信息熵。
目标函数的构造
目标函数的构造分为三步:
-
最大化状态和skill之间的互信息。
I ( S ; Z ) = H ( Z ) − H ( Z ∣ S ) I(S;Z)=H(Z)-H(Z|S) I(S;Z)=H(Z)−H(Z∣S)
这是为了实现前面所述的第一个key idea,让状态和skill尽可能一一对应。The skill should control which states the agent visits. -
在给定状态 S S S的条件下,最小化 A A A和 Z Z Z之间的互信息 I ( A ; Z ∣ S ) I(A;Z|S) I(A;Z∣S),这是为了实现第二个Key Idea,即保证真正可以用于区分不同Skill的是状态,而不是靠动作。也就是令动作 A A A和技能 Z Z Z之间尽量不相互依赖。
-
把概率分布 p ( z ) p(z) p(z)控制的所有Skill看做一个混合策略,最大化这个策略的条件熵 H ( A ∣ S ) H(A|S) H(A∣S),对应于第三个Key Idea让skill尽可能diverse。
总目标函数
F
(
θ
)
=
I
(
S
;
Z
)
+
H
(
A
∣
S
)
−
I
(
A
;
Z
∣
S
)
=
[
H
(
Z
)
−
H
(
Z
∣
S
)
]
+
H
(
A
∣
S
)
−
[
H
(
A
∣
S
)
−
H
(
A
∣
S
,
Z
)
]
=
H
(
Z
)
−
H
(
Z
∣
S
)
+
H
(
A
∣
S
,
Z
)
\begin{aligned} F(\theta)&=I(S;Z)+H(A|S)-I(A;Z|S)\\ &=[H(Z)-H(Z|S)]+H(A|S)-[H(A|S)-H(A|S,Z)]\\ &=H(Z)-H(Z|S)+H(A|S,Z) \end{aligned}
F(θ)=I(S;Z)+H(A∣S)−I(A;Z∣S)=[H(Z)−H(Z∣S)]+H(A∣S)−[H(A∣S)−H(A∣S,Z)]=H(Z)−H(Z∣S)+H(A∣S,Z)
上式最后一行的第一项是计算
p
(
z
)
p(z)
p(z)的信息熵,在论文中
p
(
z
)
p(z)
p(z)是一个固定的均匀分布,这样保证了第一项具有最大的信息熵。
第二项是最小化 H ( Z ∣ S ) H(Z|S) H(Z∣S),表示在已知状态 S S S的情况下,对应于该状态的随机变量 Z Z Z的信息熵最小化,也就是 S S S和 Z Z Z之间尽量一一对应,不确定性尽量减小。
第三项是对动作的条件熵的最大化,表示在给定状态和Skill的情况下,动作尽可能趋向随机。体现了最大熵策略的思想。
由于无法对所有state和skill上对
p
(
z
∣
s
)
p(z|s)
p(z∣s)进行计算,论文提出用一个discriminator来拟合这个后验分布,即
q
ϕ
(
z
∣
s
)
q_{\phi}(z|s)
qϕ(z∣s)
利用琴生不等式对上式进行放缩,得到一个变分下界(Variational Lower Bound)
G
(
θ
,
ϕ
)
G(\theta,\phi)
G(θ,ϕ):
F
(
θ
)
=
H
(
A
∣
S
,
Z
)
−
H
(
Z
∣
S
)
+
H
(
Z
)
=
H
(
A
∣
S
,
Z
)
+
E
z
∼
p
(
z
)
,
s
∼
π
(
z
)
[
log
p
(
z
∣
s
)
]
−
E
z
∼
p
(
z
)
[
log
p
(
z
)
]
≥
H
(
A
∣
S
,
Z
)
+
E
z
∼
p
(
z
)
,
s
∼
π
(
z
)
[
log
p
(
z
∣
s
)
−
log
p
(
z
)
]
=
G
(
θ
,
ϕ
)
\begin{aligned} F(\theta)&=H(A|S,Z)-H(Z|S)+H(Z)\\ &=H(A|S,Z)+E_{z\sim p(z),s\sim \pi(z)}[\log p(z|s)]-E_{z\sim p(z)}[\log p(z)]\\ &\ge H(A|S,Z)+E_{z\sim p(z),s\sim \pi(z)}[\log p(z|s)-\log p(z)]\\ &=G(\theta,\phi) \end{aligned}
F(θ)=H(A∣S,Z)−H(Z∣S)+H(Z)=H(A∣S,Z)+Ez∼p(z),s∼π(z)[logp(z∣s)]−Ez∼p(z)[logp(z)]≥H(A∣S,Z)+Ez∼p(z),s∼π(z)[logp(z∣s)−logp(z)]=G(θ,ϕ)
DIAYN算法细节
算法流程:
第一步,采样一个
z
z
z。初始化环境。
第二步,与环境交互,得到
s
t
+
1
s_{t+1}
st+1,每步的
a
t
a_t
at的产生都受到
z
z
z的影响。
第三步,利用
s
t
+
1
s_{t+1}
st+1和
z
z
z计算
q
ϕ
(
z
∣
s
t
+
1
)
q_{\phi}(z|s_{t+1})
qϕ(z∣st+1),得到伪奖励(Pseudo-reward)
r
t
=
log
q
ϕ
(
z
∣
s
)
−
log
p
(
z
)
r_t=\log q_{\phi}(z|s)-\log p(z)
rt=logqϕ(z∣s)−logp(z)
第四步,使用SAC算法最大化累计奖励,更新policy
第五步,使用SGD更新判别器参数。
DIAYN的两个网络:一个是策略网络(上图中的蓝色框 SKIIL),基于SAC(Soft Actor-Critic)构建的智能体,它和通常策略网络的区别在于,它还受一个参数 z z z的控制,用于生成不同的策略。
另外一个网络是判别器网络(上图蓝色框中的DISCRIMINATOR),它的作用是计算状态 s t + 1 s_{t+1} st+1是在参数 z z z所控制的skill下访问到的概率,换句话说, q ϕ q_{\phi} qϕ计算的是,当Agent已经访问了状态 s t + 1 s_{t+1} st+1,则这个状态是一个特定的参数 z z z所访问到的概率分布。 q ϕ q_{\phi} qϕ输出该状态可能对应的参数 z z z的概率分布。
判别器网络还起着生成reward的作用。做法很简单,每个episode内, z z z是固定不变的,输入不同的 s t + 1 s_{t+1} st+1就会得到不同的概率值。
目标函数的优化
G ( θ , ϕ ) = H ( A ∣ S , Z ) + E z ∼ p ( z ) , s ∼ π ( z ) [ log p ( z ∣ s ) − log p ( z ) ] G(\theta,\phi)=H(A|S,Z)+E_{z\sim p(z),s\sim \pi(z)}[\log p(z|s)-\log p(z)] G(θ,ϕ)=H(A∣S,Z)+Ez∼p(z),s∼π(z)[logp(z∣s)−logp(z)]
SAC的训练
SAC本身在policy优化过程中,就包括了对policy entropy的maximization,也就是目标函数中的 H ( A ∣ S , Z ) H(A|S,Z) H(A∣S,Z)这一项。
将目标函数中的第二项(expectation),替换为reward function,通过最大化奖励函数的方式,最大化
G
(
θ
,
ϕ
)
G(\theta,\phi)
G(θ,ϕ)的后两项。Reward function的第一项表示,agent访问了
z
z
z对应的状态
s
s
s,就会得到比较大的reward,或者说,已知在特定skill下到达的state能够容易地推断出对应的skill,就会有比较高的分数,反之,如果skill的后验概率很低,说明这个state不能很好的区分skill,得分就低。
r
z
(
s
,
a
)
=
log
q
ϕ
(
z
∣
s
)
−
log
p
(
z
)
r_z(s,a)=\log q_{\phi}(z|s)-\log p(z)
rz(s,a)=logqϕ(z∣s)−logp(z)
在训练中,每个episode内,从 p ( z ) p(z) p(z)内采样一个 z z z,整个episode内的所有采取的动作都与 z z z相关。 p ( z ) p(z) p(z)是均匀分布的Categorical分布,意味着 z z z是离散随机向量。
判别器的训练
判别器的目标是从sample rollout的experience中,训练如何通过state来infer对应的skill,预测给定的状态最可能被哪个参数 z z z控制下的策略访问到。同时,给定一个参数 z z z ,希望它对应的策略能够访问到和其他参数不一样的状态空间,因此训练Agent的奖励函数可以由前面学习到的判别器来给出,即如果访问到了一个关于参数 z z z”特殊“的状态,就给予较大的奖励。文中对如何训练判别器描述不多,个人认为,可能是将 ( z , s t + 1 ) (z,s_{t+1}) (z,st+1)作为一对样本,在交互过程中不断地收集起来,适时进行离线的监督学习,目标就是最大化 q ϕ ( z ∣ s t + 1 ) q_{\phi}(z|s_{t+1}) qϕ(z∣st+1);或者,输入 s t + 1 s_{t+1} st+1,输出预测的 z ~ \tilde{z} z~或输出一个概率分布然后再采样一个 z ~ \tilde{z} z~,然后与真实的 z z z构成监督学习的loss function。
文章提到DIAYN在面对不同的random seed得到了稳定的convergence performance。这一点是因为policy和discriminator的adversarial unsupervised RL training,实际上形成了一个cooperative game,如果discriminator能更好地从state推断skill,skill获得reward也将更加稳定,从而引导policy update得到更加distinguishable的skills,这是一个趋于稳定的adversarial过程。
DIAYN的应用
- 直接把学习到的策略网络权重作为权重初始化。唯一不一样的是,DIAYN 学到的策略网络还接受一个
z
z
z的输入,可能用于权值初始化之后需要输入一个固定的
z
z
z?
- 用于分层强化学习
把学习到的 skills 用于作为 option(action),另外训练一个meta-controller来在不同的skills上做选择,meta-controller 的学习使用普通的强化学习算法。这里设计了两种比较困难的任务,一个是Cheetah Hurdle,类似于小狗跨栏,另一个是Ant Navigation,对Ant的路径有要求,必须按顺序走过地上的五个点。
这里还提到了一种使用一些先验知识使得学习到的 skills更为有用的办法DIAYN+prior。比如,对于Ant来说,我们希望它探索出来的不同策略主要反映在它能够到达的位置的不同,就可以在判别器前加上一个先验,即 q ϕ ( z ∣ s ) → q ϕ ( z ∣ f ( s ) ) q_{\phi}(z|s)\rightarrow q_{\phi}(z|f(s)) qϕ(z∣s)→qϕ(z∣f(s)),而 f ( s ) f(s) f(s)只反映蜘蛛的质心位置。 - 用于模仿学习
给定专家的轨迹之后,挑选出来一个 z ∗ z^* z∗使得它能够最大可能地产生专家轨迹上的状态,然后把对应的策略作为模仿学习的策略。
z ^ = arg max z Π s t ∈ τ ∗ q ϕ ( z ∣ s t ) \hat{z}=\argmax_z \Pi_{s_t\in\tau^*}q_{\phi}(z|s_t) z^=zargmaxΠst∈τ∗qϕ(z∣st)
论文的其他细节
-
如果以 p ( z ) p(z) p(z)是否可学习来区分,文中提到另一种与DIAYN最相似的Unsupervised Skill Discovery算法VIC(Variational Intrinsic Control)。VIC的 p ( z ) p(z) p(z)可学习,但是容易出现多样性的坍缩,只采样有限的几种skill。
DIAYN的做法就是固定 p ( z ) p(z) p(z)。
-
提高training efficiency的一个思路就是reduce the number of objective function queries,即减少目标函数的计算次数。
-
层次强化学习是将一个复杂的任务分解成动作原语(Motion Primitives),而动作原语应当具有某种通用性,可以适用多种task。在实践中,分层强化学习(Hierarchical RL)会遇到三类问题:1)每个动作原语坍缩只有单个动作,2)层次化的策略坍缩到只剩一个动作原语,3)所有的动作原语都试图独立解决完整的任务而不是只关注一方面。
-
pseudo reward中的 log p ( z ) \log p(z) logp(z)对于要求尽快完成的任务并不合适,应该将其去掉。
-
增加网络的capacity有利于Skill的多样性的涌现。
-
网络结构的实现中,对 z z z和 s t s_t st的处理是将两个向量Concatenate起来。
-
H ( A ∣ S , Z ) H(A|S,Z) H(A∣S,Z)在目标函数中的最佳权重是 α = 0.1 \alpha =0.1 α=0.1。