R-Drop: Regularized Dropout for Neural Networks 论文笔记(介绍,模型结构介绍、代码、拓展KL散度等知识)

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: R-Drop: Regularized Dropout for Neural Networks 论文笔记(介绍,模型结构介绍、代码、拓展KL散度等知识)

前言


R-Drop——神经网络的正则化DropOut


一、摘要


摘要:Dropout是一种强大且广泛应用的深度神经网络的调整训练的技术。尽管效果很好,但由于Dropout所带来的随机性导致了训练和实际之间的不一致性。在本文中,我们引入了一种简单的一致性训练策略来正则化dropout,即R-Drop,它强制dropout生成的不同子模型的输出分布彼此一致。具体来说,对于每个训练样本,R-Drop最小化dropout采样的两个子模型输出分布之间的双向kl -散度。理论分析表明,R-Drop降低了上述不一致性。(有关于KL散度请查看文章末尾附录介绍,有关于DropOut的详细介绍请看下方链接)

Dropout的深入理解(基础介绍、模型描述、原理深入、代码实现以及变种)


二、R-Drop介绍


背景:在训练神经网络的过程中,过拟合时有发生,DropOut技术可以解决过拟合问题并且提高模型的泛化能力,但是DropOut的随机性导致了训练和实际应用中模型的不一致性。(即训练阶段采用随机删除单元的方法,而在实际应用的过程中采用的是不删除任何单元的完整模型)本论文中介绍了一种简单的方法来正则化由DropOut引起的不一致性,称为R-Drop。


定义:R-Drop通过最小化两个分布之间的双向KL散度,来使得同一份数据的两个子模型输出的两个分布保持一致。与传统的神经网络训练中的DropOut策略相比,R-Drop只是增加了一个没有任何结构改变的kl散度损失。


