本篇介绍一个无监督框架下的策略学习算法DIAYN,全称是Diversity Is All You Need。本文是在学习了张楚珩前辈的【强化学习 77】DIAYN和知乎ID黑猫紧张的PN-23: Diversity is All Your Need (arXiv 1802)之后写成的,向他们表示感谢。
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之间的互信息。
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(θ,ϕ)
算法流程:
第一步,采样一个 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本身在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过程。
如果以 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。