zoukankan      html  css  js  c++  java
  • 梯度下降法小结

    1. 前言

    今天我们聊一聊机器学习和深度学习里面都至关重要的一个环节,优化损失函数。我们知道一个模型只有损失函数收敛到了一定的值,才有可能会有好的结果,降低损失方式的工作就是优化方法需要做的事。下面会讨论一些常用的优化方法:梯度下降法家族、牛顿法、拟牛顿法、共轭梯度法、Momentum、Nesterov Momentum、Adagrad、RMSprop、Adam等。

    优化过程的示意图如下:

    image

    2. 梯度下降法

    2.1 梯度下降法原理

    举个形象的例子,梯度下降法就好比一个蒙着眼睛的人下山,每次在负梯度最大的方向,向前走一步,走出一步后,比较前后的的落差,若落差小于一定阈值,则认为到达山谷,若落差大于阈值,则继续向前走,直到到达山谷。

    image

    2.2 梯度下降法概念

    在详细了解梯度下降的算法之前,我们先看看相关的一些概念。

    1. 步长(Learning rate):步长又称学习率,决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。
    2. 损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。

    2.3 梯度下降法调优

    在梯度下降法中调优比较重要的是3个因素,步长、初始值、归一化

    1. 步长:步长太小,收敛慢,步长太大,会远离最优解。所以需要从小到大,分别测试,选出一个最优解。
    2. 初始值:随机选取初始值,当损失函数是非凸函数时,找到的解可能是局部最优解,需要多测试几次,从局部最优解中选出最优解。当损失函数是凸函数时,得到的解就是最优解。
    3. 归一化:如果不归一化,会收敛的很慢,会形成之字的路线。

    2.4 梯度下降法分类

    2.4.1 批量梯度下降法(BGD)

    计算梯度时使用所有的样本,这样每次算出来的梯度都是当前最优的方向。

    • 优点
    1. 迭代次数少
    2. 若损失函数为凸函数,能够保证收敛到全局最优解;若为非凸函数,能够收敛到局部最优值(结果的准确度)
    • 缺点
    1. 训练速度慢(时间,每一次训练需要的时间)
    2. 需要内存大(空间)
    3. 不支持在线更新

    2.4.2 随机梯度下降法(SGD)

    随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度

    • 优点
    1. 训练速度快
    2. 支持在线更新
    3. 有几率跳出局部最优解
    • 缺点
    1. 容易收敛到局部最优,并且容易被困在鞍点
    2. 迭代次数多

    2.4.3 小批量梯度下降法(MBGD)

    小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样子来迭代,(1<x<m)。一般可以取(x=10)

    3. 其他优化算法

    3.1 牛顿法

    牛顿法又名切线法,它的基本思想是对损失函数的二阶泰勒展开进行求导。
    从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。

    如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)

    切线法形象化如下:
    image

    从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

    • 优点
    1. 梯度下降的速度很快
    • 缺点
    1. 牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。

    3.2 拟牛顿法

    拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法和最速下降法一样只要求每一步迭代时计算目标函数的梯度(一阶导数)

    • 优点
    1. 使用正定矩阵模拟Hessian矩阵,使得迭代速度比BGD快
    2. 只计算了函数的梯度,所以训练时间比牛顿法快

    3.3 共轭梯度法

    共轭梯度法是介于最速下降法与牛顿法,拟牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,克服了拟牛顿法需要很大的存储空间,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。

    • 优点
    1. 需存储量小
    2. 稳定性高
    3. 不需要任何外来参数

    4. SGD延伸算法

    4.1 Momentum(动量法)

    Momentum旨在加速学习,特别是处理高曲率、小但一致的梯度,或带噪音的梯度。Momentum算法会观察历史梯度(动量),若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。

    一种形象的解释

    我们把一个球推下山,球在下坡时积累惯性(动量),在途中若球运动方向不变,因为惯性,球会越来越快,若球的方向发生变化,因为惯性,球的速度会变慢。

    左边是SGD,右边是Momentum旨在加速学习:

    image

    4.2 Nesterov Momentum(NAG)

    Nesterov Momentum是Momentum的变种,用于解决SGD容易陷入局部最优的问题。我们知道Momentum方法中梯度方向由积累的动量和当前梯度方法共同决定,与其看当前梯度方向,不妨先看看跟着积累的动量走一步是什么情况,再决定怎么走。

    在小球向下滚动的过程中,我们希望小球能够提前知道在哪些地方坡面会上升,这样在遇到上升坡面之前,小球提前就开始减速,就不容易陷入局部最优解。

    image

    4.3 Adagrad

    Adagrad是自适应梯度法。它通过记录每次迭代过程中的前进方向和距离,从而使得针对不同问题,有一套自适应调整学习率的方法,对于出现频率较低参数采用较大的α更新;相反,对于出现频率较高的参数采用较小的α更新。

    4.4 RMSprop

    Adagrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题

    4.5 Adam

    Adam(Adaptive Moment Estimation)是另一种自适应学习率的方法。总结以上算法,以SGD作为最初的算法,Momentum在其基础上加入了一阶动量(历史梯度的累计),AdaGrad和RMSProp在其基础上加入了二阶动量(历史梯度的平方累计),Adam就是结合了一阶动量和二阶动量算法。

    4.6 Nadam

    我们说Adam是集大成者,而Nadam = Adam + NAG。

    4.7 展示

    介绍了上面的几种学习率的优化方法,大家可能一下不太好理解,这里放两张动图,帮助大家加深理解。

    image

    image

    5. 总结

    本文对机器学习中常用的优化算法做了一个简短的总结,只介绍了算法各自的最大的特点,并没有涉及具体的公式和细节。具体针对每种算法各自的实现方式和适用范围还需读者自己了解。希望本文能给读者展现出一个机器学习中优化算法的大概的知识图谱。

  • 相关阅读:
    内存泄露检测工具之DMalloc
    五年后你在何方
    程序员技术练级攻略
    Windows编程革命简史
    su的时候密码认证失败的解决方法
    ruby 元编程 meta programming
    内存对齐分配策略(含位域模式)
    Ruby 之 Block, Proc, Lambda 联系区别,转载
    c++异常处理机制示例及讲解
    ruby 常见问题集 1 不断更新中
  • 原文地址:https://www.cnblogs.com/huangyc/p/9801261.html
Copyright © 2011-2022 走看看