神经网络训练中batch的作用(从更高角度理解)

1.什么是batch

batch,翻译成汉语为批(一批一批的批)。在神经网络模型训练时,比如有1000个样本,把这些样本分为10批,就是10个batch。每个批(batch)的大小为100,就是batch size=100。
每次模型训练,更新权重时,就拿一个batch的样本来更新权重。

2.神经网络训练中batch的作用(从更高角度理解)

从更高的角度讲,”为什么神经网络训练时有batch?“,需要先讲一些预备知识。

当我们求损失loss用于梯度下降,更行权重时,有几种方式。一种是全部的样本用来求loss,这种方式称为批量梯度下降(BGD);一种是随机的选取一个样本,求loss,进而求梯度,这种方式称为随机梯度下降(SGD);BGD和SGB的这种,产生了第三种梯度下降的方法:小批量梯度下降(MBGD)

当我们使用BGD方法来更新权重时,面临一个问题:
我们知道,梯度下降法是求得某个点,使得loss最小。通过往梯度减小的方向更新权重值,可以使得loss减小。如下图所示:
在这里插入图片描述

绿色箭头所示,为梯度减小的方向。沿此方向更新权重,使得loss减小。

但这种方法面临一个很尖锐的问题。当梯度为0时,无论怎么更新权重,loss都不再改变,从而无法找到最优点。如下图所示,当位于红圈标出的区域时,梯度为0,此时梯度下降法就失效了,无法找到最优点。
在这里插入图片描述
但引入随机梯度下降SGD方法时,就能很大程度避免这个问题。

原因时:批量梯度下降时,全部的样本用于求loss。而随机梯度下降是,随机选取一个样本求loss进而求梯度。这种方式就很大程度上规避了梯度为0的情况。即使某次训练更新权重时,梯度为0,下次也不一定为0。而批量梯度下降则不然,本次更新权重时,梯度为0,下次还是0。梯度下降法就失效了。

但批量梯度下降和随机梯度下降有各自的优缺点:

1.使用批量梯度下降时,虽然模型的性能低,但耗费时间时间也低。(由于其求梯度,更新权重时,可以并行计算,因此是求所有样本损失的累加和)

2.使用随机梯度下降时,虽然模型的性能高,但耗费的时间也高。(由于其求梯度,更新权重时,可以并行计算。某步更新权重,要依赖上一步权重)

关于这一块,大家可以参考:批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

因此就提出了一种折中的方法:小批量梯度下降(MBGD)
下图,为三个方法,一次训练时,使用样本量的示意图。
左边红色的大框,指的是批量梯度下降把全部的样本由于一次更新权重的训练。
左边红色的多个小框,表示随机梯度下降随机选取一个样本用于一次更新权重的训练。
蓝色的框,表示把样本分为几批(batch),每次用一批的样本来进行一次更新权重的训练。
在这里插入图片描述

3.补充知识

对卷积神经网络中术语的理解:Epoch、Batch Size和batchsize

所谓
Epoch:1个epoch等于使用训练集中的全部样本训练一次,通俗的讲几次epoch就是整个数据集被轮几次

Batch Size:全部数据是分批来训练的,批的大小称为Batch Size

iteration:1个iteration等于使用batchsize个样本训练一次,也就是说训练一批的样本,称为一次迭代

比如训练集有500个样本,batchsize = 10 ,那么训练完整个样本集:iteration=50,epoch=1.

batch: 深度学习每一次参数的更新所需要损失函数并不是由一个数据获得的,而是由一组数据加权得到的,这一组数据的数量就是batchsize。

batchsize最大是样本总数N,此时就是Full batch learning;最小是1,即每次只训练一个样本,这就是在线学习(Online Learning)。当我们分批学习时,每次使用过全部训练数据完成一次Forword运算以及一次BP运算,成为完成了一次epoch。

参考:

1.批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

  • 111
    点赞
  • 441
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
在 PyTorch ,可以通过在模型的输入层设置 `batch_size` 参数来指定每个 mini-batch 的样本数目。具体来说,如果你要处理的数据集包含 `n` 个样本,可以将数据集分成若干个大小为 `batch_size` 的 mini-batch。然后,在对模型进行训练或测试时,可以依次将每个 mini-batch 作为输入,对模型进行训练或测试。 在 PyTorch ,可以通过以下两种方式设置模型的 `batch_size` 参数: 1. 在定义数据加载器时,通过 `batch_size` 参数指定: ```python from torch.utils.data import DataLoader # 假设 dataset 是一个数据集,batch_size 是每个 mini-batch 的样本数目 dataloader = DataLoader(dataset, batch_size=batch_size) ``` 在这种方式,可以使用 PyTorch 提供的 `DataLoader` 类来定义数据加载器,并通过 `batch_size` 参数来指定每个 mini-batch 的样本数目。在训练或测试模型时,可以依次遍历每个 mini-batch,并将其作为模型的输入。 2. 在定义模型时,通过输入层的 `batch_size` 参数指定: ```python import torch.nn as nn # 假设 input_size 是输入层的大小,batch_size 是每个 mini-batch 的样本数目 model = nn.Sequential( nn.Linear(input_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, output_size), ).to(device) model.batch_size = batch_size ``` 在这种方式,可以在定义模型时,通过输入层的 `batch_size` 参数来指定每个 mini-batch 的样本数目。具体来说,可以在模型初始化之后,将 `batch_size` 参数设置为模型的属性,并在训练或测试模型时,将输入数据的第一个维度设置为 `batch_size`,即: ```python # 假设 x 是一个大小为 (batch_size, input_size) 的输入数据 x = torch.randn(batch_size, input_size).to(device) output = model(x) ``` 在这个示例,我们首先定义了一个包含两个线性层和一个 ReLU 激活函数的神经网络模型,然后将其 `batch_size` 参数设置为 `batch_size`。在训练或测试模型时,我们将输入数据的第一个维度设置为 `batch_size`,并将其作为模型的输入。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做个好男人!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值