本文知识点:
- 什么是 mini-batch 梯度下降
- mini-batch 梯度下降具体算法
- 为什么需要 mini-batch 梯度下降
- batch, stochastic ,mini batch 梯度下降的比较
- 如何选择 mini batch 的参数 batch size 呢
- 在 TensorFlow 中应用举例
之前写过一篇文章:
如何选择优化器 optimizer
里面对 BGD,SGD,MBGD,Adagrad,Adadelta,RMSprop,Adam 进行了比较,
今天对其中的 mini-batch 梯度下降 作进一步详解。
1. 什么是 mini-batch 梯度下降
先来快速看一下 BGD,SGD,MBGD 的定义,
当每次是对整个训练集进行梯度下降的时候,就是 batch 梯度下降,
当每次只对一个样本进行梯度下降的时候,是 stochastic 梯度下降,
当每次处理样本的个数在上面二者之间,就是 mini batch 梯度下降。
我们知道 Batch 梯度下降的做法是,在对训练集执行梯度下降算法时,必须处理整个训练集,然后才能进行下一步梯度下降。
如果在处理完整个训练集之前,先让梯度下降法处理一部分数据,那么算法就会相对快一些。
也就是把整个大的训练集划分为若干个小的训练集,被称为 mini batch。
例如 500 万的训练集,划分为每个子集中只有 1000 个样本,那么一共会有 5000 个这样的子集。同样的,对 y 也做相应的划分:
(注:上角标用大括号表示为第几个子集,小括号为第几个样本,中括号为神经网络的第几层。)
这时候,每一次对每个子集进行整体梯度下降,也就是对 1000 个样本进行整体梯度下降,而不是同时处理 500万 个 x 和 y。相应的这个循环要执行 5000 次,因为一共有 5000 个这样的子集。
2. mini-batch 梯度下降具体算法
t 代表第几个子集,从 1 到 5000,因为划分后,一共有 5000 个子集,
1. 对每个子集,先进行前向计算,从第一层网络到最后一层输出层
因为 batch 梯度下降是对整个数据集进行处理,所以不需要角标,而 mini batch 这里需要对 x 加上角标,代表的是第几个子集。
2. 接下来计算当前子集的损失函数,因为子集中一共有 1000 个样本,所以这里要除以 1000。损失函数也是有上角标,和第几个子集相对应。
3. 然后进行反向传播,计算损失函数 J 的梯度。
4. 最后更新参数。
将 5000 个子集都计算完时ÿ