EDIT: 关于DSGE估计的最新进展可以见一篇大佬新出炉的review paper
---
可微分编程和自动微分这种CS里广泛使用的手段,在计量经济学里才刚刚起步。做机器学习和计量经济学交叉领域的一些人已经摘取了low-hanging fruit:可微分编程已经运用在相对简单的微观结构性模型中了。简单的结构性模型可以很容易在支持可微分编程的Stan语言下实现,而以C为底层的Stan语言速度也有保证,因此开始受到了一些人的喜爱。有做相关内容的同学可以看看Stan这个语言,很有意思,也能直接上手使用。
宏观里比较常用的需要估计的工具是DSGE,更直白地说是一种状态空间模型:
- 我们想要估计控制模型的参数
- 给定
,解完DSGE之后,我们可以给出状态空间的演进方式
- 以模型所得
拟合现实数据
。最大似然估计或是贝叶斯估计两者都需要似然函数
简而言之,DSGE估计方法框架都相同,在文献中已经有的实践方式可以归类为以下区别:
- 估计的参数不同:只估计确定状态空间模型的参数 vs 估计参数同时估计观测不到的潜在状态;
- 状态推断方式不同:线性高斯状态下使用Kalman filter,非线性非高斯状态下用Kalman filter的局部变种,或者particle filter
- 抽样方式不同:MLE或者MAP是直接最优化函数,而Bayesian方式有用conjugate prior,或者Gibbs抽样,或者直接暴力Random Walk Metropolis-Hastings
这些方法大多不是CS里常用的一阶优化方法,而只是用到函数本身值的性质。倘若基于自动微分的可微分编程能在某些步骤中得到应用,那么就能使用相应的一阶优化方法,从而提高DSGE估计的效率。
最近做的project往这个方向推进了一小步:
- 在Julia语言内建立了一个类似Dynare的系统(当然,这一点并不是新的,纽约联储和加拿大央行分别有一个类似的项目),用符号微分处理DSGE系统的各阶微分(这是新的)
- 在此基础上,计算了DSGE各阶近似解法,以及非线性projection method法的梯度:
和
;由于时间有限,以Julia实现了一、二阶结果。
- 在可微分编程的框架下,自定义反向自动微分的伴随算子计算方法,得到似然函数的关于参数和各时间隐状态的梯度。
- 在以上的基础上运用一些在CS和统计里常用的贝叶斯抽样方法,比如Hamiltonian Monte-Carlo (包含No-U-Turn sampler)和Variational Inference方法等等。
有了似然函数的梯度之后,抽样变得更为有效了。在一个中等规模的DSGE下(例如Smets and Wouters)只需要大约2000-3000次抽样就可以获得比较稳定的贝叶斯后验分布。而较老的基于Metropolis-Hastings的方法动辄需要百万次左右。当然,计算梯度的时间复杂度也和参数的数量相关,但相对于Metropolis-Hastings对典型集的遍历不足,HMC/NUTS可以更有效率地遍历典型集。
贝叶斯机器学习中常用的Variational Inference方法也需要梯度信息,而在估计宏观模型中也能展现能力。这种方法虽然一般而言没有收敛的结论,但在DSGE这种比较严格和简单的设定下,只要原模型的识别问题不严重,那Variational Inference就可以收敛。 Variational Inference获得解的速度比HMC快一些。
以上都是在抽样方式上的创新;我们也通过同时估计各阶段的潜在状态变量,摆脱了Kalman filter的桎梏,在方法论上统一了非线性和非高斯模型的估计方法,也摆脱了效率不高的particle filter。这需要我们采用的抽样方式在高阶问题上有良好的表现。实验证明,如果原DSGE模型的识别性比较好,那么基于梯度方法的HMC/NUTS或者是Variational Inference都在高阶问题上表现优异。如果原DSGE模型的识别性本身较弱,那么梯度提供的信息可能也有较大误差。
综上,我们以可微分编程框架拓展了DSGE的估计方法,而新方法在非线性非高斯模型下的表现也不负众望,可以说是把文献向前推进了一小步。(当然DSGE是不是还被广泛应用和喜欢是另一个问题,不过目前各国央行还是在广泛使用这些模型)