整体框架结构:R-Drop的总体框架如下,以Transformer为例,左图显示了一个输入x将遍历模型两次,得到两个分布p1和p2,右图显示了dropout产生的两个不同的子模型。(如图右侧所示,输出预测分布P1和输出分布P2在各层删除的单元各不相同,因此,对于同一输入数据对(x i , y i , P1和P2的分布是不同的,我们的R-Drop方法试图通过最小化同一样本这两个输出分布之间的双向KL散度来正则化模型预测)。


448eff4108a64578903ad06a45585e88.png




三、R-Drop公式详解


训练的数据对集合:n为训练样本的个数,(x i ,y i )代表数据对,例如在自然语言处理中,x代表源语言,y代表目标语言。


image.png


模型预测的分布: P1和P2


image.png

分布P1和P2的KL散度


image.png

输出分布P1和P2的双向KL散度


image.png

对数似然损失函数


image.png


对于数据对集合image.png训练的目标是最小化函数: 其中α为控制双向KL散度目标函数的系数。


image.pngimage.png

四、R-Drop计算流程


  • 训练数据对集合D = image.png
  • 得到模型参数w
  • 使用参数w来初始化模型
  • 如果没有收敛,则以下步骤循环执行:


  • 随机抽样数据对 ( x i , y i )
  • 重复输入 数据两次,并且得到两个输出分布
  • 计算对数似然损失函数
  • 计算双向KL散度
  • 通过最小化函数 L i 来更新模型参数。

附录0:代码

import torch.nn.functional as F
# define your task model, which outputs the classifier logits
model = TaskModel()
def compute_kl_loss(self, p, q, pad_mask=None):
    p_loss = F.kl_div(F.log_softmax(p, dim=-1), F.softmax(q, dim=-1), reduction='none')
    q_loss = F.kl_div(F.log_softmax(q, dim=-1), F.softmax(p, dim=-1), reduction='none')
    # pad_mask is for seq-level tasks
    if pad_mask is not None:
        p_loss.masked_fill_(pad_mask, 0.)
        q_loss.masked_fill_(pad_mask, 0.)
    # You can choose whether to use function "sum" and "mean" depending on your task
    p_loss = p_loss.sum()
    q_loss = q_loss.sum()
    loss = (p_loss + q_loss) / 2
    return loss
# keep dropout and forward twice
logits = model(x)
logits2 = model(x)
# cross entropy loss for classifier
ce_loss = 0.5 * (cross_entropy_loss(logits, label) + cross_entropy_loss(logits2, label))
kl_loss = compute_kl_loss(logits, logits2)
# carefully choose hyper-parameters
loss = ce_loss + α * kl_loss


附录一:熵以及信息熵


:用于描述不确定性,表示系统混乱的程度,越整齐熵也就越小,越混乱不确定的程度越大,熵也就越大,因此整个环境会自发的朝着混乱的方向发展,也就是熵增原理。


信息熵含义:信息熵表示随机变量不确定的程度。一件事情发生的概率越高,那么他的确定性也就越大,那么它的熵也就越小。信息熵常常被作为一个系统的信息含量的量化指标。


性质:信息熵非负。当一件事发生的概率为1时,信息就没有不确定,那么它的熵就是0。

公式:p(x)代表的是事件x发生的概率。


image.png


总结:那些接近确定性的分布(输出几乎可以确定)具有较低的熵,那些接近均匀分布的概率分布具有较高的熵。


附录二:KL散度(相对熵)


定义:在机器学习领域,KL散度用来度量两个函数(概率分布)的相似程度或者相近程度,是用来描述两个概率分布差异的一种方法,也叫做相对熵。也就是说KL散度可以作为一种损失,来计算两者之间的概率差异。

公式


image.png


性质

  • KL散度的值始终>=0,当且仅当P(x)=Q(x)时等号成立。
  • KL散度并不是一个对称量,KL(p||q)不等于KL(q||p)

双向KL散度定义:通过交换这两种分布的位置以间接使用整体对称的KL散度。


image.png


附录三:JS散度


定义:KL散度是不对称的,训练神经网络会因为不同的顺序造成不一样的训练结果,为了克服这个问题,提出了JS散度。


image.png

性质

  • JS散度的值域范围是[0,1],相同为0,相反则为1,相比于KL,对相似度的判断更加准确了。
  • JS散度是一个对称量,JS(p||q)等于JS(q||p), 对称可以让散度度量更加准确,下边是证明代码。


import numpy as np
import math
# 离散随机变量的KL散度和JS散度的计算方法
def KL(p, q):
    # p,q为两个list,里面存着对应的取值的概率,整个list相加为1
    if 0 in q:
        raise ValueError
    return sum(_p * math.log(_p / _q) for (_p, _q) in zip(p, q) if _p != 0)
def JS(p, q):
    M = [0.5 * (_p + _q) for (_p, _q) in zip(p, q)]
    return 0.5 * (KL(p, M) + KL(q, M))
def exp(a, b):
    a = np.array(a, dtype=np.float32)
    b = np.array(b, dtype=np.float32)
    a /= a.sum()
    b /= b.sum()
    print(a)
    print(b)
    print(KL(a, b))
    print(JS(a, b))
if __name__ == '__main__':
    # exp1
    print('exp1: Start')
    print(exp([1, 2, 3, 4, 5], [5, 4, 3, 2, 1]))
    print('exp1: End')
    # exp2
    # 把公式中的第二个分布做修改,假设这个分布中有某个值的取值非常小,就有可能增加两个分布的散度值
    print('exp2: Start')
    print(exp([1, 2, 3, 4, 5], [1e-12, 4, 3, 2, 1]))
    print(exp([1, 2, 3, 4, 5], [5, 4, 3, 2, 1e-12]))
    print('exp2: End')
    # exp3
    print('exp3: Start')
    print(exp([1e-12,2,3,4,5],[5,4,3,2,1]))
    print(exp([1,2,3,4,1e-12],[5,4,3,2,1]))
    print('exp3: End')


输出

exp1: Start
[0.06666667 0.13333334 0.2 0.26666668 0.33333334]
[0.33333334 0.26666668 0.2 0.13333334 0.06666667]

0.5216030835963031

0.11968758856917597

None

exp1: End

exp2: Start

[0.06666667 0.13333334 0.2 0.26666668 0.33333334]

[1.e-13 4.e-01 3.e-01 2.e-01 1.e-01]

2.065502018456509

0.0985487692550548

None

[0.06666667 0.13333334 0.2 0.26666668 0.33333334]

[3.5714287e-01 2.8571430e-01 2.1428572e-01 1.4285715e-01 7.1428574e-14]

9.662950847122168

0.19399530008415986

None

exp2: End

exp3: Start

[7.1428574e-14 1.4285715e-01 2.1428572e-01 2.8571430e-01 3.5714287e-01]

[0.33333334 0.26666668 0.2 0.13333334 0.06666667]

0.7428131560123377

0.19399530008415986

None

[1.e-01 2.e-01 3.e-01 4.e-01 1.e-13]

[0.33333334 0.26666668 0.2 0.13333334 0.06666667]

0.38315075574389773

0.0985487692550548

None

exp3: End


  • 将第一个实验与第二个实验做对比,可以看出KL散度的波动比较大,而JS的波动相对小。
  • 如果将第二个实验和第三个实验做对比,可以发现KL散度在衡量两个分布的差异时具有很大的不对称性。如果后面的分布在某一个值上缺失,就会得到很大的散度值;但是如果前面的分布在某一个值上缺失,最终的KL散度并没有太大的波动。这个demo可以清楚地看出KL不对称性带来的一些小问题,而JS具有对称性,所以第二个实验和第三个实验的JS散度实际上是距离相等的分布组。


附录四:互信息


定义:互信息衡量的是两种度量间相互关联的程度,极端一点来理解,如果X,Y相互独立,那么互信息为0,因为两者不相关;而如果X,Y相互的关系确定(比如Y是X的函数),那么此时X,Y是“完全关联的”。

公式

image.png

参考文章:

原文github代码地址.

论文地址.

信息熵:什么是信息熵?

某乎:信息熵是什么?

信息熵的简单理解

信息熵?互信息?KL散度?

交叉熵损失函数(Cross Entropy Loss)

KL散度与JS散度

互联网各大公司职级和薪资一览

《论文阅读》R-Drop:Regularized Dropout for Neural Network

机器学习:Kullback-Leibler Divergence(KL散度)以及R-dropout函数的通俗讲解

初学机器学习:直观解读KL散度的数学概念


总结


不太好理解,泪目。🤷‍♂️

相关文章
|
机器学习/深度学习 PyTorch Go
YOLOv5的Tricks | 【Trick4】参数重结构化(融合Conv+BatchNorm2d)
这篇文章是想要记录yolov5在模型搭建过程中的一个融合模块,就是把卷积与批归一化的参数进行融合,想卷积带有批归一化的性质,使得推理过程中可以加快模型推理速度,简化整个模型结构,实现训练与推理两个阶段的解耦。
928 0
YOLOv5的Tricks | 【Trick4】参数重结构化(融合Conv+BatchNorm2d)
|
6月前
|
机器学习/深度学习 并行计算 算法
YOLOv8改进 | 卷积篇 |手把手教你添加动态蛇形卷积(Dynamic Snake Convolution)
YOLOv8改进 | 卷积篇 |手把手教你添加动态蛇形卷积(Dynamic Snake Convolution)
667 0
|
4月前
|
机器学习/深度学习 Serverless 计算机视觉
【YOLOv8改进 - 注意力机制】Sea_Attention: Squeeze-enhanced Axial Attention,结合全局语义提取和局部细节增强
【YOLOv8改进 - 注意力机制】Sea_Attention: Squeeze-enhanced Axial Attention,结合全局语义提取和局部细节增强
|
14天前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】EMA(Efficient Multi-Scale Attention):基于跨空间学习的高效多尺度注意力
【YOLOv11改进 - 注意力机制】EMA(Efficient Multi-Scale Attention):基于跨空间学习的高效多尺度注意力.EMA(Efficient Multi-Scale Attention)模块是一种高效多尺度注意力机制,旨在提高计算机视觉任务中的特征表示效果。该模块通过结合通道和空间信息、采用多尺度并行子网络结构以及优化坐标注意力机制,实现了更高效和有效的特征表示。EMA模块在图像分类和目标检测任务中表现出色,使用CIFAR-100、ImageNet-1k、MS COCO和VisDrone2019等数据集进行了广泛测试。
【YOLOv11改进 - 注意力机制】EMA(Efficient Multi-Scale Attention):基于跨空间学习的高效多尺度注意力
|
3月前
|
机器学习/深度学习 人工智能 数据可视化
【2020-2024持续更新】Echo State Network和储层计算论文汇总!包括经典ESN、DeepESN、组合ESN和综述!
本文汇总了2020至2024年间关于Echo State Network(ESN)和储层计算的研究成果,包括综述、不同模型分类(经典ESN、DeepESN、组合ESN)、开源论文、储层计算相关研究以及ESN在各个领域的应用情况。
52 0
|
5月前
|
机器学习/深度学习 计算机视觉 知识图谱
【YOLOv8改进】ACmix(Mixed Self-Attention and Convolution) (论文笔记+引入代码)
YOLO目标检测专栏探讨了YOLO的改进,包括卷积和自注意力机制的创新结合。研究发现两者在计算上存在关联,卷积可分解为1×1卷积,自注意力也可视为1×1卷积的变形。由此提出ACmix模型,它整合两种范式,降低计算开销,同时提升图像识别和下游任务的性能。ACmix优化了移位操作,采用模块化设计,实现两种技术优势的高效融合。代码和预训练模型可在相关GitHub和MindSpore模型库找到。 yolov8中引入了ACmix模块,详细配置参见指定链接。
|
5月前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】EMA(Efficient Multi-Scale Attention):基于跨空间学习的高效多尺度注意力 (论文笔记+引入代码)
YOLO目标检测专栏介绍了创新的多尺度注意力模块EMA,它强化通道和空间信息处理,同时降低计算负担。EMA模块通过通道重塑和并行子网络优化特征表示,增强长距离依赖建模,在保持效率的同时提升模型性能。适用于图像分类和目标检测任务,尤其在YOLOv8中表现出色。代码实现和详细配置可在文中链接找到。
|
5月前
|
机器学习/深度学习 测试技术 计算机视觉
【YOLOv8改进】DAT(Deformable Attention):可变性注意力 (论文笔记+引入代码)
YOLO目标检测创新改进与实战案例专栏探讨了YOLO的有效改进,包括卷积、主干、注意力和检测头等机制的创新,以及目标检测分割项目的实践。专栏介绍了Deformable Attention Transformer,它解决了Transformer全局感受野带来的问题,通过数据依赖的位置选择、灵活的偏移学习和全局键共享,聚焦相关区域并捕获更多特征。模型在多个基准测试中表现优秀,代码可在GitHub获取。此外,文章还展示了如何在YOLOv8中应用Deformable Attention。
|
5月前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】 ODConv(Omni-Dimensional Dynamic Convolution):全维度动态卷积
ODConv是一种增强型动态卷积方法,通过多维注意力机制在卷积的四个维度上学习互补注意力,提升轻量级CNN准确性和效率。与现有动态卷积不同,ODConv覆盖了空间、输入/输出通道和核数维度。在ImageNet和MS-COCO上,对MobileNetV2|ResNet等模型有显著性能提升,减少参数的同时超越传统方法。代码和论文链接可用。在YOLO系列中,ODConv改进了特征学习,优化了目标检测性能。
|
数据可视化 计算机视觉
Backbone | What?没有Normalize也可以起飞?全新Backbone之NF-ResNet(文末获取论文与源码)
Backbone | What?没有Normalize也可以起飞?全新Backbone之NF-ResNet(文末获取论文与源码)
90 1

热门文章

最新文章