随机梯度下降是训练深度学习模型的主要方法。
梯度下降有三种主要变体,选择哪一种可能会令人困惑。
在这篇文章中,您将了解通常应该使用哪种梯度下降以及如何配置它。
完成这篇文章后,您将了解:
- 什么是梯度下降以及它是如何从高层次上工作的。
- 什么是批量梯度下降、随机梯度下降和 mini-batch 梯度下降,以及每种方法的优缺点。
- Mini-batch 梯度下降是首选方法,以及如何在您的应用程序中配置它。
通过我的新书《使用 Python 进行深度学习》启动您的项目,其中包括分步教程和所有示例的 Python 源代码文件。
让我们开始吧。
- 2018 年 4 月更新:增加了额外参考文献以支持批次大小为 32。
- 2019 年 6 月更新:删除了对平均梯度的提及。

迷你批次梯度下降简介以及如何配置批次大小
照片由 Brian Smithson 拍摄,保留部分权利。
教程概述
本教程分为3个部分;它们是
- 什么是梯度下降?
- 对比三种梯度下降类型
- 如何配置 Mini-Batch 梯度下降
什么是梯度下降?
梯度下降是一种优化算法,常用于寻找机器学习算法(如人工神经网络和逻辑回归)的权重或系数。
它的工作原理是让模型对训练数据进行预测,并使用预测误差以减少误差的方式更新模型。
该算法的目标是找到最小化模型在训练数据集上误差的模型参数(例如,系数或权重)。它通过改变模型使其沿着误差梯度或斜率向最小误差值移动来做到这一点。这使得该算法被称为“梯度下降”。
下面的伪代码草图总结了梯度下降算法:
1 2 3 4 5 6 7 8 9 |
模型 = 初始化(...) n_epochs = ... train_data = ... for i in n_epochs train_data = shuffle(train_data) X, y = split(train_data) predictions = predict(X, model) error = calculate_error(y, predictions) model = update_model(model, error) |
欲了解更多信息,请参阅以下帖子:
对比三种梯度下降类型
梯度下降在用于计算误差的训练模式数量上可能有所不同;这反过来又用于更新模型。
用于计算误差的模式数量包括用于更新模型的梯度稳定性。我们将看到梯度下降配置中计算效率和误差梯度保真度之间存在矛盾。
梯度下降的三种主要形式是批量、随机和 mini-batch。
让我们仔细看看每一个。
什么是随机梯度下降?
随机梯度下降,通常缩写为 SGD,是梯度下降算法的一种变体,它针对训练数据集中的每个示例计算误差并更新模型。
模型对每个训练示例的更新意味着随机梯度下降通常被称为在线机器学习算法。
优点
- 频繁的更新可以立即洞察模型的性能和改进速度。
- 这种梯度下降变体可能最容易理解和实现,尤其是对于初学者。
- 增加的模型更新频率可以导致在某些问题上学习速度更快。
- 噪声更新过程可以使模型避免局部最小值(例如过早收敛)。
缺点
- 如此频繁地更新模型比其他梯度下降配置的计算成本更高,在大型数据集上训练模型需要更长的时间。
- 频繁的更新可能导致噪声梯度信号,这可能导致模型参数以及模型误差跳动(在训练周期内具有更高的方差)。
- 沿着误差梯度下降的嘈杂学习过程也可能使算法难以确定模型的误差最小值。
什么是批量梯度下降?
批量梯度下降是梯度下降算法的一种变体,它计算训练数据集中每个示例的误差,但仅在评估所有训练示例后才更新模型。
遍历整个训练数据集的一个周期称为一个训练周期。因此,通常认为批量梯度下降在每个训练周期结束时执行模型更新。
优点
- 模型更新次数减少意味着这种梯度下降变体比随机梯度下降更具计算效率。
- 更新频率的降低导致更稳定的误差梯度,并可能导致在某些问题上更稳定的收敛。
- 预测误差计算和模型更新的分离使算法适用于基于并行处理的实现。
缺点
- 更稳定的误差梯度可能导致模型过早收敛到次优的参数集。
- 在训练周期结束时的更新需要累积所有训练示例的预测误差的额外复杂性。
- 通常,批量梯度下降的实现方式要求整个训练数据集在内存中并可供算法使用。
- 对于大型数据集,模型更新以及训练速度可能会变得非常缓慢。
什么是 Mini-Batch 梯度下降?
Mini-batch 梯度下降是梯度下降算法的一种变体,它将训练数据集分成小批次,用于计算模型误差和更新模型系数。
实现可以选择在 mini-batch 上求和梯度,这进一步减少了梯度的方差。
Mini-batch 梯度下降旨在在随机梯度下降的鲁棒性和批量梯度下降的效率之间找到平衡。它是深度学习领域中最常用的梯度下降实现。
优点
- 模型更新频率高于批量梯度下降,这使得收敛更具鲁棒性,避免了局部最小值。
- 批处理更新提供了比随机梯度下降计算效率更高的过程。
- 批处理允许不将所有训练数据保存在内存中和算法实现的效率。
缺点
- Mini-batch 需要为学习算法配置一个额外的“mini-batch 大小”超参数。
- 像批量梯度下降一样,误差信息必须在 mini-batch 训练示例中累积。
如何配置 Mini-Batch 梯度下降
Mini-batch 梯度下降是大多数应用程序,尤其是深度学习中推荐的梯度下降变体。
Mini-batch 大小(为简洁起见通常称为“批次大小”)通常根据实现所执行的计算架构的某个方面进行调整。例如适合 GPU 或 CPU 硬件内存要求的 2 的幂次,如 32、64、128、256 等。
批次大小是学习过程中的一个滑块。
- 较小的值会使学习过程快速收敛,但代价是训练过程中的噪声。
- 较大的值会使学习过程缓慢收敛,并对误差梯度进行准确估计。
技巧 1:批次大小的良好默认值可能是 32。
... [批次大小] 通常选择在 1 到几百之间,例如 [批次大小] = 32 是一个很好的默认值,超过 10 的值可以利用矩阵-矩阵乘法而不是矩阵-向量乘法的加速。
— 深度架构基于梯度的训练的实用建议,2012
2018 年更新:这里还有一篇支持批次大小为 32 的论文,以下是引用(m 是批次大小)
所呈现的结果证实,在广泛的实验中,对于给定的计算成本,使用小批次大小可以实现最佳的训练稳定性和泛化性能。在所有情况下,最佳结果都是通过批次大小 m = 32 或更小获得的,通常小到 m = 2 或 m = 4。
— 重新审视深度神经网络的小批量训练,2018。
技巧 2:在调整批次大小时,查看模型验证误差与训练时间的不同批次大小的学习曲线是个好主意。
... 它可以独立于其他超参数进行优化,方法是比较训练曲线(训练和验证误差与训练时间),在选择其他超参数(学习率除外)之后。
技巧 3:在调整所有其他超参数后,调整批次大小和学习率。
... [批次大小] 和 [学习率] 可能与其他超参数略有交互,因此两者都应在最后重新优化。一旦选择了 [批次大小],通常可以将其固定,而其他超参数可以进一步优化(除了动量超参数,如果使用的话)。
进一步阅读
如果您想深入了解此主题,本节提供了更多资源。
相关文章
延伸阅读
- 维基百科上的随机梯度下降
- 维基百科上的在线机器学习
- 梯度下降优化算法综述
- 深度架构基于梯度的训练的实用建议, 2012
- 随机优化的有效 Mini-batch 训练, 2014
- 在深度学习中,为什么我们不使用整个训练集来计算梯度?在 Quora 上
- 大规模机器学习的优化方法, 2016
总结
在这篇文章中,您了解了梯度下降算法以及您在实践中应该使用的版本。
具体来说,你学到了:
- 什么是梯度下降以及它是如何从高层次上工作的。
- 什么是批量梯度下降、随机梯度下降和 mini-batch 梯度下降,以及每种方法的优缺点。
- Mini-batch 梯度下降是首选方法,以及如何在您的应用程序中配置它。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
在 mini-batch 部分,“模型更新频率低于批量梯度下降,这使得收敛更具鲁棒性,避免了局部最小值。”
我认为这低于 SGD,而不是 BGD,我错了吗?
打字错误,我指的是“更高”。已更正,谢谢。
等等,那么这不会让 Adam 成为 mini-batch 梯度下降算法,而不是随机梯度下降吗?(至少在 Keras 的实现中)
因为在 Keras 中,当使用 Adam 时,你仍然可以设置批次大小,而不是让它为每个数据点更新权重
SGD 中的批次概念与 Adam 对 SGD 的优化是正交的。
你可以使用批次,无论有没有 Adam。
更多关于 Adam 的信息在这里
https://machinelearning.org.cn/adam-optimization-algorithm-for-deep-learning/
哦,好的,另外 SGD 之所以被称为 SGD,是不是因为梯度下降是一种贪婪算法,它沿着斜坡寻找最小值,这可能导致它陷入局部最小值,为了防止这种情况,随机梯度下降使用各种随机迭代,然后从所有斜坡近似全局最小值,因此有了“随机”这个词?
是的,说得对,它为过程添加了噪声,这使得过程能够逃离局部最优解以寻找更好的解决方案。
假设我的训练数据大小为 1000,我选择的批次大小为 128。
那么,我想知道算法如何处理小于批次大小的最后一个训练集?
在这种情况下,在算法达到 896 个训练样本之前,将进行 7 次权重更新。
现在,剩下的 104 个训练样本会发生什么?
它会忽略最后一个训练集还是会使用下一个 epoch 的 24 个样本?
它对最后一个批次使用较小的批次大小。样本仍然被使用。
感谢您的澄清。
这些引文来自本文和链接文章。它们略有不同,它们都是真的吗?
“批量梯度下降是机器学习中最常见的梯度下降形式。”
“机器学习中最常用的优化算法是随机梯度下降。”
“Mini-batch 梯度下降是大多数应用(尤其是在深度学习中)推荐的梯度下降变体。”
是的,批量/mini-batch 是随机梯度下降的类型。
感谢您的帖子!这是一个非常优雅的总结。
但是,我不太理解随机梯度下降的这个优点
– 嘈杂的更新过程可以使模型避免局部最小值(例如过早收敛)。
我能问问这是为什么吗?
很棒的问题。
因为权重将在解空间中更多地跳动,并且鉴于权重更新的更大方差,可能会跳出局部最小值。
这有帮助吗?
精彩的总结!关于 mini-batch – 你说“实现可以选择对梯度求和……”
假设有 1000 个训练样本,mini-batch 大小为 42。那么有 23 个大小为 42 的 mini-batch,以及 1 个大小为 34 的 mini-batch。
如果权重仅基于梯度的和进行更新,那么最后一个大小不同的 mini-batch 会导致问题吗,因为求和的数量与其他 mini-batch 不同?
好问题,一般来说,最好让 mini-batch 具有相同数量的样本。在实践中,这种差异似乎并不重要。
在您的伪代码中,
predict(X, train_data)
不应该是predict(X, model)
吗?是的,已修复。谢谢。
嗨 Jason,很棒的帖子。
您能否解释一下“对 mini-batch 的梯度求和或取梯度的平均值”的含义?我们实际上对 mini-batch 求和的是什么?
当您说“取梯度的平均值”时,我假定您指的是对所有 mini-batch 计算出的参数取平均值。
此外,这篇帖子是您书中的摘录吗?
谢谢
误差梯度的估计。
您可以在此处通过代码示例了解有关如何计算误差梯度的更多信息
https://machinelearning.org.cn/implement-backpropagation-algorithm-scratch-python/
此外,为什么在 mini-batch 梯度下降中,我们只是将一个 mini-batch 处理的输出用作下一个 mini-batch 的输入
抱歉 Igor,我不明白。也许您可以重新措辞您的问题?
我想他问的是你是否在计算批次梯度后实际更新了权重。
如果我理解正确,答案应该是“是的”。你会计算第一个 mini-batch 产生的平均梯度,然后你用它来更新权重,然后使用更新后的权重值来计算下一个 mini-batch 中的梯度。因为权重的当前值当然决定了梯度。
谢谢。是的,正确。
很抱歉造成困惑。
你好,很棒的帖子!
您能否进一步解释 mini-batch 中的参数更新?
我的理解是:我们使用一个 mini-batch 来获取梯度,然后使用这个梯度来更新权重。对于下一个 mini-batch,我们重复上述过程并根据前一个 mini-batch 更新权重。我不确定我的理解是否正确。
谢谢。
听起来没错。
感谢您这份组织良好、表达清晰的总结。但是,我认为很多人会从一个例子中受益(即人脸识别程序)。在这一部分,您可以解释这些方程中使用的不熟悉的符号。
我最后认为 SGD 是一种“元程序”或“辅助程序”,它在反馈循环中评估主程序的算法(即批量、随机、mini-batch),从而提高两者的准确性。这准确吗?对我来说,这与“正念”平行,这引起共鸣吗?
谢谢你。
SGD 是一种优化算法,简单明了。我不明白它与正念有什么关系,抱歉。
但这与幸福有什么关系呢?
确实如此!
我必须说,对我来说,从事全局优化问题通常等于幸福 🙂
我必须同意。很有趣。
ValueError: 无法为形状为“(?, 1)”的 Tensor 'TargetsData/Y:0' 提供形状为“(32,)”的值
此错误发生在以下代码中
数据大小为 768 行
8 个输入
1 个输出
很抱歉听到这个消息,也许您可以将您的代码和错误发布到 StackOverflow.com?
这段代码
import tensorflow as tf
tf.reset_default_graph()
import tflearn
import numpy
import pandas
# 设置随机种子以保证结果可复现
numpy.random.seed(7)
url = “https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv”
names = ['怀孕次数', '血浆葡萄糖', '舒张压', '三头肌皮肤', '2 小时血清胰岛素', '体重指数','糖尿病谱系函数','年龄(岁)','类别']
dataset = pandas.read_csv(url, names=names)
# 分割为输入 (X) 和输出 (Y) 变量
X = dataset.iloc[:, 0:8].values
Y = dataset.iloc[:, 8].values
# 图形定义
g = tflearn.input_data(shape=[None, 8])
g = tflearn.fully_connected(g, 12, activation='relu')
g = tflearn.fully_connected(g, 8, activation=’relu’)
g = tflearn.fully_connected(g, 1, activation=’sigmoid’)
g = tflearn.regression(g, optimizer=’adam’, learning_rate=2.,
loss=’binary_crossentropy’)
# 模型训练
m = tflearn.DNN(g)
m.fit(X, Y, n_epoch=50, batch_size=32)
抱歉,我没有tensorflow的资料,无法为您提供好的建议。
很棒的教程!我的问题是,最终迷你批次梯度下降(mini batch GD)和批次梯度下降(Batch GD)会收敛到相同的参数值,还是会有差异?
同一种方法的每次运行都会收敛到不同的结果。
该方法的每个版本也会收敛到不同的结果。
这是随机优化算法的一个特点。也许这篇帖子能帮助你理解这一点。
https://machinelearning.org.cn/randomness-in-machine-learning/
尊敬的 Brownlee 博士。
请问您能澄清一下吗,SGD是否需要检查训练样本中的所有元素?我们是否需要检查到目前为止样本中的所有元素都已被检查过,然后当前 epoch 才结束?因此,在 epoch 内的最后一次迭代中,SGD 会从训练集中选择最后一个未被检查的元素,所以它以非随机的方式执行此步骤?第二个问题是,是否也需要随机选择迷你批次(大小 > 1)?
是的。通常,这很容易作为循环的一部分完成。
可以通过一种能够产生稳定学习过程的方式来评估和选择批次大小。
我要感谢您详细而清晰的博客文章。
您有没有基于研究论文的关于如何选择 epoch 数量的想法?
我知道这个问题取决于许多因素,但我们将其缩小到仅限于训练 ConvNets 时的数据集大小。
将其设置为一个非常大的数字,然后使用早期停止。
https://machinelearning.org.cn/early-stopping-to-avoid-overtraining-neural-network-models/
嗨 Jason
您会建议如何在时间序列数据上最好地进行小批量处理?我有一份时间序列数据(每个序列的天数可变),我正在使用 LSTM 架构从这些时间序列中学习。我首先形成一个回溯窗口,并将其在每个序列上移动以形成训练样本(X 矩阵)和要预测的列(y 向量)。如果一个批次是 32 个样本,那么这 32 个样本是否必须都来自同一个序列?
您有这方面的代码吗?
我理解在图像分类问题中这并不重要,事实上,批次中包含随机图像可能会产生更好的结果(形成更高保真度的批次)。
期待您的回复。提前感谢。
是的,也许一个好的开始点在这里。
https://machinelearning.org.cn/start-here/#deep_learning_time_series
嗨,Jason,
我的数据集有160,000个训练样本,图像大小为512*960,我有一块GV100显卡,拥有32 GB专用GPU内存。
我的批次大小是512,但我的迷你批次大小应该设为多少才能获得更快、更准确的训练结果?
我尝试过16、32,但它们似乎没有太大区别,因为我运行nvidia-smi时,volatile GPU利用率在0-10%之间波动。是不是因为将批次加载到GPU上的时间太长了?有什么办法可以提高GPU利用率吗?
考虑到我的机器和训练样本,理想的批次和迷你批次大小是多少?
谢谢
这取决于模型,例如,如果您正在拟合 LSTM,那么 GPU 的使用率不会很高;如果您正在使用数据增强,那么 GPU 的使用率也不会很高。
你好,谢谢你的帮助。
我正在使用CNN,它不应该显示较高的易失性GPU使用率吗?
是的,除非您使用在CPU上进行的数据增强。
谢谢,目前我没有使用任何数据增强。运行nvidia-smi时,GPU利用率在0-10%之间波动,偶尔会飙升到50-90%。这是不是因为将批次加载到GPU上的时间非常长?比如读写操作花费了太多时间/内存?
16万个训练样本,图像尺寸512*960,我有一块GV100显卡,拥有32 GB专用GPU内存。
请告诉我有什么可以做的改进。
有意思,我不确定。也许可以尝试在 Stack Overflow 上提问?
嗨 Sarthak,我也有同样的问题,你找到原因和解决方案了吗?(增加 GPU 使用率)
您好,找到这个问题的解决方案了吗?我也遇到了同样的问题。
嗨,Jason,
在使用小批量 vs 随机梯度下降并计算梯度时,我们是否应该将小批量 delta 或梯度除以 batch_size?
当我使用大小为10的批次时,如果我将梯度除以批次大小,我的算法收敛得更慢(意味着需要更多的 epoch 才能收敛)。
如果我使用大小为10的批次,并且不将其除以批次大小,梯度(和步长)会变得过大,但它们需要相同数量的 epoch 才能收敛。
您能帮我解决这个问题吗?
祝好,
Deniz
不,梯度的方差很高,梯度的幅度通常更小。
由于向量化,批次梯度下降计算一个 epoch 是否比随机/迷你批次更快?
是的。
亲爱的 Jason,
我对技巧 3 有点困惑:在调整所有其他超参数之后,再调整批量大小和学习率。
我的理解是,我们可以从例如 32 的批量大小开始,然后调整超参数(除了批量大小和学习率),完成这些之后,再微调批量大小和学习率。这是正确的吗?
那优化器呢,它们也可以在最后再研究吗?很难理解事情应该按什么顺序进行。顺便问一下,您用过 Adabound 吗?
https://medium.com/syncedreview/iclr-2019-fast-as-adam-good-as-sgd-new-optimizer-has-both-78e37e8f9a34
正确。
如果您刚开始,Adam 是一个很棒的“自动”算法。
https://machinelearning.org.cn/adam-optimization-algorithm-for-deep-learning/
嗨,Jason,
关于小批量梯度下降,您写道:
“实现可以选择对小批量中的梯度求和,或取梯度的平均值,这进一步降低了梯度的方差。”
当我读到这句话时,似乎通过对单个梯度估计求和并不能减少方差。这样理解正确吗?
我想象中,当我们对单个梯度估计求和时,我们会得到一个更稳定的梯度估计。但我可能错了?
是的,是梯度的和,而不是平均值。已更正。
也许我的问题不够具体。
对特定于观测值的梯度求平均值时,我会降低梯度估计的方差。
对特定于观测值的梯度求和时,我们仍然会降低方差吗?或者,给定学习率,我们只是因为对梯度求和而采取更大的梯度步长?
两者都能降低方差,因为求和/平均值中每个元素的方向和幅度都不同。
您说“在调整所有其他超参数之后调整批量大小和学习率”,还说“一旦[批量大小]被选中,它通常可以固定,而其他超参数可以进一步优化”。
我仍然对如何调整批量大小感到困惑。
那么,这是否意味着我们首先调整所有其他超参数,然后调整批量大小,在固定批量大小之后,我们再重新调整所有其他超参数?
暂时忘记顺序。
一个好的开始是测试一系列不同的批量大小,看看它如何影响模型技能。
嗨,Jason,
我关注您的文章已经有一段时间了,它们帮助我快速提升了学术AI技能。
几个月来,我一直在为一个问题而苦恼,我想征求您的意见。
我正在训练一个3D卷积神经网络(CNN),我的输入包含约10-15个3D特征,输出是一个单一的3D矩阵。
由于我使用的是一个深度3D网络,训练速度非常慢,内存消耗大,但我取得了很好的结果。
输入与输出之间存在高度非线性关系,因此使用传统方法量化其相关性无法得出可解释的结果。我也尝试过用一些特征进行训练,而忽略另一些特征,但结果不具有决定性。
您对如何以某种空间、非线性方式对这些3D特征进行排名有什么想法吗?
非常感谢您的时间!
也许可以尝试对每个特征/子集使用 RFE 和您的 3D 网络?
Keras 似乎默认使用 `batch_size` 参数执行小批量梯度下降。
是的。
SGD 的缺点:“频繁更新模型比其他梯度下降配置在计算上更昂贵,在大型数据集上训练模型所需时间显著更长。”
不,完全相反;对于一次参数更新,我们需要计算误差:在 BGD 中是针对整个数据集,在 nBGD 中是针对一些数据示例,在 SGD 中是针对单个数据示例。这就是为什么它如此轻量级。我错了吗?!
我相信你错了。
批量梯度下降在一个 epoch 结束时进行一次更新。
随机梯度下降在每个样本之后进行一次更新,并且速度慢得多(计算成本高)。
也许这篇文章会有所帮助
https://machinelearning.org.cn/how-to-control-the-speed-and-stability-of-training-neural-networks-with-gradient-descent-batch-size/
祝贺这篇好文章,尽管我迟了两年。
只是一个小问题;你说:“
* 小值会使学习过程快速收敛,代价是训练过程中的噪声。
训练过程。
* 大值会使学习过程缓慢收敛,并伴随准确的
误差梯度估计。
”
然而,难道不是小批量的情况下我们更接近 SGD 设置吗?(例如:想象一下如果我们将批量大小设置为1)我同意这意味着更多的噪声,但这不也意味着更慢的收敛吗?
另一方面,增加批量大小难道不意味着更多的样本在并行计算设置中被集中在一起,从而实现更快的收敛吗?
谢谢你,
Ahmad
是的,较小的批次近似随机梯度下降,较大的批次近似批量梯度下降。
你可以在这里看到例子
https://machinelearning.org.cn/how-to-control-the-speed-and-stability-of-training-neural-networks-with-gradient-descent-batch-size/
先生,数据集的大小与小批量大小的选择之间是否存在关系?我认为小数据集需要小批量大小。先生,您能详细说明一下吗?
可能存在。
如果迷你批次足够大,包含来自训练数据集的代表性样本,我们就能更好地近似梯度。
谢谢!清晰详细的解释!
谢谢,我很高兴它有所帮助!
您好 Jason!我有一个问题。
假设我有3200万个训练样本。在BGD中,对于每个epoch,为了更新一个参数,我们需要计算所有训练样本的总和以获得梯度。但我们每个epoch只做一次(针对一个参数)。在批次大小为32的迷你批次梯度下降中,我们只使用32个样本计算梯度。但是,由于有100万个迷你批次,我们每个epoch必须执行100万次。那么,这不应该和BGD一样计算量大吗?我知道迷你批次梯度下降有内存优势,但训练时间呢?BGD有更多的向量化优势。考虑到内存不是障碍,为什么BGD会更慢?
没错。更多的更新意味着更高的计算成本。小批量(Minibatch)更慢,批量(Batch)更快。
我建议不要使用批次(batch),因为它有这么多实例,你可能会溢出或其他问题。你会使用小批量(mini-batch)。
谢谢回复!
所以,如果批次比小批次更快,那么内存优势是小批次代替批次使用的主要原因,这种说法正确吗?否则,使用批次将完全没问题。
小批量的理由通常是更数值稳定的优化和通常更快的优化过程。
您好,我正在研究基于深度学习的分类问题。我不是学习专家。我对一次选择训练模型的样本数量有点疑问。当我们选择 step_per_epochs 小于总 NUM_OF_SAMPLES 时会发生什么?当我选择 step_per_epochs = total NUM_OF_SAMPLES / batch_size 时,每个 epoch 需要更多的迭代,并且计算时间也会增加。您能帮我澄清一下这个疑问吗?请回复。
谢谢并致以问候
您可以选择的步数少于样本数,其效果可能会减慢学习速度。
您好,感谢您的总结。
我有一个问题
您将数据分成小批量的方式重要吗?
我指的不是小批量大小,
我的意思是,如果您更改批次的组织方式,您的NN操作会有区别吗?
举例来说,在第一个 epoch 中,数据 A 和 B 随机地在同一个批次中。在第二个 epoch 中,它们在不同的批次中,依此类推。
但是我们可以在每个 epoch 中使用相同类型的批次,
但会有任何区别吗?
是的,每个 epoch 的批次都应该是一个新的随机划分。如果可能的话,理想情况下按类别分层。
一如既往,一篇值得阅读的好文章,并保持概念更新!
Brownlee 博士,我有一个问题,是之前在一次深度学习职位面试中被问到的(您也知道,这类面试很少,甚至从不提供具体问题的反馈),至今仍困扰着我(因为我已经查阅了大量资料,但都没有明确的答案),它与当前的主题非常相关。
问题是这样的:“想象一下,您刚刚训练了一个模型,使用了某个神经网络,带有一个隐藏层,并使用了小批量 SGD,没有提前停止。您发现模型给出了不错的结果。在不改变任何东西,仅增加 epoch 数量并再次训练后,您注意到损失值开始增加和减少,而不是持续下降……这种效应的名称是什么?”
我知道如果 epoch 数量太高,梯度下降更新的参数会开始在最小值附近“徘徊”,有时会稍微偏离最佳值,从而使损失值略微增加,然后在下一次迭代中得到更新和改进……但当时,解释问题并不是问题,而是这种效应的名称。那时,我回答说“这种效应没有名称,但可能是最小值附近的随机游走”,但说实话,我仍然不确定。
您知道这个名称是否有对应的名字吗?
先谢谢您了。
谢谢。
我想你指的是“双下降(double descent)”
https://openai.com/blog/deep-double-descent/
嗨,Jason,
感谢这篇精彩的文章。
我对SGD有些困惑。根据这篇文章,它“计算误差并更新训练数据集中每个示例的模型。”
所以假设我的数据集包含1000个样本,那么在一个epoch中,梯度将计算1000次,参数也将更新1000次。
但是有些来源将随机的含义理解为每个epoch只随机抽取1个样本,例如这篇文章 https://ml-cheatsheet.readthedocs.io/en/latest/optimizers.html 指出
“这个问题通过随机梯度下降(Stochastic Gradient Descent)解决。在SGD中,它只使用一个样本来执行每次迭代。样本是随机打乱和选择的,用于执行迭代。”
网上还有其他一些资料也类似地说明。它们将“随机”的含义理解为每个epoch只随机抽取一个样本。
您能对此做些阐释吗?
谢谢。
一个 epoch 是遍历数据集一次。在 SGD 中,一个批次就是一个样本。更多内容在此。
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-a-batch-and-an-epoch
如果其他来源说法不同,那么他们就与标准神经网络定义不符,你应该向他们求证。
我们如何可视化方差的减小?我们是否随机选择一个特定的权重,并在整个训练过程中累积其所有梯度并计算方差?
一个常用的方法是平均多次运行的模型性能估计,这些多次运行中分数的标准差可以作为模型性能方差的估计。
您好!感谢您的精彩文章。
我有一个疑问,关于您对批量梯度下降的评论,即“通常,批量梯度下降的实现方式要求将整个训练数据集加载到内存中,并供算法使用。”为什么会这样呢?我的理解是,一旦模型在一个特定的 epoch 中看到了一个图像/样本,就不需要再看到它了。
在一个 epoch 中可能如此,但在另一个 epoch 中我们可能会重用数据。这就是为什么将其保存在内存中很方便,这也是常见的做法。
请与我分享您的课程。
嗨 Khemis……以下是一个很好的起点
https://machinelearning.org.cn/start-here/
先生,如果我们在每次迭代中增加样本数量,比如第一次迭代取一个样本,第二次迭代取两个样本,第三次迭代取三个样本,以此类推,并使用随机梯度下降(SGD)。
这种方法会比批量梯度下降(batch)效果更好,比随机梯度下降(stochastic)效果差吗?这有可能发生吗?
你好,Jamsheed……你的问题很难笼统地回答。我建议你实现你的想法,并与基线模型进行比较。让我们知道你的发现!
谢谢先生,我正在等待您的回复。