zoukankan      html  css  js  c++  java
  • 梯度下降优化算法

    在这里插入图片描述

    一、简介

    在这里插入图片描述

    二、梯度下降方法

    一般线性回归函数的假设函数为:
    在这里插入图片描述以平方差损失函数的形式为例:
    在这里插入图片描述

    2.1 批量梯度下降法BGD

    批量梯度下降法(Batch Gradient Descent,简称BGD)是梯度下降法最原始的形式,它的具体思路是在更新每一参数时都使用所有的样本来进行更新,其数学形式如下:

    (1) 对上述的损失函数求偏导:
      
    在这里插入图片描述
      (2) 由于是最小化风险函数,所以按照每个参数θ的梯度负方向来更新每个θ:

    在这里插入图片描述
    具体的伪代码形式为:
    在这里插入图片描述

    优缺点:

    1. 在凸优化(Convex Optimization)的情况下,一定会找到最优解
    2. 在非凸优化的情况下,一定能找到局部最优解
    3. 由于批量梯度下降法在更新每一个参数时,都需要所有的训练样本,所以训练过程会随着样本数量的加大而变得异常的缓慢,单次参数调整计算量大
    4. 不适合在线(Online)的情况

    2.2 随机梯度下降法SGD

    随机梯度下降法(Stochastic Gradient Descent,简称SGD)正是为了解决批量梯度下降法这一弊端而提出的。
    利用每个样本的损失函数对θ求偏导得到对应的梯度,来更新θ:
    在这里插入图片描述
    具体的伪代码形式为:
    在这里插入图片描述优缺点:

    1. 训练速度快,适合Online的情况
    2. 通常比批处理梯度下降法快(在批处理的情况下,有可能许多的数据点产生的梯度是相似的,这些计算是冗余的,并不会有实际的帮助) .
    3. 通常目标函数震荡严重.在神经网络优化情况下(没有全局最优解),这种震荡反而有可能让它避免被套牢在一个局部最小值,而找到更好的局部最优解
    4. 通过调节学习率,能够找到和批处理相似的局部或者全局最优解
      在这里插入图片描述

    2.3 小批量梯度下降法MBGD

    有上述的两种梯度下降法可以看出,其各自均有优缺点,那么能不能在两种方法的性能之间取得一个折衷呢?即,算法的训练过程比较快,而且也要保证最终参数训练的准确率,而这正是小批量梯度下降法(Mini-batch Gradient Descent,简称MBGD)的初衷。

    • MBGD在每次更新参数时使用b个样本,其具体的伪代码形式为
    • 具体的伪代码形式为:

    在这里插入图片描述
    优缺点:

    1. 结合了批处理和随机梯度下降法的优点
    2. 减弱了目标函数震荡,更加稳定
    3. ,常用的机器学习库都利用了这个特性提供了高性能的计算速度
    4. 一般的迷你批大小为50至256,取决于不同的应用

    三、传统梯度下降法面临的挑战

    • 传统迷你批处理不能保证能够收敛
    • 当学习率太小,收敛会很慢,学习率太高容易震荡,甚至无法收敛
    • 可以按照某个公式随着训练逐渐减小学习率,但是不同的数据集需要不同的学习率变化曲线,不容易估计
    • 所有的参数使用同样的学习率并不合适
    • 容易被套牢在马鞍点
      在这里插入图片描述

    四、改进的梯度下降算法

    4.1 Momentum

    原理:

    • 不同dimension的变化率不一样
    • 动量增强梯度在某一维度上的投影,使其指向同一方向上,在维度的指向上抵消不断变化的方向

    在这里插入图片描述
    在这里插入图片描述

    4.2 Nesterov accelerated gradient

    • 动量+预测的前方的梯度
      在多个RNN的任务中表现突出
      在这里插入图片描述
    前面的算法是整体提升梯度下降法的速度,接下来的算法是针对各个参数采用不同的策略

    4.3 Adagrad

    • 对频繁出现的参数,采用小的步长
    • 对不频繁出现的参数,采用大的步长
    • 对稀疏数据集非常有用(文本数据). Google在训练从Youtube视频自动识别猫用到了. Pennington et al训练词嵌入的GloVe也用到了
      在这里插入图片描述
    • 优势:
    1. 无需手动调整learning rate步长
    2. 设置初始步长为0.01即可
    • 劣势:
    1. 随着训练,分母总是增大,步长会越来越小,算法无法收敛
    • 实现:
    1. 只是累积过去的一段时间的梯度平方值
    2. 完全无需设置步长
    3. 为了便于实现,采用类使用动量的策略:
      在这里插入图片描述在这里插入图片描述

    4.4 RMSprop

    在这里插入图片描述

    4.5 Adam

    记录过去一段时间的梯度平方和(类似Adadelta和RMSprop),以及梯度的和(类似Momentum动量)把优化看作铁球滚下山坡, Adam定义了一个带动量和摩擦的铁球
    在这里插入图片描述

    4.6 对比与选择

    • 1.如果数据集是稀疏的,选择自适应学习率的方法会更快收敛,而且免去了需要调试学习率的烦恼
    • 2.RMSprop, Adadelta, Adam的效果非常相似,大多数情况下Adam略好

    五、Tips

    在这里插入图片描述

  • 相关阅读:
    人生转折点:弃文从理
    人生第一站:大三暑假实习僧
    监听器启动顺序和java常见注解
    java常识和好玩的注释
    182. Duplicate Emails (Easy)
    181. Employees Earning More Than Their Managers (Easy)
    180. Consecutive Numbers (Medium)
    178. Rank Scores (Medium)
    177. Nth Highest Salary (Medium)
    176. Second Highest Salary(Easy)
  • 原文地址:https://www.cnblogs.com/long5683/p/12885754.html
Copyright © 2011-2022 走看看