一阶的方法(SGD,RMSProp,momentum,Adam等)其实区别都不太大;常用的二阶的方法往往都是些off-the-shelf的凸优化方法(quasi-Newton、truncated newton、共轭梯度等
+line search),对于非凸的和随机的大规模优化问题都不太好用。有兴趣的可以看看http://ieeexplore.ieee.org/document/7875097/里的理论,类似quasi-newton,用到preconditioner,但不同的是,最优的preconditioner涉及到期望(对付随机梯度噪声)和切线方程的外积的形式(对付非凸,有点类似Gaussian-Newton的形式)。Preconditioner在Lie group上用自然梯度下降来求解,当然Preconditioner可以是limited-memory的,这样才可用在large-scale的问题上。
最近有空整理了一番,写了一套tensorflow的demo code,有rnn, lstm, cnn等各种简单的benchmark problems,放在https://github.com/lixilinx/psgd_tf上,有兴趣的可以看看,ESGD和batch normalization与特定的limited-memory preconditioner是密切相关的。有些Pytorch demo(不完整,核心是numpy写的)放在https://github.com/lixilinx/psgd_np上。总之,感兴趣可以尝试一下。
评论 (0)