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

来源:未知 时间:2020-07-05 03:03:37 字体:[ ]

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

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

迁移现在标

直接化简 的积分是走不通了,但吾们还能够试试将优化现在标换成:

也就是变成同时缩短 、 的差距,两者双管齐下,必定水平上也能达到缩短 差距的现在标。关键的是,这个现在标能得到更有有趣的效果。

思路解析

用数学的话来讲,倘若 l 是某栽形态的距离度量,那么按照三角不等式就有:

倘若 l 不是度量,那么清淡按照詹森不等式也能得到一个相通的效果,比如 ,那么吾们有:

这也就是说,现在标 (7)(的若干倍)能够认为是 的上界,原首现在标不大益优化,于是吾们改为优化它的上界。

仔细到,现在标 (7)的两项之中, 衡量了模型自己的光滑水平,跟标签能够,用无标签数据也能够对它进走优化,这意味着它能够跟带标签的数据一首,组成一个 半监督学习流程。

果敢地算

对于现在标 (7)来说,它的积分效果是:

照样老路子,近似睁开 :

很恐怖?不发急,吾们回顾一下,行为 loss 函数的 l,它清淡会有如下几个特点:

1. l是光滑的;

2. l(x, x)=0;

3.

这其实就是说 l 是光滑的,并且在 x=y 的时候取到极(幼)值,且极(幼)值为 0,这几个特点几乎是一切 loss 的共性了。基于这几个特点,恐怖的 (11) 式的前三项就直接为 0 了,于是末了的积分效果是:

梯度责罚

望上去照样让人有些心悸,但总比 (11)益众了。上式也是一个正则项,其特点是只包含一阶梯度项,而对于特定的亏损函数, 能够挑前算出来,吾们记为 ,那么:

这其实就是对每个 f(x) 的每个分量都算一个梯度责罚项 ,然后按 添权乞降。

对于 MSE 来说, ,这时候能够算得 ,于是对答的正则项为 ;对于 KL 散度来说, ,这时候 ,那么对答的正则项为 。

这些效果行家众众少少能够从著名的“花书”《深度学习》[1] 中找到相通的,于是并不是什么新的效果。相通的推导还能够参考文献 Training with noise is equivalent to Tikhonov regularization[2]。

采样近似

自然,固然能求出只带有一阶梯度的正则项 ,但原形上这个计算量也不矮,由于必要对每个 都请求梯度,倘若输出的分量数太大,这个计算量照样难以承受。

这时候能够考虑的方案是始末采样近似计算:倘若 是均值为 0、方差为 1 的分布,那么吾们有:

如许一来,每步吾们只必要算 的梯度,常见问题不必要算众次梯度。 的一个最浅易的取法是空间为 的均匀分布,也就是 等概率地从 中选取一个。

对抗训练

回顾前线的流程,吾们先是介绍了增补随机噪声这一添强泛化性能的方法,然后指出随机添噪声能够太没特异性,于是想着先把积分算出来,才有了后面推导的关于近似睁开与梯度责罚的一些效果。那么换个角度来想,倘若吾们能想办法更特异性地组织噪声信号,那么也能挑高训练效果,添强泛化性能了。

监督对抗

有监督的对抗训练,关注的是原首现在标 (3),优化的现在标是让 loss 尽能够幼,于是倘若吾们要选择更有代外性的噪声,那么答该选择能让 loss 变得更大的噪声,而:

于是让 尽能够大就意味着 要跟 同向,换言之扰动要去梯度上升倾向走,即:

这便组成了对抗训练中的 FGM 方法,之前在就已经介绍过了。

值得仔细的是,在一文中吾们也推导过,对抗训练在必定水平上也等价于去 loss 里边添入梯度责罚项 ,这又跟前一节的关于噪声积分的效果相通。这外明梯度责罚答该是通用的能挑高模型性能的方法之一。

虚拟对抗

在前线吾们挑到, 这一项不必要标签信号,因此能够用来做无监督学习,并且关于它的睁开高斯积分吾们得到了梯度责罚 (13)。

倘若沿着对抗训练的思维,吾们不去计算积分,而是去寻觅让 尽能够大的扰动噪声,这就组成了“虚拟对抗训练(VAT)”,首次出现在文章 Virtual Adversarial Training: A Regularization Method for Supervised and Semi-Supervised Learning[3]中。

基于前线对亏损函数 l 的性质的商议,吾们清新 关于 的一阶梯度为 0,于是要算对抗扰动,还必须将它睁开到二阶:

这边用 外示不必要对里边的 x 求梯度。如许一来,吾们必要解决两个题目:

1. 如何高效计算 Hessian 矩阵 ;

2. 如何求单位向量 u 使得 最大?

原形上,不难表明 u 的最优解实际上就是“ 的最大特征根对答的特征向量”,也称为“ 的主特征向量”,而要近似求主特征向量,一个走之有效的方法就是“幂迭代法 [4]”:

从一个随机向量 起程,迭代实走 。有关推导能够参考 深度学习中的Lipschitz收敛:泛化与生成模型 的“主特征根”和“幂迭代”两节。

在幂迭代中,吾们发现并不必要清新 详细值,只必要清新 的值,这能够始末差分来近似计算:

其中 是一个标量常数。按照这个近似效果,吾们就能够得到如下的 VAT 流程:

初首化向量 、标量 和 ;

迭代 r 次:

用 行为 loss 实走通例梯度消极。

实验外明清淡迭代 1 次就不错了,而倘若迭代 0 次,那么就是本文起头挑到的增补高斯噪声。这外明虚拟对抗训练就是始末 来挑高噪声的“特异性”的。

