1.6 蒙特卡洛梯度估计
在深度强化学习的模型中,为了能够让模型对价值函数的估计,或者模型对于策略的估计能够使模型获得更多的回报,需要得到最终的回报相对于模型的参数的梯度。由于模型的复杂性,在通常情况下这些梯度的解析求解过程往往非常复杂,甚至不能得到解析解。为了得到相对模型参数的梯度,需要引入蒙特卡洛梯度估计,对模型的输出进行采样,计算采样输出相对参数的梯度,然后用计算得到的梯度期望对参数的真实梯度进行估计。这个过程被称为蒙特卡洛梯度估计(Monte Carlo Gradient Estimation)。为了方便读者后续的理解,这里用一个简单的例子,结合PyTorch来展示一下如何进行蒙特卡洛梯度估计。
首先明确一下我们面对的问题,这里会涉及一些简单的数学公式推导,如果读者觉得比较复杂,可以略过直接看结论。假设策略对应的是一个概率分布p(x|θ),其中θ是策略对应的模型的参数,x是策略输出的随机变量(比如在策略梯度算法里面可以是智能体的一个动作,该动作服从一定的概率分布)。需要研究的是策略输出x的一个函数(比如在策略梯度算法中可以是回报函数),即f(x)的期望对模型参数θ的梯度,如式(1.10)所示。这里假设梯度和积分符号可以交换(涉及的数学需要函数的一致收敛性,这里不严谨地认为可以交换),可以把梯度记号放进积分符号里。由此,得到了式(1.11)的一系列操作,需要注意的一点是,为了得到式(1.11),中间的推导过程利用了自然对数的求导公式和微分链式法则,即∇θlogg(θ)=∇θg(θ)/g(θ)。
从式(1.11)可以得到一个结论,我们需要求的随机变量相关函数f(x)的期望,相对于产生随机变量的参数的梯度,等于随机变量相关函数f(x)和该随机变量的概率密度函数的自然对数的乘积,在该随机变量分布下的期望。
有了上面的公式,我们继续来看蒙特卡洛梯度估计的例子。在示例里,假设策略服从正态分布N(μ,σ2),也就是期望为μ、标准差为σ的正态分布。为简单起见,假设f(x)=x2,也就是非常简单的平方函数(在深度学习中,也可以称为均方误差,Mean Squared Error, MSE)。这是一个少数的可以解析求解其相对参数梯度的函数,把函数代入式(1.10),首先计算式中的积分部分,可以得到f(x)的积分值与期望μ和标准差σ有关,为μ2+σ2。
这样,我们有这个梯度的解析解,期望相对于μ的梯度是2μ,相对于σ的梯度是2σ,如式(1.12)所示。
接下来对这个梯度进行数值上的验证。把正态分布的密度函数代入式(1.11),可以得到式(1.13)。
其实到了式(1.10)已经可以用PyTorch求解了,因为PyTorch有对应的类torch.distributions.normal.Normal来自动进行采样,并且可以利用PyTorch的自动求导法则,计算采样得到的随机变量相对于输入参数的梯度。但是,假如没有PyTorch这么方便的类和内部函数,需要自己手动写相关的代码怎么办?这时需要的是一个变换,这个变换被称为重参数化技巧(Reparameterization Trick)。为了使用这个技巧,我们需要一个标准正态分布产生器N(0,1),也即是一个随机数产生器,能够产生服从期望为0、标准差为1的随机数,这样随机变量x与参数μ和σ的关系如式(1.14)所示。
在式(1.14)中,可以看到变量x的参数从正态分布变成了参数μ和σ,而标准正态分布在每次采样过程中随机产生,整个过程相当于变换了参数,也就是“重参数化”这个名字的来源。这样,我们可以很简单地得到随机变量相对于参数μ和σ的梯度,即1和N(0,1)。同时,因为我们能得到任意函数g(x)相对于x的梯度,接下来只需要应用链式法则,即可得到任意函数g(x)相对于参数μ和σ的梯度,当然这里的g(x)也包含lnp(x|μ,σ)相对于参数μ和σ的梯度(读者可以试着用这个技巧直接去估计∇θEx~pf(x),可以得到同样的结果,只是式(1.11)在强化学习的场景下用得更多,所以用这个技巧去估计式(1.11))。在PyTorch中可以利用rsample方法(如代码1.1所示)使用重参数化技巧进行采样,其中传入的参数是输出随机张量的形状。这里假定读者对PyTorch深度学习框架有一定的了解,如果读者需要初步了解PyTorch,可以参考PyTorch官网上的快速入门教程。
有了以上公式,下面来写一段对应的PyTorch代码验证一下想法。为简单起见,这里(任意的)设μ=1.0,σ=2.0。在笔者的计算机上,这段代码运行的结果是μ的梯度为2.0189,而σ的梯度为4.1002。可以看到,这个值很接近于之前得到的解析解(2μ,2σ)。于是代码1.1从侧面反映了前面推导的公式的正确性。
代码1.1 使用PyTorch进行蒙特卡洛梯度估计。
最后,作为前面推导式(1.11)的一个补充,这里推导一个公式,如式(1.15),这个公式在后续的策略梯度里会有应用。这个可以看作式(1.11)的一个逆向变换,意思是概率分布的自然对数的期望相对于概率分布的参数的梯度为0。在强化学习中,这个结论意味着,当回报和模型的参数无关时(和模型输出的随机变量无关),参数的策略梯度为0,也就意味着无论如何调整模型的参数,对智能体的回报都没有影响。有了式(1.15),就很自然地得到这个结论,也和日常经验相符合。读者也可以仿照代码1.1,写一段代码(令xs_val=1)来验证这个结论。