经典强化学习与值分布强化学习的区别
由于状态转移的随机性,状态表示的混叠效应(编码状态时带来的信息丢失)以及函数逼近的引入(使用函数表示状态价值带来的信息丢失),状态价值通常具有一定随机性,并可以用某种分布来表示。经典强化学习(DQN算法等)使用单个值的形式预测状态价值可能会忽略掉许多有效信息。因此值分布强化学习旨在拟合出状态价值的分布,从而提高预测准确性。值得一提的是,PG类算法在应用于连续动作时通常也会以某种分布作为输出。但这种情况下输出的分布为动作的概率分布,主体为动作;而值分布强化学习输出的分布为给定状态-动作对情况下其动作价值的分布,主体为价值。
Bellman算子
算子,即operator,接受函数输入,并输出函数。若Q(s,a)是一个函数,如果s是一个n维的变量,a是一个m维的变量,那么动作价值函数Q是一个Rn×Rm→R的函数。我们可以引入Bellman算子T来表示Bellman方程。对于某一个具体策略π以及状态转移矩阵P,我们有:
TπQ(x,a):=ER(x,a)+γP,πEQ(x′,a′)
其中R(s,a)是环境的一部分,其输入输出与Q相同,为Rn×Rm→R。可以看出,Bellman算子接收输入函数Q,并输出函数Q′。
从Bellman算子的角度来描述策略评估,其实就是在找一个函数Q,满足TπQ=Q,也就是在找算子的不动点(经过算子运算后函数不发生改变)。具体可以参考这一篇文章。
以相同的手法我们可以定义最优Bellman算子,其用来表示Bellman最优方程:
TQ(x,a):=ER(x,a)+γEPa′∈AmaxQ(x′,a′)
同样的,使用最优Bellman算子做策略评估,就是在找算子T的不动点。
同样由这篇文章,可以证明算子T,Tπ都满足γ−contraction的条件,即有:
∥TπQ1−TπQ2∥∞≤γ∥Q1−Q2∥∞
∥TQ1−TQ2∥∞≤γ∥Q1−Q2∥∞
于是根据Contraction Mapping Theorem,上述两个算子都具有唯一的不动点。即有:
Tπ∞Q=QπT∞Q=Q∗
KL散度
对于分布p,q,它们的KL散度定义为:
KL(p∥q)=∫p(x)logq(x)p(x)dx
KL散度能衡量两个分布之间的差异,但是不具有对称性。其可以用于离散形式的计算,有:
KL(p∥q)=i=1∑Np(xi)logq(xi)p(xi)=i=1∑Np(xi)[logp(xi)−logq(xi)]
Distributional DQN
Distributional DQN将传统DQN中的value function换成了value distribution。原来的DQN中的值函数为Q(s,a),它接收一个状态动作对s,a,并输出实数格式的动作价值Q。
与其相对,Distributional DQN接收一个状态动作对x,a,并输出一个值分布Z(x,a)=P(v∣x,a),这个分布描绘了状态动作对x,a所有可能的价值v的范围以及可能性。易得,Q(x,a)=E[Z(x,a)]。
针对值分布,可以定义状态转移算子:
PπZ(x,a)X′:=Z(X′,A′)∼P(⋅∣x,a),A′∼π(⋅∣X′)
这个算子是Z→Z,也就是接收一个分布,并输出另一个分布。可以看出,算子接收当前状态动作对x,a生成的值分布Z(x,a),根据状态转移矩阵P以及当前策略π生成下一时刻状态动作对x′,a′生成的值分布Z(x′,a′)。
在值分布情况下的Bellman算子就可以被定义为:
TπZ(x,a):=DR(x,a)+γPπZ(x,a)
与状态转移算子Pπ相同,值分布下的Bellman算子同样也是Z→Z。可视化后的情况如下图:
在DQN中,我们计算出一个\(r + \gamma \underset{a^*} \max Q(x', a^*)\),并使当前Q(x,a)尽量靠近这个值。相对应的,我们可以在Distributional DQN中定义最优Bellman算子TZ,其满足:
TZ=TπZ for π∈GZGZ:={π:a∑π(a∣x)EZ(x,a)=a′∈AmaxEZ(x,a′)}
GZ看起来很复杂,但实际上指的是令策略π取最优策略。因此,在Distributional DQN中,我们需要让当前值分布Z(x,a)尽可能的靠近TZ(x,a)这个分布。
C51定义
由于Z(x,a)分布并不一定符合某种特殊的预设模式,因此C51方法放弃使用高斯分布等参数化方式表示Z(x,a),而是使用了51个等间距的atoms描绘一个分布。实际上其与描绘分布的直方图差距不大,但是直方图更注重区间,而C51算法使用的comb form的方法更注重"点"。当然这个分布肯定是近似的结果,点的范围和个数取决于应用情况。实际上,假设分布Z(x,a)的上界为VMAX,下界VMIN,将最大值和最小值之间的区间均匀化为N个点,则每个点zi有:
{zi=Vmin+iΔz:0≤i<N,Δz:=N−1VMAX−VMIN}
例如,当N=7时,一共有7个atoms,其分布可能为:
现在我们来考虑C51的网络架构。在DQN中,网络的输入为s,输出为∣A∣维的一个向量(Q(s,a1),Q(s,a2),...,Q(s,am))。向量的每一个元素代表对应动作状态对s,a的预测Q值。而在C51算法中,输出变成了一个矩阵。矩阵的行数为∣A∣,每一行代表给定s,a的值分布。矩阵的列数为N,每一列代表值分布在给定atom上的概率。若atoms集合为{z0,z1,⋯,zN−1},C51的输出应该为({p0a1,p1a1,⋯,pN−1a1},{p0a2,p1a2,⋯,pN−1a2}⋯,{p0am,p1am,⋯,pN−1am})。
为了保证神经网络输出的矩阵的每一行构成一个离散的分布,可以对神经网络的输出进行softmax操作。具体为:
Zθ(x,a)=ziw.p.pi(x,a):=∑jeθj(x,a)eθi(x,a)
C51损失函数
网络结构定义完成后,我们需要设置损失函数,从而完成训练过程。在DQN中,由于网络输出为一个实数,因此我们可以使用均方误差作为损失函数。但是C51算法输出为一个分布,因此我们需要找到一个衡量分布之间距离的方法。通常我们使用Wasserstein Metric作为衡量分布距离的方法(具体解释看这篇文章,其实也看不太懂呜呜)。使用Wasserstein Metric可以保证Bellman算子在输出分布的情况下也满足γ−contraction的条件。但是,对于Q-learning实际用到的最优Bellman算子则没有这样的理论保证。而且使用SGD方法训练时是没有办法保持Wasserstein Metric的。因此,C51算法使用了KL散度启发式的衡量两个分布的距离。
投影Bellman更新
使用KL散度的离散形式计算可以很容易的算出两个分布之间的距离。但是在实际运算中还会产生一个问题。我们可以通过模拟整个过程找出问题。
首先我们从Buffer中采样一个(s,a,r,s′),根据q-learning函数使用的最优Bellman算子,有:
TZ(x,a):=DR(x,a)+γPZ(x,a)
因此为了改善Z(x,a),我们需要计算R(x,a)+γZ(x′,a∗)。在DQN中,a∗的选择是根据a∗←argmaxaQ(x′,a)标准的。在C51中我们沿用这个标准,并通过Q(x,a)=E[Z(x,a)]来计算Q(x,a)。具体有:
Q(st+1,a):=i∑zipi(st+1,a)
根据上述标准,我们可以从target network中获得Z(x′,a∗)的结果,是一个N维的向量,我们设其为p′。那么R(x,a)+γZ(x′,a∗)分布就可以表示为:
有p0′的概率取R+γz0
有p1′的概率取R+γz1
......
有pN−1′的概率取R+γzN−1
但我们检查Z(x,a)可以发现,其可以表示为:
有p0′的概率取z0
有p1′的概率取z1
......
有pN−1′的概率取zN−1
可以发现,Z(x,a)与R(x,a)+γZ(x′,a∗)的atoms没有对齐。C51的解决方法是,将R+γzk的概率分摊到zk和zk+1上。具体的分摊比例按照R+γzk到zk与zk+1的距离的反比即可。
以这篇文章中的例子,令T^z0=R+γz0对应的概率为p0(x′,a′),将其投影到相邻的支点z0,z1上,如图:
则z0分得的概率的大小为:
[1−z1−z0T^z0−z0]p0(x′,a′)
经过上述分配,我们可以得到一个新的分布ΦTZ(x,a),损失函数可得为:
DKL(ΦTZ(x,a)∣∣Z(x,a))
C51具体算法流程如下: