Mini batch梯度下降法(吴恩达深度学习视频笔记)

深度学习并没有在大数据中表现很好,但是我们可以利用一个巨大的数据集来训练神经网络,而在巨大的数据集基础上进行训练速度很慢,因此进行优化算法能够很大程度地增加训练速度,提升效率。

本节,我们将谈谈Mini batch梯度下降法。
之前的学习中,我们已经了解到向量化能够实现对m个样本有效计算,不用明确的公式就能够处理整个训练集,所以,我们要把数据集放在一个巨大的矩阵X中,
X=[x(1) x(2) x(3) … x(m) ],因此X的维度是(n,m).

向量化能让你相对较快地处理所有m个样本,但如果m很大,处理速度仍然很慢。比如,m=500万,在对整个训练集执行梯度下降时,必须对整个m处理。mini batch就是你可以把训练集分割为小一点的子训练集,这些子集被取名为mini-batch,假设每一个子集中只有1000个样本,那么其中的X{1}=x(1) x(2) … x(1000)称为第一个子集,也叫做mini-batch,然后再取接下来的1000个样本X{2}=x(1001) x(1002) … x(2000),以此类推,就得到了5000个mini-batch,即
X=[X{1} X{2} X{3} … X{5000}]。

# mini-batch 梯度下降法
for t = 1,...,5000:
forward prop on X^{t}
	Z^[1] = W^(1)X^{t} + b^(1)
	A^[1] = g^(1)Z^[1]
	...
	A^[l] = g^(l)Z^[1]
compute cost J^{t}=1/1000*sum L(y^(i),y^^(i))+lamda/2000*sum |w^(l)|^2
back prop to compute gradient cost J
w^[l]=w^[l]-alpha*dw^[l]
b^[l]=b^[l]-alpha*db^[l]

这里的代码只是遍历了1次训练集,也成为epoch=1,利用mini-batch可以一次进行5000次梯度下降,如果需要多次进行遍历,需要再假如循环语句。
Mini batch梯度下降法(吴恩达深度学习视频笔记)_第1张图片
如果画出batch梯度下降的成本函数随迭代次数的图像,会发现对着迭代次数增多,成本会下降,但是对应mini-batch,因为每次迭代时处理的是X{t},Y{t}对应于J{t}的图像,因此每次迭代都在训练不同的样本集,画出来的图像虽然是向下的但是包含更多的噪声。
你需要决定的变量之一是mini-batch的大小,m就是训练集的样本数,极端情况下,如果mini-batch的大小等于m,其实就是batch梯度下降法;如果mini-batch的大小等于1,就有了新的算法,叫作随机梯度下降法SGD,这里每个样本都是新的mini-batch。

看一下在两个极端情况下成本函数的优化情况:
Mini batch梯度下降法(吴恩达深度学习视频笔记)_第2张图片
蓝色的线是mini-batch的成本函数的优化路径,它的噪声相对低一些,幅度也更大一些,可以较快地找到最小值;相反,对于SGD算法,由于每次迭代,你只对一个样本进行梯度下降,因此大部分时候向着最小值靠近,有时候向着相反的方向前进,因为那个样本恰好给你指的方向不对,因此SGD是有很多噪声的,平均来看,它会最终指向最小值,不过有时候也会方向错误。因此SGD永远不会收敛,而是会一直在最小值附近波动,但它并不会在达到最小值并停留在此。不过可以通过减小学习率,噪声会被改善或有所减少,但是最大的问题是这样做会失去所有向量化带给你的加速,因为一次迭代只处理一个样本,效率过于低下。

mini-batch的大小应该介于1到m之间,从而学习率也会增大,这样做的好处是:得到了大量向量化;不需要等待整个训练集被训练完就可以得到进行下一次工作。

原则:
如果训练集太小(小于2000个样本),直接用batch梯度下降;
如果训练集很大,因为计算机是二进制的,因此如果mini-batch是2的幂次方,代码运行速度会更快一些,但一般选择大小在64(2的6次方)——512,可以在实践中选择不同的数值,看成本函数下降快慢。

你可能感兴趣的:(算法,深度学习)