梯度法(SGD)、拟牛顿法(LBFGS)与共轭梯度法(CG)

一、基本原理

梯度法:

一阶泰勒级数展开式,f(x+dx) = f(x) + sum(i,df/dx(i)*dx(i)) + r(x,dx)。其中r(x,dx)为余项,当dx很小时,可忽略余项。推倒得迭代:x=x+dx=x-miu*dfx。

优点:可收敛于一个极小值点。

缺点:收敛速度慢,在梯度值小时尤为明显。学习率miu需要依据经验赋值。

牛顿法:

         由二阶泰勒级数展开式,f(x+dx) ~= f(x) + f’(x)*dx + 1/2*(dx)’H(dx),H为黑森矩阵。推到的迭代式:dx=-H[-1]df/dx。

         优点:精度高于梯度法。

         缺点:H矩阵计算存储复杂,收敛性没法保证。

         拟牛顿法:利用函数一阶导数(梯度)来近似递推H矩阵。

共轭梯度法:

         共轭梯度法也是一种近似的二阶方法,只需计算一阶导数,不需计算和存储二阶导数。

二、三者性能比较(引自网络)

本文主要是参考论文:On optimization methods fordeep learning,文章内容主要是笔记SGD(随机梯度下降),LBFGS(受限的BFGS),CG(共轭梯度法)三种常见优化算法的在deeplearning体系中的性能。下面是一些读完的笔记。

SGD优点:实现简单,当训练样本足够多时优化速度非常快。

SGD缺点:需要人为调整很多参数,比如学习率,收敛准则等。另外,它是序列的方法,不利于GPU并行或分布式处理。

  各种deep learning中常见方法(比如说AutoencoderRBMDBNICASparse coding)的区别是:目标函数形式不同。这其实才是最本质的区别,由于目标函数的不同导致了对其优化的方法也可能会不同,比如说RBM中目标函数跟网络能量有关,采用CD优化的,而Autoencoder目标函数为理论输出和实际输出的MSE,由于此时的目标函数的偏导可以直接被计算,所以可以用LBFGSCG等方法优化,其它的类似。所以不能单从网络的结构来判断其属于Deeplearning中的哪种方法,比如说我单独给定64-1002层网络,你就无法知道它属于deep learning中的哪一种方法,因为这个网络既可以用RBM也可以用Autoencoder来训练。

  作者通过实验得出的结论是:不同的优化算法有不同的优缺点,适合不同的场合,比如LBFGS算法在参数的维度比较低(一般指小于10000维)时的效果要比SGD(随机梯度下降)和CG(共轭梯度下降)效果好,特别是带有convolution的模型。而针对高维的参数问题,CG的效果要比另2种好。也就是说一般情况下,SGD的效果要差一些,这种情况在使用GPU加速时情况一样,即在GPU上使用LBFGSCG时,优化速度明显加快,而SGD算法优化速度提高很小。在单核处理器上,LBFGS的优势主要是利用参数之间的2阶近视特性来加速优化,而CG则得得益于参数之间的共轭信息,需要计算器Hessian矩阵。

  不过当使用一个大的minibatch且采用线搜索的话,SGD的优化性能也会提高。

  在单核上比较SGDLBFGSCG三种算法的优化性能,当针对Autoencoder模型。结果如下:

  可以看出,SGD效果最差。

  同样的情况下,训练的是Sparse autoencoder模型的比较情况如下:


  这时SGD的效果更差。这主要原因是LBFGSCG能够使用大的minibatch数据来估算每个节点的期望激发值,这个值是可以用来约束该节点的稀疏特性的,而SGD需要去估计噪声信息。

  当然了作者还有在GUPconvolution上也做了不少实验。

  最后,作者训练了一个2隐含层(这2层不算pooling层)的Sparse autocoder网络,并应用于MNIST上,其识别率结果如下:


 

你可能感兴趣的:(算法)