三、 mini-batch
机器学习算法和一般最优化算法不同的一点:机器学习算法的目标函数通常可以分解为每个训练样本上的损失函数的求和。如: 。
最大化这个总和,等价于最大化训练集在经验分布上的期望:
当使用基于梯度的优化算法求解时,需要用到梯度:
这个梯度本质上也是一个期望,要准确的求解这个期望的计算量非常大,因为需要计算整个数据集上的每一个样本。
实践中,可以从数据集中随机采样少量的样本,然后计算这些样本上的梯度的均值,将这个均值作为该期望的一个估计。
使用小批量样本来估计梯度的原因:
使用更多样本来估计梯度的方法的收益是低于线性的。
独立同分布的 个样本的均值 是个随机变量,其标准差为 ,其中 为样本的真实标准差。
如果能够快速计算出梯度的估计值(而不是费时地计算准确值),则大多数优化算法会更快收敛。
大多数优化算法基于梯度下降,如果每一步中计算梯度的时间大大缩短,则它们会更快收敛。
训练集存在冗余。
实践中可能发现:大量样本都对梯度做出了非常相似的贡献。
最坏情况下, 训练集中的 个样本都是相同的拷贝。此时基于小批量样本估计梯度的策略也能够计算正确的梯度,但是节省了大量时间。
使用整个训练集的优化算法被称作
batch
梯度算法(或者确定性deterministic
梯度算法)。每次只使用单个样本的优化算法被称作随机
stochastic
算法(或者在线online
算法)。大多数深度学习的优化算法介于两者之间:使用一个以上、又不是采用全部的训练样本,称作
mini-batch
或者mini-batch
随机算法。当使用小批量样本来估计梯度时,由于估计的梯度往往会偏离真实的梯度,这可以视作在学习过程中加入了噪声扰动。这种扰动会带来一些正则化效果。
3.1 mini-batch 大小
mini-batch
的大小由下列因素决定:不能太大。更大的
batch
会使得训练更快,但是可能导致泛化能力下降。训练更快是因为:
更大的
batch size
只需要更少的迭代步数就可以使得训练误差收敛。因为
batch size
越大,则小批量样本来估计总体梯度越可靠,则每次参数更新沿着总体梯度的负方向的概率越大。另外,训练误差收敛速度快,并不意味着模型的泛化性能强。
更大的
batch size
可以利用大规模数据并行的优势。
泛化能力下降是因为:更大的
batch size
计算的梯度估计更精确,它带来更小的梯度噪声。此时噪声的力量太小,不足以将参数推出一个尖锐极小值的吸引区域。解决方案为:提高学习率,从而放大梯度噪声的贡献。
不能太小。因为对于多核架构来讲,太小的
batch
并不会相应地减少计算时间(考虑到多核之间的同步开销)。如果
batch
中所有样本可以并行地预处理,则内存消耗和batch
大小成正比。对于许多硬件设备来说,这就是
batch
大小的限制因素。在有些硬件上,特定大小的效果更好。
在使用
GPU
时,通常使用 2 的幂作为batch
大小。
泛化误差通常在
batch
大小为 1 时最好,但此时梯度估计值的方差非常大,因此需要非常小的学习速率以维持稳定性。如果学习速率过大,则导致步长的变化剧烈。由于需要降低学习速率,因此需要消耗更多的迭代次数来训练。虽然每一轮迭代中,计算梯度估计值的时间大幅度降低了(
batch size
为 1),但是总的运行时间还是非常大。某些算法对采样误差非常敏感,此时
mini-batch
效果较差。原因可能有两个:- 这些算法需要用到全部样本的一些精确信息,但是这些信息难以在少量样本上估计到。
- 这些算法会放大采样误差,导致误差积累越来越严重。
通常仅仅基于梯度 的更新方法相对更稳定,它能够处理更小的
batch
(如100)。如果使用了黑塞矩阵 (如需要计算 的二阶方法) 通常需要更大的
batch
(如 10000)。- 即使 被精确估计,但是它的条件数很差,那么乘以 或者 会放大之前存在的误差。这就导致 的一个非常小的变化也会导致 的一个非常大的变化。因此
batch
需要更大从而降低梯度估计的方差。 - 通常只是近似地估计 ,因此只会引入更多的误差。
- 即使 被精确估计,但是它的条件数很差,那么乘以 或者 会放大之前存在的误差。这就导致 的一个非常小的变化也会导致 的一个非常大的变化。因此
3.2 随机抽样
mini-batch
是随机抽样的也非常重要。从一组样本中计算出梯度期望的无偏估计要求:组内的样本是独立的。另外,也希望两个连续的梯度估计也是相互独立的。这要求:两个连续的
mini-batch
样本集合也应该是彼此独立的。实际应用中,采集的数据样本很可能出现这样的情况:连续的样本之间具有高度相关性。
如:统计人群的偏好,很可能连续的样本就是同一个家庭、同一个职业、同一个地域…。
解决方法是:将样本随机混洗之后存储,训练时按照混洗之后的顺序读取。
这种打乱顺序不会对
mini-batch
产生严重的影响,不打乱顺序的mini-batch
才会极大降低算法泛化能力。mini-batch
可以异步并行分布式更新:在计算mini-batch
样本集合 上梯度更新时,也可以同时计算其他mini-batch
样本集合 上的更新。
3.3 重复样本
当 都是离散时,泛化误差的期望:
其梯度为:
泛化误差的梯度的无偏估计可以通过从数据生成分布 抽取
mini-batch
样本 以及对应的标签 ,然后计算mini-batch
上的损失函数对于 的梯度:它就是 的无偏估计。
因此,
mini-batch
随机梯度下降中,只要没有重复使用样本,它就是真实泛化误差梯度的无偏估计。如果是在线学习,则每个样本或者
mini-batch
都不会重复。每次更新都是独立地从真实分布 中采样获得。如果训练集不大,通常需要多次遍历训练集,此时只有第一遍满足泛化误差的梯度的无偏估计。
后续的遍历中,泛化误差的梯度估计不再是无偏的。但是后续的遍历会减小训练误差,从而抵消了训练误差和测试误差之间
gap
的增加。最终效果是:减小了测试误差。随着数据集规模的爆炸性增长,超过了计算能力的增长速度,现在普遍地对每个样本只使用一次,甚至不完整地使用训练集。
此时过拟合不再是问题,欠拟合以及计算效率成为主要问题。