batch和momentum

embedded/2024/12/23 2:35:41/

在这里插入图片描述

🚀 机器学习系列前期回顾

1、初识机器学习
2、线性模型到神经网络
3、local minima`的问题如何解决

🚀在初识机器学习中,了解了机器学习是如何工作的并引入了线性模型,在线性模型到神经网络这节,将线性模型进一步改进为弹性较大的神经网络模型并在结尾简要说了一下使用一个batch更新一次参数,在local minima的问题如何解决这节,解决了求解模型未知参数的时候遇见local minima的解决办法。在这一小结,将继续探索为什么要使用batch

1) batch

在前面已经了解过了batch 如何工作,其就是在进行模型未知参数求解的时候,对于构建损失函数来说,之前是使用所有的已知的数据(训练数据)来构建损失函数,而引入batch,将已知的所有数据分成等大小的batch,使用一个batch的数据来构建损失函数,进行更新参数,然后依次使用下一个batch构建新的损失函数,进行更新参数,直到使用完最后一个batch,即看完所有的已知数据,即进行了一个epoch 在进行完一个epoch后,会将数据进行一个shuffle(洗牌的操作),再次分成batch进行训练,更新参数。

在这里插入图片描述

2)batch的大小如何设置

对于batch的大小如何设置,这也是一个超参数,需要自己人工设置,那到底应该设置多大,先来看一个极端的例子

example

假设有20个训练数据,若极端的将batch的大小就设置为20,即full batch;另外一个极端将batch的大小设置为1。

在这里插入图片描述

  • 对于full batch来说,其是使用full batch来构建损失函数,即用20个已知数据来构建损失函数,其更新一次参数要看过所有的20个资料,并且看完20个资料只更新一次。
  • 对于batch的大小为1,即只使用一个数据来构建损失函数,其每次更新数据只看其中一个数据,当看完20个资料更新20次。

这样对比来看,使用full batch的话,计算量较大,好像更新较慢,batch的大小为1的话,计算量较小,且更新的速度较快,所以看起来好像batch的大小越小越好

其实大的batch不需要更长的时间

这是因为其实GPU有平行运算(parallel computing)的能力;在下图中,对于手写体识别的实验来说,若batch的大小是1或者10或者100,甚至1000的话,他们运行所需要的时间都是相差不大的,所以batch的大小只要不太大,其计算时间几乎没有区别

在这里插入图片描述

所以得到小的batch和大的batch在一次计算时间上没有差异。但是对于一个epoch的时间呢?

如下图所示,对于一个epoch来说,如果batch的大小是1的话,进行一个epoch需要60000次的更新操作;如果batch的大小是1000的话,进行一个epoch需要60次的更新操作。在计算时间相同的情况下,60000次的计算更新操作显然要比60次的更新操作所需要的时间更多。

在这里插入图片描述

时间上来说:较大的batch更节约资源

batch的大小对于训练结果的准确度又有什么影响呢?观察下图可知,要是batch的过大,反而会导致准确度的下降。同样的模型使用不同的batch训练,其最后的准确度不同,这显然不是model bias的问题,也并不是overfitting的问题,因为对于过拟合来说,其表现为训练上表现好,测试上表现不好,所以这是由于使用大的batch导致的optimization failed(没有找到最好的解)。
在这里插入图片描述

准确度上来说:较小的的batch可以训练出来更高准确度的模型。

为什么较小的的batch可以训练出来更高准确度的模型?

在这里插入图片描述

  • full batch的其损失函数是固定不变的,在更新参数求解的时候更难走到全局最优解。
  • small batch的损失函数,在不同的batch中,其损失函数是不一样的,就如上图所示,若在batch1中得到的损失函数是 L 1 L^1 L1的话,它也许会卡在local minima的位置,当时进入第二个batch进行训练的时候,也许在batch2中得到的损失函数 L 2 L^2 L2就正好跳过了local minima,所以小一点的batch更好到达全局最优点。

小的batch在训练的时候可以得到更低的准确率,现在想办法将使用大的batch训练(下图中LB(large batch)那列)也达到和小的一样的准确度,然后让LB和SB进行测试,得到的结果也如下图所示,仍然是SB的表现更好。
在这里插入图片描述
所以可以得到,小的batch不仅在训练的时候表现得更好,而且在测试上也会表现得更好,即使使用大的batch,想办法让其在训练得时候达到小batch的训练效果,即使得到了好的训练效果,但是其在测试数据上也不会表现得好。

上图该数据来自论文https://arxiv.org/abs/1609.04836

总结一下小的batch和大batch的对比:

在这里插入图片描述

3) momentum

这也是一个对抗local minimasaddle point的技术。先来假设一下,在物理世界里,一个小球从高处滚落,要想使得其滚到局部最低点的时候,并不会停下来,而是会继续带有一定的momentum(动量) 继续向前运动,也许就会有机会走出local minma

在这里插入图片描述

所以,现在如果可以将这种特性加到之前的梯度下降中的话,就可以进一步很好的克服local minma的问题,可以更好的走到全局最优点。

在加入这种特性之前,先来回顾一下之前的梯度下降;如下所示,随机初始初始点开始,计算梯度,根据该点的梯度进行下降。

在这里插入图片描述

加入momentum之后,每次进行移动的时候会考虑前一次的移动方向。 每一次更新都是计算当前点的梯度然后再加上前一步的梯度。

在这里插入图片描述

具体来看一下momentum是如何工作的

  • 第一个位置,先计算该点的导数,根据导数得出的方向为红色线提供的,蓝色线为初始设定的一个方向。
  • 第二个位置,同样先计算该点的导数,很平缓,所以根据导数得到的红色线很小,同时得加上前一步的移动方向继续向前移动
  • 来到第三个位置,计算导数为零,即不提供红色方向,但是还得加上前一个点的蓝色方向,所以还得再往前走

在这里插入图片描述

  • 来到第四个点后,同样的计算其导数,导数提供的红色方向是向左的,前一个点的蓝色方向提供的蓝色方向是向右的,所以二者相加会抵消一部分,若前一个点提供的蓝色方向更多一点的话,那么整体也就会继续再向右移动,有可能就会越过local minima

在这里插入图片描述


http://www.ppmy.cn/embedded/121581.html

相关文章

INTO:Web3世界的“价值引力场”

在Web3的宇宙中,一股强大的引力正在重塑整个数字世界的格局。这股引力,来自一个名为INTO的“超级连接器”。作为Web3社交领域的先锋,INTO正在用一种前所未有的方式重构整个产业链的价值体系。它不再满足于单一领域的创新,而是大胆…

集师专属心理咨询 心理培训 心理知识服务小程序搭建 专属知识付费小程序搭建

集师专属心理咨询 心理培训 心理知识服务小程序搭建 专属知识付费小程序搭建 1. 心理咨询知识服务小程序功能图解 2. 心理咨询知识服务小程序解决方案及运营服务模式图解 3. 心理咨询行业为什么要搭建自己的专属知识付费小程序平台图解 4. 心理咨询培训知识小程序人人可变现图…

Rust和Go谁会更胜一筹

在国内,我认为Go语言会成为未来的主流,因为国内程序员号称码农,比较适合搬砖,而Rust对心智要求太高了,不适合搬砖。 就个人经验来看,Go语言简单,下限低,没有什么心智成本&#xff0c…

代码随想录 99. 岛屿数量

99. 岛屿数量 #include<bits/stdc.h> using namespace std;void dfs(vector<vector<int>>& mp, vector<vector<int>>& visit, int y, int x){if (visit[y][x] 1 || mp[y][x] 0) return;visit[y][x] 1;if (y > 0) dfs(mp, visit, …

OpenCV库 详细常见操作

在PyCharm中使用OpenCV时&#xff0c;可以访问OpenCV库提供的丰富函数来进行图像处理和计算机视觉任务。以下是一些常用的OpenCV库函数及其简要说明&#xff1a; 一、图像读取与显示 cv2.imread()&#xff1a;读取图像文件。cv2.imshow()&#xff1a;在一个窗口中显示图像。c…

Java中使用接口实现回调函数的详解与示例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

数据结构 ——— 单链表oj题:返回链表的中间节点

目录 题目要求 手搓简易单链表 代码实现 题目要求 给你单链表的头节点 head &#xff0c;请你找出并返回链表的中间节点 如果有两个中间节点&#xff0c;则返回第二个中间节点 要求算法的时间复杂度为&#xff1a;O(N) 手搓简易单链表 代码演示&#xff1a; // 单链表中…

【Android】多角度看handler--looper的阻塞

在【Android】app中阻塞的looper为什么可以响应touch事件_消息队列阻塞为什么还能响应点击事件-CSDN博客 里面&#xff0c;我们查看到input事件唤醒应用中的looper阻塞&#xff0c; 作为对比&#xff0c;我们再看看广播中的唤醒&#xff0c;我们知道&#xff0c;在注册的广播…