©PaperWeekly 原创 · 作者|苏剑林
单位|追一科技
研究方向|NLP、神经网络
提高模型的泛化性能是机器学习致力追求的目标之一。常见的提高泛化性的方法主要有两种:第一种是添加噪声,比如往输入添加高斯噪声、中间层增加 Dropout 以及进来比较热门的对抗训练等,对图像进行随机平移缩放等数据扩增手段某种意义上也属于此列;第二种是往 loss 里边添加正则项,比如 , 惩罚、梯度惩罚等。本文试图探索几种常见的提高泛化性能的手段的关联。
随机噪声
我们记模型为 f(x), 为训练数据集合,l(f(x), y) 为单个样本的 loss,那么我们的优化目标是:
是 f(x) 里边的可训练参数。假如往模型输入添加噪声 ,其分布为 ,那么优化目标就变为:
当然,可以添加噪声的地方不仅仅是输入,也可以是中间层,也可以是权重 ,甚至可以是输出 y(等价于标签平滑),噪声也不一定是加上去的,比如 Dropout 是乘上去的。对于加性噪声来说, 的常见选择是均值为 0、方差固定的高斯分布;而对于乘性噪声来说,常见选择是均匀分布 U([0,1]) 或者是伯努利分布。
添加随机噪声的目的很直观,就是希望模型能学会抵御一些随机扰动,从而降低对输入或者参数的敏感性,而降低了这种敏感性,通常意味着所得到的模型不再那么依赖训练集,所以有助于提高模型泛化性能。
提高效率
添加随机噪声的方式容易实现,而且在不少情况下确实也很有效,但它有一个明显的缺点:不够“特异性”。噪声 是随机的,而不是针对 x 构建的,这意味着多数情况下 可能只是一个平凡样本,也就是没有对原模型造成比较明显的扰动,所以对泛化性能的提高帮助有限。
增加采样
从理论上来看,加入随机噪声后,单个样本的 loss 变为:
但实践上,对于每个特定的样本 (x,y),我们一般只采样一个噪声,所以并没有很好地近似上式。当然,我们可以采样多个噪声 ,然后更好地近似:
但这样相当于 batch_size 扩大为原来的 k 倍,增大了计算成本,并不是那么友好。
近似展开
一个直接的想法是,如果能事先把式 (3) 中的积分算出来,那就用不着低效率地采样了(或者相当于一次性采样无限多的噪声)。我们就往这个方向走一下试试。当然,精确的显式积分基本上是做不到的,我们可以做一下近似展开:
然后两端乘以 积分,这里假设 的各个分量是独立同分布的,并且均值为 0、方差为 ,那么积分结果就是:
这里的 是拉普拉斯算子,即 。这个结果在形式上很简单,就是相当于往 loss 里边加入正则项 ,然而实践上却相当困难,因为这意味着要算 l 的二阶导数,再加上梯度下降,那么就一共要算三阶导数,这是现有深度学习框架难以高效实现的。
转移目标
直接化简 的积分是行不通了,但我们还可以试试将优化目标换成:
也就是变成同时缩小