batch_mini-batch_SGD

龙安阳
2023-12-01

Batch_mini-Batch_SGD_BGD


overview for Understanding of SGD

严格来说,有SGD、mini-Batch-GD、BGD,在相对比较早的材料中是这样划分的,SGD一次更新用到1个样本,BGD一次更新用到所有样本(如吴恩达的ML课程),mini-Batch-GD相当于先选出mini-batch,之后进行普通GD更新。

但一般来说,根据相对新一点的资料,如“深度学习”花书,“深度学习入门:基于python的理论与实现”这两本书中,把mini-BatchGD和SGD都划分为了SGD。

以下是花书原文

“每次只使用单个样本的优化算法有时被称为随机(stochastic)或者在线(online)算法。术语“在线”通常是指从连续产生样本的书籍流中抽取样本的情况,而不是从一个固定大小的训练集中遍历多次采样的情况。”

“大多数用于深度学习的算法介于以上两者之间,使用一个以上而又不是全部的训练样本。传统上,这些会被称为小批量或者小批量随机方法,现在通常将他们简单地称为随机方法”

1. Batch

对神经网络而言,通常是打包处理多个输入数据(样本/图像),这样的一捆数据称为batch [1]

优点:1. 对计算机运算有好处,可以缩短处理时间。大多数处理数值运算的库都进行了能够搞笑处理大型数组运算的最优化。 并且在神经网络的运算中,当数据传送称为瓶颈时,批处理可以减轻数据总线的的负荷,相对于读入数据,计算机能讲更多的时间用在计算上。也就是说,批处理一次性计算大型数组要比分开逐步计算各个小型数组速度更快。对RTX2080TI而言,有4352个cuda单元,而cpu通常只有4~8核,这也从另一个角度说明了为什么gpu更适合拿来做计算。

相关: batch gradient descent

2. mini-Batch

整个样本集中取出一个小批量的数据进行运算

优点:

  1. 具有更快的拟合速度。
    n个样本均值的标准差为 sigma/sqrt(n) 。假设有两个假想的梯度计算,一个基于100个样本,另一个基于10000个样本。后者的计算量是前者的100倍,但是只是降低了10倍的均值标准差。如果能够快速的计算出梯度的估计值,而不是缓慢的计算较为准确的值,那么大多数优化算法会收敛的更快。
  2. 具有轻微的正则化效果。
    可能是因为训练过程中加入了噪音。在batch_size为1时,泛化误差最好。但是因为梯度估计的高方差,需要有较小的学习率以保持稳定性,而且给整个学习过程增加了步骤,会导致整个训练过程有较长的时间。

batch_size 的选择通常为2的幂数,一般取值范围为32~256

3. BGD and SGD

BGD指在一次参数更新的过程中,用到了所有的数据,而SGD似乎不同的资料有不同的说法,现整理如下。

首先,根据吴恩达机ML的课程有:

SGD只需要考虑一个训练样本,相比而言,BGD对m个样本求和来得到梯度项,SGD是对单个样本求出梯度项进行参数更新。 
SGD的过程如下:
1. 随机打乱所有数据
2. 遍历所有数据,每个数据都进行一次参数更新

根据“深度学习入门:基于python的理论与实现”有:

神经网络的学习过程有:
1. mini-batch, 从训练数据中随机选取出一部分数据。目标是减小mini-batch的损失函数的值
2. 计算梯度, 求出各个权重参数的梯度
3. 更新参数, 将权重参数眼梯度方向进行微小更新
4. 重复步骤1,2,3

因为这里使用的数据是随机选取的mini batch数据,所以又称为随机梯度下降法。“随机”指随机选择的意思。

4. Tensorflow 1.x

for epoch in range(self.cfg.epoches):
    for batch in range(batches):
        xs, ys = ds.train.next_batch(self.cfg.batch_size)
        _, loss, precise = self.session.run([ts.train_op, ts.loss, ts.precise],
                                            {ts.x: xs, ts.y: ys})
        print("%d/%d\tloss: %.6f\tprecise: %.6f" % (epoch, batch, loss, precise)
 类似资料:

相关阅读

相关文章

相关问答