机器学习中,有很多方法试图寻找模型的最优解。 常见分类:
梯度下降法动量优化法自适应学习率优化算法梯度: 在微积分中,对多元函数的的参数求 θ \theta θ 偏导数, 把求得的各个参数的导数以 向量的形式写出来就是 梯度。 梯度是函数变化最快的地方。 梯度下降是迭代法的一种,在求解机器学习算法的模型参数 [公式] 时,即无约束问题时,梯度下降是最常采用的方法之一。 评价: 梯度下降法主要有两个缺点:
训练速度慢: 每走一步都要计算调整下一步的方向,下山的速度变慢。 在应用于大型数据集中,每输入一个样本都要进行一次参数更新,且每次迭代都要遍历所有的样本。 会使得训练过程及其缓慢,需要花费很长时间才能得到收敛。容易陷入局部最优解: 由于是在有限视距内寻找下山的方向。 当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。 所谓的局部最优解就是鞍点。 落入鞍点,梯度为0, 使得模型参数不在继续更新。梯度下降法目前主要分为三种方法,区别在于每次参数更新时计算的样本数据量不同:
批量梯度下降法(BGD, Batch Gradient Descent)随机梯度下降法(SGD, Stochastic Gradient Descent)小批量梯度下降法(Mini-batch Gradient Descent)
下图是各个算法在等高线的表现,它们都从相同的点出发,走不同的路线达到最小值点。可以看到,Adagrad,Adadelta和RMSprop在正确的方向上很快地转移方向,并且快速地收敛,然而Momentum和NAG先被领到一个偏远的地方,然后才确定正确的方向,NAG比momentum率先更正方向。SGD则是缓缓地朝着最小值点前进。
前面说到,我们希望优化算法能够收敛速度快,并且想找到全局最优。对于凸函数来说,其仅有一个极值点,就是全局最优点,如图4所示,此时采用梯度下降算法是可以收敛到最优点的,因为沿着下坡的道路走就可以了。 但是其实现在的深度学习模型是一个庞大的非线性结构,这样其一般是非凸函数,就如图5所示那样,存在很多局部最优点(local optimum),一旦梯度下降算法跳进局部陷阱,可以想象其很难走出来,这就很尴尬了,此时梯度下降算法变得不再那么可靠,因为我们想要的是全局最优。很难找到全局最优,这可能是目前优化算法共同面对的问题,如进化算法。 不过到底深度学习的损失函数是不是存在很多局部最优点呢?前面所有的分析都是基于低维空间,我们很容易观察到局部最优点。但是深度学习的参数一般庞大,其损失函数已经成为了超高维空间。但是Bengio等最新的研究表明,对于高维空间,非凸函数最大的存在不是局部最优点,而是鞍点(saddle point),鞍点也是梯度为0的点,但是它不像局部最优点或者全局最优点。对于局部最优或者全局最优点,其周围的所有方向要朝向上(最小)或者朝向上(最大),但是考虑到参数庞大,很有可能是一部分方向朝下,一部分方向朝上,这就成为了鞍点。意思就是说在高维度空间,不大可能像低维度空间那样出现很多局部最优。而且鞍点也不大可能会成为梯度下降算法的葬身之地。 那么真正影响梯度下降算法会是什么呢?可能是平稳区(plateaus),如果出现大面积梯度很小或者近似为0的区域,那么梯度下降算法就找不到方向,想象你自己站在一望无际的平原,估计你也方向感全无了。当前上面所有的谈论仅是停留在经验,对于高维空间,无论如何很难直观想象,这还是一个历史难题吧。