深度学习笔记:2.1|2.2 mini-batch梯度下降法及其理解

2.1   mini-batch梯度下降法

第二章我们开始学习优化算法,以便于更快地训练神经网络。首先介绍mini-batch梯度下降法,如下图所示:

相比于mini-batch梯度下降法,我们大家更熟悉的应该是batch梯度下降法,即梯度下降法。那batch梯度下降法和mini-batch梯度下降法有什么区别吗?其实他俩的区别就存在于名字中,一个是batch,即进行梯度下降训练时,使用全部的训练集,而mini-batch,表示比batch小一些,就是指在进行梯度下降训练时,并不使用全部的训练集,只使用其中一部分数据集。

我们知道,不论是梯度下降法还是mini-batch梯度下降法,我们都可以通过向量化(vectorization)更加有效地计算所有样本。如上图所示,我们用nx表示每个样本的维度,m表示样本数,那么通过向量化,我们使用nx*m维的矩阵X来表示所有样本,同理,Y为m维的向量。

已经有了梯度下降法,我们为什么还要提出mini-batch梯度下降法呢?在实际计算中,我们可能会遇到特别大的数据集,这时再使用梯度下降法,每次迭代都要计算所有的数据集,计算量太大,效率低下,而mini-batch梯度下降法允许我们拿出一小部分数据集来运行梯度下降法,能够大大提高计算效率。

如上图中例子,假设我们有5,000,000个样本,使用梯度下降法效率低下,这时我们可以将其分为5000份mini-batch,而每一份有1000个样本,我们将每一份mini-batch记为X{t}、Y{t}(t为右上标,如上图所示),可知,X{t}为nx*1000维的矩阵,Y{t}为1000维的向量。

这里再重复说明一下老师课中一些符号的意义。如上图右下角所示,X右上方小括号内i表示这是第i个样本,Z右上方中括号内L表示这是神经网络的第L层对应的Z值,X和Y右上方花括号内的t表示第t个mini-batch数据集。

那么我们该怎么使用mini-batch梯度下降法呢?如下图所示:

可以看到上图的算法流程图显示,存在两个循环。首先是我们循环使用所有mini-batch数据集去训练W(for t =1,...,5000),这个过程我们重复5000次,每次都用一个包含1000个样本的mini-batch数据集去训练W。图中右上角的一次梯度下降法(one step of gradient descent)是指此时我们在训练W时使用其中一个mini-batch去训练,且此时并不利用for循环去处理这1000个样本,而是通过向量化(vectorization)同时处理这1000个样本。

这个过程重复5000次,我们称之为一代训练(one epoch of training),‘一代’在这里指只是遍历了训练集一次,对于梯度下降法(batch),一代训练(one epoch)意味着只能做一次梯度下降(one step),因为对于梯度下降法,我们每次都使用全部的数据集去做一次梯度下降。 而对于mini-batch梯度下降,一代训练我们可以做5000次梯度下降。

这5000次循环完只是把我们所有的mini-batch数据集循环了一遍,但是不一定达到我们的收敛精度要求,所以我们需要在最外面再加一层循环,停止准则为循环次数或者误差要求。

2.2   深入理解mini-batch梯度下降法

接下来我们来深入理解一下梯度下降法和mini-batch梯度下降法的区别,不仅仅是局限于数据集的使用大小上,如下图所示:

如上图所示,当我们使用梯度下降法时,代价函数J是梯度下降迭代次数的单调递减函数,即每一次参数的修正都是奔着能使J减小的目的去的,这结果也是理所当然,因为梯度下降法使用了全部的数据集,且参数的梯度就是以减少J为目的计算得到的。

相比于梯度下降法的光滑曲线,mini-batch梯度下降法就显得粗糙多了。为什么会这样呢?如上图所示,t表示第t个mini-batch数据集,也可以作为迭代次数,因为我们是从第一个mini-batch数据集开始训练的,一直到最后一个。我们把大的数据集分为多个mini-batch数据集,这些小的数据集是独立同分布的,所以当我们用这些数据集去更新权重时,大的方向肯定是对的,即随着迭代次数的增加,代价函数J的趋势是逐渐减小的,那为什么会有波动呢?因为我们在迭代过程中,每次使用了不同的数据集,他们在更新权重的过程中,代价函数情况也是不一样的。也许第一个数据集比较简单,代价函数值降低,而在该权重的基础上,第二个数据集较复杂,代价函数反而上升。

了解了原理,我们该怎么选择mini-batch的大小呢?

如上图所示:如果我们令mini-batch的大小为m,那就是梯度下降法(batch),如果我们令mini-batch的大小为1,那就是随机梯度下降法(stochastic gradient descent),即每次我们只使用一个样本进行训练。

一般实际中,我们会令mini-batch的大小介于1和m之间,会什么这样设定呢,我们来分析一下这三种方法的优缺点,相信你能更好理解。

首先介绍梯度下降(batch),路径如图中蓝线所示,从任一点出发,每一步都使代价函数J的值更小,相比mini-batch梯度下降法和随机梯度下降法噪声低一些,幅度也大一些。但缺点是每次迭代要使用全部数据集,运行时间太长。

接着介绍随机梯度下降法(stochastic),路径如图中紫线所示,大部分时候向着全局最小值靠近,有时候也会远离最小值,当那个样本恰恰指的方向不对时,有很多噪音。平均来看,最终会靠近最小值,但有时也会方向错误,因为SGD永远不会收敛,而是会一直在最小值附近波动,不会到达最小值并停留在那里。为了减少噪声,我们可以通过减少学习率, 这也是为什么梯度下降相比于随机梯度下降,幅度更大一些。同时,因为每次只处理一个样本,该算法失去了向量化带来的加速,导致效率过于低下。

最后介绍mini-batch梯度下降法,路径如图中绿线所示,mini-batch数据集大小介于1和m之间,其特征也介于梯度下降法和随机梯度下降法之间,是二者的优化,计算速度最快。因为相比于随机梯度下降法,mini-batch可以进行向量化操作,同时相比于梯度下降法同时使用全部数据集,效率更高。mini-batch梯度下降法不一定在很小的范围内收敛或者波动,如果出现这个问题,可以慢慢减少学习率。

确定了mini-batch的大小范围,我们该如何确定mini-batch的大小值呢?如下图所示:

如果我们的训练集很小,比如小于2000个样本,那直接使用梯度下降法就可以,无需使用mini-batch。对于较大的数据集,我们最好使用mini-batch,考虑到电脑内存的设置和使用方式,其大小最好设为2的次方,比如64,128,256,512,这些都是大家经常使用的mini-batch的大小,我们上文中使用的1000其实不常见,就算使用最好使用1024。注意,所有的mini-batch数据集要符合CPU/GPU内存,如果不符合,那么不论你怎么处理数据,你会发现算法的表现变得很差,甚至惨不忍睹。

其实,mini-batch的大小值也是一个超参数,需要我们去调试的。这里给了几种选项,那么在实际中,我们可以将这几个都试一下,选择能够最有效地减少代价函数的那个超参数值。

版权声明:尊重博主原创文章,转载请注明出处https://blog.csdn.net/kkkkkiko/article/details/81227887

猜你喜欢

转载自blog.csdn.net/kkkkkiko/article/details/81227887