Mini-Batch Gradient Descent介绍以及如何决定Batch Size

Posted xiang_freedom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mini-Batch Gradient Descent介绍以及如何决定Batch Size相关的知识,希望对你有一定的参考价值。


梯度下降是目前训练深度学习模型主流的方法。

有三种主要的梯度下降方法,如何决定使用哪一种可能让人困惑。

这在篇文章里,你将看到大部分情况下使用的梯度下降方法以及使用方式。

读完本文,你将知道:

  • 从宏观理解梯度下降运行的原理
  • batch,stochastic和mini-batch gradient descent三种方法的优缺点
  • 怎么把mini-batch gradient descent应用到你的模型中

教程预览

这个教程分为3个部分:

  1. 什么是梯度下降?
  2. 梯度下降的三种方法对比
  3. 怎么配置mini-batch梯度下降

什么是梯度下降?

梯度下降是一种优化方法,经常用于求解机器学习算法,比如人工神经网络和逻辑回归的参数或系数。

它的主要工作是,模型在训练数据上输出结果,计算这些结果的误差然后更新模型,从而减少误差。

它的目标是找到使模型在训练集上误差最小的参数,通过修改模型使其沿着误差“梯度”或“坡度”向下直到最低点。这就是它名为“梯度下降”的原因。

下面的伪代码大致描述了梯度下降算法:

model = initialization(...)
n_epochs = ...
train_data = ...
for i in n_epochs:
    train_data = shuffle(train_data)
    X, y = split(train_data)
    predictions = predict(X, train_data)
    error = calculate_error(y, predictions)
    model = update_model(model, error)

更多内容参考:

梯度下降的三种方法对比

梯度下降有多种不同的训练模式来计算误差,然后再更新模型。

这些训练模式包括梯度更新模型的稳定性。我们将会看到,梯度下降在计算效率和误差准确率之间存在一个张力。

三种主要的梯度下降方法是:批量(batch)、随机(stochastic)和小批量(mini-batch)。

我们来详细讨论下。

什么是随机梯度下降?

随机梯度下降,简称SGD,是指梯度下降算法在训练集上,对每一个训练数据都计算误差并更新模型。

对每一个数据都进行模型更新意味着随机梯度下降是一种在线机器学习算法

优点

  • 频繁的更新可以给我们一个模型表现和效率提升的即时反馈。
  • 这可能是最容易理解和实现的一种方式,尤其对于初学者。
  • 较高的模型更新频率在一些问题上可以快速的学习。
  • 这种伴有噪声的更新方式能让模型避免局部最优(比如过早收敛)。

缺点

  • 这种方式相比其他来说,计算消耗更大,在大数据集上花费的训练时间更多。
  • 频繁的更新产生的噪声可能导致模型参数和模型误差来回跳动(更大的方差)。
  • 这种伴有噪声的更新方式也能让算法难以稳定的收敛于一点。

什么是批量梯度下降?

批量梯度下降对训练集上每一个数据都计算误差,但只在所有训练数据计算完成后才更新模型。

对训练集上的一次训练过程称为一代(epoch)。因此,批量梯度下降是在每一个训练epoch之后更新模型。

优点

  • 更少的模型更新意味着比SGD有更高的计算效率。
  • 在一些问题上可以得到更稳定的误差梯度和更稳定的收敛点。
  • 误差计算和模型更新过程的分离有利于并行算法的实现。

缺点

  • 更稳定的误差梯度可能导致模型过早收敛于一个不是最优解的参数集。
  • 每一次epoch之后才更新会增加一个累加所有训练数据误差的复杂计算。
  • 通常来说,批量梯度下降算法需要把所有的训练数据都存放在内存中。
  • 在大数据集上,训练速度会非常慢。

什么是小批量梯度下降?

小批量梯度下降把训练集划分为很多批,对每一批(batch)计算误差并更新参数。

可以选择对batch的梯度进行累加,或者取平均值。取平均值可以减少梯度的方差。

小批量梯度下降在随机梯度下降的鲁棒性和批量梯度下降的效率之间取得平衡。是如今深度学习领域最常见的实现方式。

优点

  • 比批量梯度下降更快的更新频率有利于更鲁棒的收敛,避免局部最优。
  • 相比随机梯度下降更具计算效率。
  • 不需要把所有数据放入内存中。

缺点

  • 小批量梯度下降给算法增加了一个超参数batch size。
  • 和批量梯度下降一样,每一个batch上的误差需要累加。

怎么配置mini-batch梯度下降

Mini-batch梯度下降对于深度学习大部分应用是最常用的方法。

Mini-batch sizes,简称为 “batch sizes”,是算法设计中需要调节的参数。比如对应于不同GPU或CPU硬件(32,64,128,256等)的内存要求。

batch size是学习过程中的“滑块”。

  • 较小的值让学习过程收敛更快,但是产生更多噪声。
  • 较大的值让学习过程收敛较慢,但是准确的估计误差梯度。

建议1:batch size的默认值最好是32

batch size通常从1到几百之间选择,比如32是一个很好的默认值,超过10的值可以充分利用矩阵*矩阵相对于矩阵*向量的加速优势。

——Practical recommendations for gradient-based training of deep architectures, 2012

建议2:调节batch size时,最好观察模型在不同batch size下的训练时间和验证误差的学习曲线

相比于其他超参数,它可以被单独优化。在其他超参数(除了学习率)确定之后,在对比训练曲线(训练误差和验证误差对应于训练时间)。

建议3:调整其他所有超参数之后再调整batch size和学习率

batch size和学习率几乎不受其他超参数的影响,因此可以放到最后再优化。batch size确定之后,可以被视为固定值,从而去优化其他超参数(如果使用了动量超参数则例外)。

更多阅读

如果你想深入学习下去,可以阅读下面的资源。

相关文章

补充阅读

总结

在本文中,你总览了梯度下降算法并且知道在实践中使用哪一种。

尤其是,你学到:

  • 梯度下降是什么并且怎么运行。
  • 批量、随机和小批量梯度下降是什么以及每一种方法的优缺点。
  • 使用小批量梯度下降并且学会配置batch size。

有什么问题吗?

在下面的评论区提问,我将尽可能帮助你。

原文地址:A Gentle Introduction to Mini-Batch Gradient Descent and How to Configure Batch Size

以上是关于Mini-Batch Gradient Descent介绍以及如何决定Batch Size的主要内容,如果未能解决你的问题,请参考以下文章

深度学习——优化算法

吴恩达-深度学习-课程笔记-7: 优化算法( Week 2 )

零基础神经网络优化之mini-batch

在mini-batch训练中使用tqdm来创建进度条

Mini-batch 和batch的区别

mini-batch的TripleLoss实现(Pytorch)