Deep learning:四十三(用Hessian Free方法训练Deep Network)

 

  目前,深度网络(Deep Nets)权值训练的主流方法仍是梯度降低法(结合BP算法),固然在此以前能够用无监督的方法(好比说RBM,Autoencoder)来预训练参数的权值,而梯度降低法应用在深度网络中的一个缺点是权值的迭代变化值会很小,很容易收敛到的局部最优势;另外一个缺点是梯度降低法不能很好的处理有病态的曲率(好比Rosenbrock函数)的偏差函数。而本文中所介绍的Hessian Free方法(如下简称HF)能够不用预训练网络的权值,效果也还不错,且其适用范围更广(能够用于RNN等网络的学习),同时克服了上面梯度降低法的那2个缺点。HF的主要思想相似于牛顿迭代法,只是并无显示的去计算偏差曲面函数某点的Hessian矩阵H,而是经过某种技巧直接算出H和任意向量v的乘积Hv(该矩阵-向量的乘积形式在后面的优化过程当中须要用到),所以叫作”Hessian Free”。本文主要是读完Martens的论文Deep learning via Hessian-free optimization记下的一些笔记(具体内容请参考论文部分)。html

  Hessian Free方法其实在多年前就已经被使用,但为何Martens论文又重提这个方法呢?其实它们的不一样在于H矩阵”free”的方式不一样,由于隐式计算H的方法能够有不少种,而算法的名字均可以叫作HF,所以不能简单的认为Martens文章中在Deep Learning中的HF方法就是好久之前存在的方法了(若是真是如此,Deep Learning在N年前就火了!),只能说明它们的思想相似。将HF思想应用于DL网络时,须要用到各类技巧,而数学优化自己就是各类技巧、近似的组合。Matrens主要使用2个大思想+5个小技巧(论文给出的大概是5个,可是其code里面还有很多技巧论文中没有提到)来完成DL网络的训练。算法

  idea 1:利用某种方法计算Hv的值(v任意),好比说常见的对偏差导函数用有限差分法来高精度近似计算Hv(见下面公式),这比之前只是用一个对角矩阵近似Hessian矩阵保留下来的信息要多不少。经过计算隐式计算Hv,能够避免直接求H的逆,一是由于H太大,二是H的逆有可能根本不存在。数据库

   

  idea 2:用下面二次项公式来近似获得θ值附近的函数值。且最佳搜索方向p由CG迭代法(该算法简单介绍见前面博文:机器学习&数据挖掘笔记_12(对Conjugate Gradient 优化的简单理解))求得。网络

   

  技巧1:计算Hv时并非直接用有限差分法,而是利用Pearlmutter的R-operator方法(没看懂,可是该方法优势有不少)。dom

  技巧2:用Gauss-Newton矩阵G来代替Hessian矩阵H,因此最终隐式计算的是Gv.机器学习

  技巧3:做者给出了用CG算法(有预条件的CG,即先对参数θ进行了一次线性坐标变换)求解θ搜索方向p时的迭代终止条件,即:ide

   

  技巧4:在进行处理大数据学习时,用CG算法进行线性搜索时并无用到全部样本,而是采用的mini-batch,由于从一些mini-batch样本已经能够得到关于曲面的一些有效曲率信息。wordpress

  技巧5:用启发式的方法(Levenburg-Marquardt)求得系统的阻尼系数λ,该系数在预条件的CG算法中有用到,预条件矩阵M的计算公式为:函数

   

  上面的7点须要详细阅读Martens的paper,且结合其paper对应的code来读(code见他的我的主页http://www.cs.toronto.edu/~jmartens/research.html).tornado

  下面来简单看看HF的流程图:

  

  流程图说明的是:定义好系统的目标函数,见本博客中的第2个公式,接着定义一个最大权值更新次数max-epochs,每次循环时首先用BP算法求出目标函数的梯度值,接着用启发式的方法取得λ值,而后预条件CG方法来优化参数搜索方向p(此过程须要用到Hv形式的求解函数),最后更新参数进入下一轮。

 

  关于code部分,简单说如下几点:

  运行该程序,迭代到170次,共用了差很少20个小时,程序的输出以下:  

maxiters = 250; miniters = 1
CG steps used: 250, total is: 28170
ch magnitude : 7.7864
Chose iters : 152
rho = 0.50606
Number of reductions : 0, chosen rate: 1
New lambda: 0.0001043
epoch: 169, Log likelihood: -54.7121, error rate: 0.25552
TEST Log likelihood: -87.9114, error rate: 3.5457
Error rate difference (test - train): 3.2901

  code完成的是CURVES数据库的分类,用的是Autoencoder网络,网络的层次结构为:[784 400 200 100 50 25 6 25 50 100 200 400 784]。

  conjgrad_1(): 完成的是预条件的CG优化算法,函数求出了CG所迭代的步数以及优化的结果(搜索方向)。

  computeGV(): 完成的是矩阵Gv的计算,结合了R操做和Gauss-Newton方法。

  computeLL(): 计算样本输出值的log似然以及偏差(不一样激发函数的输出节点其偏差公式各异)。

  nnet_train_2():该函数固然是核心函数了,直接用来训练一个DL网络,里面当少不了要调用conjgrad_1(),computeGV(),computeLL(),另外关于偏差曲面函数导数的求法也是用的经典BP算法。

 

 

  参考资料:

  Martens, J. (2010). Deep learning via Hessian-free optimization. Proceedings of the 27th International Conference on Machine Learning (ICML-10).

     机器学习&数据挖掘笔记_12(对Conjugate Gradient 优化的简单理解)

     http://www.cs.toronto.edu/~jmartens/research.html

     http://pillowlab.wordpress.com/2013/06/11/lab-meeting-6102013-hessian-free-optimization/

相关文章
相关标签/搜索