batch、batch_size、epoch、iteration简介

本文详细解释了深度学习中三个关键超参数:batch_size、epoch 和 iteration 的含义及作用,并探讨了不同设置对模型训练的影响。

batch_size、epoch、iteration是深度学习中常见的几个超参数:

(1)batchsize:每批数据量的大小。DL通常用SGD的优化算法进行训练,也就是一次(1 个iteration)一起训练batchsize个样本,计算它们的平均损失函数值,来更新参数。

(2)iteration:1个iteration即迭代一次,也就是用batchsize个样本训练一次。

(3)epoch:1个epoch指用训练集中的全部样本训练一次,此时相当于batchsize 等于训练集的样本数。

最初训练DNN采用一次对全体训练集中的样本进行训练(即使用1个epoch),并计算一次损失函数值,来更新一次权值。当时数据集较小,该方法尚可。后来随着数据集迅速增大,导致这种方法一次开销大进而占用内存过大,速度过慢。

后来产生了一次只训练一个样本的方法(batchsize=1),称作在线学习。该方法根据每一个样本的情况更新一次权值,开销小速度快,但收到单个样本的巨大随机性,全局来看优化性能较差,收敛速度很慢,产生局部震荡,有限迭代次数内很可能无法收敛。

目前常用随机梯度下降SGD来训练,相当于上述两个“极端”方法的折中:将训练集分成多个mini_batch(即常说的batch),一次迭代训练一个minibatch(即batchsize个样本),根据该batch数据的loss更新权值。这相比于全数据集训练,相当于是在寻找最优时人为增加了一些随机噪声,来修正由局部数据得到的梯度,尽量避免因batchsize过大陷入局部最优。

这种方法存在两对矛盾。由于一次只分析的一小部分数据,因此整体优化效果与batchsize有关:

batchsize越小,一个batch中的随机性越大,越不易收敛。然而batchsize越小,速度越快,权值更新越频繁;且具有随机性,对于非凸损失函数来讲,更便于寻找全局最优。从这个角度看,收敛更快,更容易达到全局最优。

batchsize越大,越能够表征全体数据的特征,其确定的梯度下降方向越准确,(因此收敛越快),且迭代次数少,总体速度更快。然而大的batchsize相对来讲缺乏随机性,容易使梯度始终向单一方向下降,陷入局部最优;而且当batchsize增大到一定程度,再增大batchsize,一次batch产生的权值更新(即梯度下降方向)基本不变。因此理论上存在一个最合适的batchsize值,使得训练能够收敛最快或者收敛效果最好(全局最优点)。

根据现有的调参经验,加入正则化项BN后,在内存容量允许的情况下,一般来说设置一个较大的batchsize值更好,通常从128开始调整。

这里写图片描述

当然,包括超参数对网络优化的影响在内的许多关于的DL理论尚不成熟,大多处在依靠实验尝试、观察、归纳总结的阶段。
文章如有明显错误,恳请及时批评指正。

### 关于Batch SizeIterationEpoch的概念及其相互关系 #### Batch Size 的定义 在机器学习尤其是深度学习领域内,`batch_size`指的是每次梯度下降过程中所使用的样本数量。由于现代计算资源的强大支持,几乎所有的梯度下降都采用的是基于小批量(mini-batch)的方式来进行优化[^1]。 #### Iteration (迭代次数) 定义 对于每一次完整的前向传播(forward propagation)+反向传播(backpropagation),即完成了一次权重更新操作,则称为一次iteration(迭代)[^4]。具体来说,在每一轮迭代中会使用指定大小(`batch_size`)的数据集子集来调整模型参数。 #### Epoch 定义 而当整个训练集中所有样例都被用来参与过至少一次的学习过程之后(无论分为多少轮迭代),就构成一个epoch。换句话说,经过一个epoch意味着遍历了全部训练数据并进行了相应的参数更新动作[^3]。 #### 各变量间的关系描述 假设有一个含有N条记录的数据集用于训练某个神经网络模型: - 如果设定 `batch_size=N` ,那么每次都会利用全量数据做梯度估计,此时仅需执行单次迭代即可结束一个epoch; - 若设定了较小的`batch_size=n<N`, 则需要进行 \(\frac{N}{n}\) 轮迭代才能覆盖到整批数据从而形成一个epoch; - 当然也可以通过增加总的epoch数目让训练更加充分,直到达到预期性能指标为止。 ```python import numpy as np def calculate_iterations_per_epoch(dataset_size, batch_size): """ 计算每个epoch内的迭代次数 """ return int(np.ceil(dataset_size / float(batch_size))) dataset_size = 1000 # 数据集规模 batch_sizes = [16, 32, 64] for bs in batch_sizes: iterations = calculate_iterations_per_epoch(dataset_size, bs) print(f'With a batch size of {bs}, there will be approximately {iterations} iterations per epoch.') ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值