对比学习 RDrop: Regularized Dropout
关注微|信|公|众|号 包包算法笔记
背景
今天给大家讲一点轻松又有用的:5行代码实现的对比学习,效果超好!
其实我特别喜欢这类方法,足够简单明了,背后的思想也足够深刻,效果立竿见影。
嗯,听起来都像彩虹屁。
对比学习,最近比较火的一个方向,属于自监督的一种,其基本的思想是,不引入额外的标注数据,利用数据本身,在学习中的一些其他角度的监督信号,进行神经网络学习。对比学习,侧重对比两字,即数据的利用是利用样本间的对比来实现的。
加上5行代码
看看今天的主角Rdrop吧。
实现特别简单。让我说,这篇论文,放这5行代码,让大家去背后猜他的思想,也足够了。
好了,现在揭晓这5行代码。
#训练过程上下文ce = CrossEntropyLoss(reduction='none')
kld = nn.KLDivLoss(reduction='none')
logits1 = model(input)
logits2 = model(input)
#下面是训练过程中对比学习的核心实现!!!!
kl_weight = 0.5 #对比loss权重ce_loss = (ce(logits1, target) + ce(logits2, target)) / 2
kl_1 = kld(F.log_softmax(logits1, dim=-1), F.softmax(logits2, dim=-1)).sum(-1)
kl_2 = kld(F.log_softmax(logits2, dim=-1), F.softmax(logits1, dim=-1)).sum(-1)
loss = ce_loss + kl_weight * (kl_1 + kl_2) / 2
原理讲解
仔细看看,他干了一件什么事呢?
大家都知道,在训练阶段。dropout是开启的,你多次推断dropout是有随机性的。
模型如果鲁棒的话,你同一个样本,即使推断时候,开着dropout,结果也应该差不多。好了,那么它的原理也呼之欲出了。用一张图来形容就是:
图片随便你怎么踹(dropout),本AI稳如老狗。
KLD loss是衡量两个分布的距离的,所以说他就是在原始的loss上,加了一个loss,这个loss刻画了模型经过两次推断,抵抗因dropout造成扰动的能力。
后话
是不是特别简单!
Rdrop其实和美团发那个ConSERT有点像,但是,Rdrop更简单,更干净,效果也不分伯仲(其实略好。ConSERT的对其他制造扰动的实验更充分一点,虽然我觉得人家可能试过了,又去掉了,只留下这5行代码。
这种论文给人一种为什么我就没想到的感觉,是我最喜欢的一类论文。
最后,苏剑林的博客里补充了很多实验和想法。大家可以去观摩一下,在中文数据集上补充了实验验证了效果。
引用
-
Yan Y, Li R, Wang S, et al. ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer[J]. arXiv preprint arXiv:2105.11741, 2021.
-
Liang X, Wu L, Li J, et al. R-drop: regularized dropout for neural networks[J]. arXiv preprint arXiv:2106.14448, 2021.
历史精彩文章:
图片