XGundam05 发表于 2022-12-11 11:01

【MindSpore易点通】深度学习系列:优化算法之Mini-batch ...

嗨咯,宝子们,每周一见!今天给大家带来一些优化算法。优化算法,顾名思义,小编猜应该是帮忙我们训练模型优化,提高训练速度的方法。废话不多说,今天就给大家科普一下Mini-batch梯度下降法~
如何使用

在我们之前的介绍中,m个样本其实是看作向量方便大家较快处理计算的,因此,我们把训练样本放到矩阵X中进行处理:X=,同理,Y也是如此,Y=,X的维数是(nx,m),Y的维数是(1,m)。
当然,这里有个前提,就是m的数值不会很大,否则依然处理速度缓慢。那么这个时候,我们就可以借助梯度下降法提前处理一部分数据。
可以把训练集分割为小一点的子集训练,这些子集我们可以称之为mini-batch。假设每一个子集中只有1000个样本,那么把其中的x(1)——x(1000))提取出来,将其称为第一个子训练集,也叫做mini-batch,然后再取出x(1000)——x(2000),以此类推。
这里为了方便更好地统计,X{1}=x(1)——x(1000)),X{2}=x(1000)——x(2000)X^({2}),假设训练样本m=500w,每个mini-batch都有1000个样本,也就是说,这个训练集一共有5000个mini-batch。



对于Y的处理也是同样的,拆分Y的训练集,对应地,Y{1}=y(1001)——y(2000),Y{2},...,Y{5000}。



mini-batch的数量t组成了X{t}和Y{t},包含相应的输入和输出,这里的t就表示不同的mini-batch。
X{t}和Y{t}的维数:X{t}所有维数都是(nx,1000),而Y{t}的维数都是(1,1000)。
那么mini-batch梯度下降法的原理是什么样的呢?
在训练集上运行mini-batch梯度下降法,运行:for t=1……5000,在for循环里对X{t}和Y{t}执行一步梯度下降法。假设有一个拥有1000个样本的训练集,要用向量化去几乎同时处理1000个样本。
首先对输入X{t},执行前向传播,然后执行z=WX+b,而处理第一个mini-batch时就全部转成X{t},即z=W X{t}+b,然后执行Ak=g(Z),以此类推,直到Ak=g(ZL]),也就是我们的预测值。这样一个向量化的执行命令一次性处理1000个而不是500万个样本。
接下来就是执行反向传播来计算J{t}的梯度,更新加权值,W:=W-adW,
b:=b-adb,这是使用mini-batch梯度下降法训练样本的一步,也可被称为进行“一代”(1 epoch)的训练。一代表示一次遍历了训练集。
使用batch梯度下降法,一次遍历训练集只能做一个梯度下降,而使用mini-batch梯度下降法,一次遍历训练集,能做5000个梯度下降,因此,mini-batch梯度下降法比batch梯度下降法运行地更快。当然也可以一直处理遍历训练集,直到最后能收敛到一个合适的精度。
进一步理解





使用batch梯度下降法时,每次迭代都需要历遍整个训练集,可以预期每次迭代成本都会下降,所以如果成本函数J是迭代次数的一个函数,它应该会随着每次迭代而减少,如果J在某次迭代中增加了,那肯定出了问题,也许学习率太大。
使用mini-batch梯度下降法,我们会发现成本函数并不是每次迭代都是下降的,特别是在每次迭代中,我们要处理X{t}和Y{t},成本函数J{t}的只和X{t}、Y{t}有关,最终我们会发现,图像整体走向朝下,但是有更多的噪声,
我们需要决定的变量之一是mini-batch的大小,m指训练集的大小,其实如果mini-batch的大小等于m,就是batch梯度下降法,这样的话我们就有了mini-batchX{1}和Y{1},并且该mini-batch等于整个训练集。
当然还可以假设mini-batch大小为1,这样就变成了随机梯度下降法,每个样本都是独立的mini-batch,第一个mini-batch就是第一个训练样本,接着是第二个mini-batch,也就是第二个训练样本,以此类推,一次只处理一个。



从上图中我们可以发现,在两种极端下成本函数的优化情况:1、batch梯度下降法从某处开始,相对噪声低些,幅度也大一些,但可以继续找最小值;2、而在随机梯度下降法中,从某一点开始,每次迭代只对一个样本进行梯度下降,大部分时候会向着全局最小值靠近,因此随机梯度下降法是有很多噪声的,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一直在最小值附近波动。
实际上我们选择的mini-batch大小应该在在1和m之间,如果使用batch梯度下降法,mini-batch的大小为m,每个迭代需要处理大量训练样本,该算法的主要弊端在于训练样本数量巨大的时候,单次迭代耗时太长;相反,如果使用随机梯度下降法,通过减小学习率,噪声会被改善或有所减小,但随机梯度下降法的一大缺点是,会失去所有向量化带来的加速,因为一次性只处理了一个训练样本。



所以实际上一些位于中间的mini-batch大小效果最好,这里有个小技巧可以无偿赠送给大家!
1、如果训练集较小,直接使用batch梯度下降法(小于2000个样本)
2、样本数目较大的话,一般的mini-batch大小为64到512(设成2的次方)
3、需要确保X{t}和Y{t}和CPU/GPU内存相匹配
当然啦,优化算法肯定不止这一个,我们后续会给大家继续带来讲解!再见不送~
页: [1]
查看完整版本: 【MindSpore易点通】深度学习系列:优化算法之Mini-batch ...