泛化性乱弹:从随机噪声、梯度惩罚到虚拟对抗训练

 

©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 的二阶导数,再加上梯度下降,那么就一共要算三阶导数,这是现有深度学习框架难以高效实现的。

转移目标

直接化简   的积分是行不通了,但我们还可以试试将优化目标换成:

也就是变成同时缩小 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值