Review - Adadelta

前面我也曾经说过,会对一些我阅读过的重要论文做一些自己的简要记录,放到这里。这篇文章就是第一篇我的记录,也是目前我在实习的最重要的Inspiration的来源——Adadelta算法。原文链接:Adadelta

Adadelta算法是一种目前为止使用非常广泛的用于调节Learning Rate的算法。相比于传统的SGD他受超参数问题的影响较小,在较大的超参调节范围内都能达到很好的学习效果。这个算法是由前纽约大学博士Matthew D. Zeiler在Google实习期间设计出来(话说这货我看是不太地道,学了人家的黑科技就跑路创业去了,博士都不干了……算了人家屌管他的)。

鉴于几乎现在所有的NN,尤其是循环NN(Recurrent NN, RNN)的Python实现包里面都有Adadelta(和AdaGrad和传统SGD都是标配),我在这里只会简要地描述一下算法的灵感来源和构成,不会涉及代码。

先看看Zeiler是怎么“吹”这个算法的:
1) 对于超参数的敏感度较低,这个也是这个算法所谓的“卖点”吧;
2) 较低的计算复杂度,毕竟相对传统的牛顿算法降了一阶;
3) 对于不同NN架构的自适应度较高(这个大家都懂的,都这么吹~)。

接着咱们说话简单点,直接将Adadelta的伪代码奉上:

整体上Adadelta的思路就是基于Adagrad的基础上使用了两种优化方法:
1)使用过去的w个梯度而不是全部梯度用于参数迭代更新。在这里不得不承认Matthew的理论基础的扎实———他使用了类似于动量因子(Momentum)的平均方法(上图第4步)将梯度有机累加起来,这里如果没有系统的学习神经计算里的Momentum Learning部分而且对其有深刻理解的话八成是想不到这一点的,当然也不排除他在Google黑科技下做了很多的尝试的可能;
2)使用Hessian近似方法和RMS计算近似二阶牛顿权重更新,这里用到了一些他所在大学里大牛Yann LeCun当年的成果。这部分个人认为———对,个人认为———其实是Adadelta的一个盲区———Matthew的方法很大程度上避免了二阶计算的复杂度不假,但是首先Hessian本身也具有很高的复杂度(好吧毕竟降了一维的运算,还是降低了),其次由于在这一步里当前的update是计算目标而不是已知量,不得已Matthew只能假设局部的低曲率(curvature),因此也就保留了这个更新算法受到数据Sharpness程度的影响。从他的论文来看,在MNIST数据集上这个问题还没有被很明显的放大。

目前我正在试图实现这套算法并将其运用到医学离散信号识别中,上述的问题我个人并不希望出现,不过鉴于医学信号普遍具有不稳定性和长相关性,因此还需进一步验证。

写作仓促,文中相比应有一些理解性错误,欢迎邮件批评指正,拒绝人身攻击,拒绝PY!

另:Deep Reinforcement Learning Tutorial的坑将不会填上,原因是我发现了一篇解释更详尽,并且更加具有前瞻性的博文———来自OpenAI课题组成员,前斯坦福博士生Andrej Karpathy的Deep RL的Overview。在这里奉上链接:Andrej Karpathy's Deep RL。我在这两天将会详尽地阅读这篇文章但鉴于不是长者,能力和姿势水平有限,不会做出翻译,如有问题希望通过各种渠道和大家一同交流。