参考实现

关于对抗训练的 Keras 实现,在 对抗训练浅谈:意义、方法和思考(附Keras实现) 一文中已经给出过,这边笔者给出 Keras 下虚拟对抗训练的参考实现:

def virtual_adversarial_training(

model, embedding_name, epsilon=1, xi=10, iters=1

):

"""给模型增补虚拟对抗训练

其中model是必要增补对抗训练的keras模型,embedding_name

则是model里边Embedding层的名字。要在模型compile之后行使。

" ""

ifmodel.train_function is None: # 倘若还异国训练函数

model._make_train_function # 手动make

old_train_function = model.train_function # 备份旧的训练函数

# 查找Embedding层

foroutput inmodel.outputs:

embedding_layer = search_layer(output, embedding_name)

ifembedding_layer is not None:

break

ifembedding_layer is None:

raise Exception( 'Embedding layer not found')

# 求Embedding梯度

embeddings = embedding_layer.embeddings # Embedding矩阵

gradients = K.gradients(model.total_loss, [embeddings]) # Embedding梯度

gradients = K.zeros_like(embeddings) gradients[0] # 转为dense tensor

# 封装为函数

inputs = (

model._feed_inputs model._feed_targets model._feed_sample_weights

) # 一切输入层

model_outputs = K.function(

inputs=inputs,

outputs=model.outputs,

name= 'model_outputs',

) # 模型输出函数

embedding_gradients = K.function(

inputs=inputs,

outputs=[gradients],

name= 'embedding_gradients',

) # 模型梯度函数

def l2_normalize(x):

returnx / (np.sqrt((x**2).sum) 1e-8)

def train_function(inputs): # 重新定义训练函数

outputs = model_outputs(inputs)

inputs = inputs[:2] outputs inputs[3:]

delta1, delta2 = 0.0, np.random.randn(*K.int_shape(embeddings))

for_ inrange(iters): # 迭代求扰动

delta2 = xi * l2_normalize(delta2)

K.set_value(embeddings, K.eval(embeddings) - delta1 delta2)

delta1 = delta2

delta2 = embedding_gradients(inputs)[0] # Embedding梯度

delta2 = epsilon * l2_normalize(delta2)

K.set_value(embeddings, K.eval(embeddings) - delta1 delta2)

outputs = old_train_function(inputs) # 梯度消极

K.set_value(embeddings, K.eval(embeddings) - delta2) # 删除扰动

returnoutputs

model.train_function = train_function # 隐瞒原训练函数

# 写益函数后,启用虚拟对抗训练只必要一走代码

virtual_adversarial_training(model_vat, 'Embedding-Token')

完善的行使脚本请参考:

https://github.com/bojone/bert4keras/blob/master/examples/task_sentiment_virtual_adversarial_training.py

也许是将模型竖立两次,一个模型始末标注数据平常训练,一个模型始末无标注数据虚拟对抗训练,两者交替实走, 请读懂源码后再行使,不要乱套代码。实验义务为情况分类,大约有 2 万的标注数据,取前 200 个行为标注样本,剩下的行为无标注数据,VAT 和非 VAT 的外现对比如下(每个实验都重复了三次,取平均):

文章幼结

本文先介绍了增补随机噪声这一通例的正则化方法,然后始末近似睁开与积分的过程,推导了它与梯度责罚之间的有关,并从中引出了能够用于半监督训练的模型光滑亏损,接着进一步有关到了监督式的对抗训练和半监督的虚拟对抗训练,末了给出了 Keras 下虚拟对抗训练的实现和例子。

参考链接

[1] https://book.douban.com/subject/27087503/

[2] https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/bishop-tikhonov-nc-95.pdf

[3] https://arxiv.org/abs/1704.03976

[4] https://en.wikipedia.org/wiki/Power_iteration

• 稿件确系幼我 原创作品,来稿需注解作者幼我新闻(姓名 私塾/做事单位 学历/职位 钻研倾向)

• PaperWeekly 默认每篇文章都是首发,均会增补“原创”标志

  新浪港股讯,中国眼科医药平台公司欧康维视生物(01477)今日起至本周五(3日)招股,个别影子股炒起,希玛眼科(03309)现价升7.75%,报6.670元;成交约2700万股,涉资1.79亿元.然而,德视佳(01846)报5.260元跌4.54%。

  李鬼“中城证券”背后是谁?或隐现ST步森实控人

在上一篇帖子中,我的奕歌已经换完了轮毂和AT胎,在外形方面算是基本完成了。而今天我就要对奕歌进行一次“大手术”了,给它装上一套SUV的灵魂物件,那就是绞盘。

周二(6月23日)欧市盘中,在美元大跌之际,金价持续上攻,最高升至1769.21美元/盎司,逼近1770关口,且创下七年多的新高。美元大幅下滑提振了金价,此外对疫情的担忧和通胀的影响也给黄金带来了支撑。

从日线图来看,日图显示,黄金显示突破了近两个月区间顶部(1745-50区域),可能为进一步上涨打开空间,往上将看向1765以及1800。目前1745-1750区域已经转化为支持,或将限制金价回调空间,但是若下破可能意味走势将重回区间,下方初步支撑关注1720。

原标题:维生素D多大开始吃?吃到几岁最好?

相关新闻

热门新闻

随机新闻

友情链接及相关站点

Powered by 泸州漪丽医疗器械有限公司 @2018 RSS地图 html地图

Copyright 站群 © 2013-2018 版权所有