IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 增加batch_size的一种方法:梯度累加 -> 正文阅读

[人工智能]增加batch_size的一种方法:梯度累加

一、为什么会有batch_size参数

经常做训练的童鞋们都知道,batch_size是一个很重要的超参数,每次训练支取batch_size个数据集进行训练,那么,为啥不取全部呢,答案可想而知,应为内存不够呀,放不下呀,小数据集还好,内存勉强够,勉强放的下,但是花费大量的时间加载了数据后,训练了一个epoch之后,发现参数不对,需要重新调参,然后中断训练,花1s调了个参数,花费2h加载了数据,不累么?!所以需要batch_size这个参数。
虽然全部的数据集可以更好的确定样本总体的方向,但是一次性处理整个数据集,是非常不明智的!

二、batch_size对学习的影响

使用batch_size之后,就变成批梯度下降法(min-batches learning),如果数据集足够充分,那么使用一半(甚至少得多)的数据算出来的梯度与全部数据集训练出来的梯度是几乎一样的。那么batch_size多大合适呢?
当batch_size=1时,也即是每次只取一个样本进行训练,每次只根据一个样本的梯度选择方向进行下降,每个样本身上个体差异大于样本的共性,因此梯度修正的方向,整体来说是朝着正确的方向,但是每一步走的都很杂乱,走了很多弯路,因此收敛速度很慢。
在这里插入图片描述
合理的范围内,增加batch_size的好处:

  • 内存利用率提高了,大矩阵乘法的并行化效率提高。
  • 加快数据的处理速度
  • 在一定范围内,一般batch_size越大,其确定的下降方向越准,训练震荡越小。

盲目增大batch_size有何坏处?

  • 跑完一次epoch所需要的迭代次数减少,参数的更新次数也减少了,因此精度也会收到影响
  • batch_size增大到一定程度,其确定的下降方向已经基本不再变化

三、什么是梯度累加

直接上代码,通常训练代码

for i, (inputs, labels) in enumerate(trainloader):
          optimizer.zero_grad()                   # 梯度清零
          outputs = net(inputs)                   # 正向传播
          loss = criterion(outputs, labels)       # 计算损失
          loss.backward()                         # 反向传播,计算梯度
          optimizer.step()                        # 更新参数

加入梯度累加之后的代码:

for i, (inputs, labels) in enumerate(trainloader):
         outputs = net(inputs)                   # 正向传播
         loss = criterion(outputs, labels)       # 计算损失函数
         loss = loss / accumulation_steps        # 损失标准化
         loss.backward()                         # 反向传播,计算梯度
        if (i+1) % accumulation_steps == 0:
                optimizer.step()                    # 更新参数
                optimizer.zero_grad()               # 梯度清零

修改点有两个:
1、loss 变为 loss / accumulation_steps
2、 accumulation_steps 之后再更新

四、梯度累加如何增加batch_size

因为你每次求出来的loss是一个批次内预测和标签误差的平均值,当你用梯度累计的时候求出几个批次的平均值,当然要再平均一下保证它等效大批次的平均值。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:50:48  更:2022-03-21 20:53:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:44:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码