严格来说,有SGD、mini-Batch-GD、BGD,在相对比较早的材料中是这样划分的,SGD一次更新用到1个样本,BGD一次更新用到所有样本(如吴恩达的ML课程),mini-Batch-GD相当于先选出mini-batch,之后进行普通GD更新。
但一般来说,根据相对新一点的资料,如“深度学习”花书,“深度学习入门:基于python的理论与实现”这两本书中,把mini-BatchGD和SGD都划分为了SGD。
以下是花书原文
“每次只使用单个样本的优化算法有时被称为随机(stochastic)或者在线(online)算法。术语“在线”通常是指从连续产生样本的书籍流中抽取样本的情况,而不是从一个固定大小的训练集中遍历多次采样的情况。”
“大多数用于深度学习的算法介于以上两者之间,使用一个以上而又不是全部的训练样本。传统上,这些会被称为小批量或者小批量随机方法,现在通常将他们简单地称为随机方法”
对神经网络而言,通常是打包处理多个输入数据(样本/图像),这样的一捆数据称为batch [1]。
优点:1. 对计算机运算有好处,可以缩短处理时间。大多数处理数值运算的库都进行了能够搞笑处理大型数组运算的最优化。 并且在神经网络的运算中,当数据传送称为瓶颈时,批处理可以减轻数据总线的的负荷,相对于读入数据,计算机能讲更多的时间用在计算上。也就是说,批处理一次性计算大型数组要比分开逐步计算各个小型数组速度更快。对RTX2080TI而言,有4352个cuda单元,而cpu通常只有4~8核,这也从另一个角度说明了为什么gpu更适合拿来做计算。
相关: batch gradient descent
整个样本集中取出一个小批量的数据进行运算
优点:
batch_size 的选择通常为2的幂数,一般取值范围为32~256
BGD指在一次参数更新的过程中,用到了所有的数据,而SGD似乎不同的资料有不同的说法,现整理如下。
首先,根据吴恩达机ML的课程有:
SGD只需要考虑一个训练样本,相比而言,BGD对m个样本求和来得到梯度项,SGD是对单个样本求出梯度项进行参数更新。
SGD的过程如下:
1. 随机打乱所有数据
2. 遍历所有数据,每个数据都进行一次参数更新
根据“深度学习入门:基于python的理论与实现”有:
神经网络的学习过程有:
1. mini-batch, 从训练数据中随机选取出一部分数据。目标是减小mini-batch的损失函数的值
2. 计算梯度, 求出各个权重参数的梯度
3. 更新参数, 将权重参数眼梯度方向进行微小更新
4. 重复步骤1,2,3
因为这里使用的数据是随机选取的mini batch数据,所以又称为随机梯度下降法。“随机”指随机选择的意思。
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)