Dropout详解:Dropout解决过拟合问题

news2024/11/17 3:37:51

Dropout 是一种能够有效缓解过拟合的正则化技术,被广泛应用于深度神经网络当中。但是被 dropout 所丢掉的位置都有助于缓解过拟合的吗?

中山大学 和 Meta AI 在 NeurIPS 2022 接收的论文在研究了注意力中的 dropout 后发现:不同注意力位置对过拟合的作用并不一致,如果丢弃了不恰当的位置甚至会加速过拟合。基于这一发现,我们提出了一种归因驱动的 Dropout(AD-DROP),该方法选择高归因的位置进行 Drop,从而实现更具针对性的 dropout。

论文标题:

AD-DROP: Attribution-Driven Dropout for Robust Language Model Fine-Tuning

论文链接:

https://arxiv.org/abs/2210.05883

代码链接:

GitHub - TaoYang225/AD-DROP: Source code of NeurIPS 2022 accepted paper "AD-DROP: Attribution-Driven Dropout for Robust Language Model Fine-Tuning"

介绍

本文涉及两个方面的背景知识:1)Dropout;2)归因分析(Attribution)。

  • Dropout [1]:原始的 dropout 以一定的概率随机地从网络中选取部分神经元丢弃,使得神经元之间不能协同适应,从而提升网络的泛化性能,达到缓解过拟合的目的。在 dropout 的基础上,衍生了许多变体,如:Concrete Dropout,DropBlock,AutoDropout,Mixout,R-Drop 等。但是许多的工作都遵循了 dropout 的固有模式,即以一定的采样概率随机地采样子结构进行丢弃。

  • Attribution [2]:归因是一种可解释的方法,旨在将模型的输出归结到输入特征上,为输入特征分配不同的分数,以衡量不同输入特征对模型最终预测的贡献程度。常见的归因方法包括基于扰动的 [3]、基于注意力的 [4]、基于梯度的。其中基于梯度的方法又包括:梯度本身 [5]、输入乘梯度 [6] 、积分梯度 [7] 等。

虽然随机采样的 dropout 被证明是一种能够有效缓解过拟合的手段,但是现有的工作缺乏深入地探究这些所丢弃的 units 对缓解过拟合的作用。在这项工作中,我们结合自注意力归因 [8] 来尝试研究这一问题。

前置实验

自注意力归因可以为注意力位置分配不同的归因分数(代表对预测的贡献程度,通常认为归因分数越高,对预测越重要)。那么一个自然而言的想法就是:如果按归因分数的大小来丢掉注意力位置,会发生什么?因此,我们在三个数据集(MRPC/SST-2/QNLI)上做了一个实验(附录B):

1. 首先微调好一个 roberta-base 模型;

2. 然后,在验证集上,计算注意力每个位置的归因分数(注意:为了计算方便,直接采用梯度本身,而非积分梯度,实验中发现积分梯度也有一致的现象;此外,采用真实标签对应的逻辑输出进行归因。)

3. 设置不同的比例,把注意力矩阵中每一行中的位置,按“归因分数低到高/归因分数高到低”的位置通过添加 attention mask 来 drop 掉,结果如下:

在三个数据集上,观察到了几乎一致的现象:

1. 从低到高 drop,一开始模型会快速拟合标签(接近 100% 准确率),随后趋势保持平稳,最后由于丢弃掉过多的信息准确率大幅度的下降;

2. 从高到低 drop,模型性能首先快速下降,随后趋势变缓,最后由于丢弃掉过多的信息可能存在一个上升趋势。可以理解:基于真实标签的梯度归因“泄露”了标签信息,从而使得丢弃掉归因分数“低/高”的位置可以快速“拟合/远离”真实标签。这一实验恰恰说明,不同注意力位置的作用是不一致的

上述实验是基于微调好的模型做的,为了进一步验证这两种 mask 策略对模型训练的影响,我们在训练过程中也应用了两种 mask 策略,并与原始微调和随机 Dropout 比较(具体实现细节见论文 2.2 节),结果如下:

▲ MRPC中训练集与验证集的loss曲线,除红色线外,丢弃率设置为0.3

红色线代表不施加注意力的 dropout(原始微调)。绿色线为施加随机 dropout,与红色线相比,轻微缓解了过拟合,验证集的最小 loss 更低;蓝色线代表 drop 掉 30% 低归因的位置,可以看到模型快速过拟合训练集,但是在验证集上没有收敛(loss 震荡)。

黄色线代表 drop 掉 30% 高归因的位置,与红色线和绿色线相比,这种策略显著降低了模型的收敛速度,同时验证集能正常收敛,但是验证集最小 loss 要略高于红色线和绿色线(存在欠拟合)。上述实验说明:

  • 不同注意力位置对过拟合的作用并不一致,如果丢弃了不恰当的位置甚至会加速过拟合;
  • 缓解过拟合的方向是 drop 高归因的位置,但同时需要防止产生欠拟合。

方法

3.1 AD-DROP

基于上述发现,我们设计了一种新的 dropout 模式:AD-DROP(Attribution-Driven Dropout)。AD-DROP 与原生 dropout 的区别如下:

▲ 原生 dropout 与 AD-DROP 的注意力图比较,位置颜色越深代表归因分数越大,位置交叉的圆圈代表被 drop 的位置,红色框线代表高归因的候选丢弃区域(如Top-3)

原始 dropout 在每一行中随机的丢弃位置,高归因与低归因位置的丢弃率相同;而 AD-DROP 中,首先选定一个高归因分数的候选区域,然后从中再随机的 drop(施加随机的好处在于,不至于丢弃全部的高归因信息,导致缺乏必要的预测信息无法收敛)。AD-DROP 关注于 drop 高归因的区域,以达到缓解过拟合的目的,实现过程包含如下四个步骤:

▲ AD-DROP的实现步骤

  1. 在每一个 batch 中,对于输入 x ,首先经过第一次前向计算,得到模型的预测输出,将预测概率最大的类别作为伪标签
  2. 计算伪标签对应的逻辑输出对每一个注意力矩阵的梯度/积分梯度,得到归因矩阵 。
  3. 在归因矩阵中,每一行选取归因分数最高的 p 部分(比例值)作为候选丢弃区域;然后以概率为 q 的随机 dropout 应用于候选丢弃区域,产生 mask 矩阵。
  4. 进行第二次前向计算,此时加入得到的 mask 矩阵,计算出 loss 用于最终的参数更新。

这里采用伪标签进行归因的原因有两点:1)如果采用真实标签归因会泄露标签信息,并导致训练和推理不一致;2)AD-DROP 的目的是抑制模型对当前预测而言高归因位置的依赖,可能能够纠正预测错误的样本。

3.2 交叉微调

我们进一步设计了一种交叉微调(Cross-tuning)策略,以防止在应用 AD-DROP 时,高归因的位置被过度丢弃,从而提升训练的稳定性。交叉微调策略即交替执行原始的微调 epoch 与带有 AD-DROP 的 epoch。算法如下:

实验和分析

我们主要在 GLUE 基准上验证了 AD-DROP 的有效性,并做了许多的消融分析实验。

  • 总体实验结果:在验证集上,AD-DROP 在 BERT 和 RoBERTa 上平均提升了 1.98 和 1.29 个点;在测试集上,AD-DROP 在 BERT 和 RoBERTa 上平均提升了 0.87 和 0.62 个点。

  • 消融实验:对比了不同算归因的方式(梯度 GA、积分梯度 IGA、注意力 AA、随机 RA),发现梯度相关的归因要好于其他的方式;此外伪标签要好于真实标签;交叉微调要好于不加交叉微调。

  • 交叉微调的影响:在两个关键参数 p 和 q 的搜索范围 [0.1,0.9] 内,观察验证集结果的分布情况,交叉微调可以显著提升 AD-DROP 在不同参数下的有效性。

  • 参数的敏感性分析:在搜索范围内,将 AD-DROP 对比原始微调结果的差异归一化后进行可视化,发现 AD-DROP 在 BERT 上对引入的两个超参数不敏感,大部分情况下都能 work,而在 RoBERTa 上则需要仔细的参数搜索,猜测原因可能是 RoBERTa 进行了更有效地预训练,更不容易产生过拟合。

此外还做了重复性实验、数据量的影响、小样本场景、大模型的影响等。这里就不一 一详细介绍了,感兴趣的朋友请移步原文查看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/134019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++string类介绍

目录 一、介绍 二、string类对象的构造 string类有如下构造方法: 类对象的容量操作 类对象访问及遍历 string对象的修改操作: std::string::insert std::string::erase std::string::c_str std::string::find std::string::substr 一、介绍…

Linux学习笔记 超详细 0基础学习(上)

定义 linux是一个操作系统,与Windows、macos一样,是常见的操作系统之一,一般服务器会部署在Linux操作系统中,稳定应用广泛,Android系统是基于Linux内核的,所以了解Linux相关知识对于程序员来说是很重要的。…

人脸AI识别实战:用AI生成了这些人一生的样貌变化 | 附源码

这是来自斯坦福和华盛顿大学研究员发表的论文,提出了基于GAN的新方法,仅需要一张照片即可生成一个人从小时候到老了的样子。 论文:https://arxiv.org/abs/2003.09764 项目地址: https://github.com/royorel/Lifespan_Age_Trans…

windows上安装并使用exiftool修改图像exif信息

使用exiftool可以对图像的exif信息进行读取、修改、写入等操作。在linux系统上可以直接通过命令行安装,非常方便。但是在windows上,一开始我看了这篇博客,感觉里面写的还挺详细的,就跟着做了一下。里面是说要先安装perl&#xff0…

特斯拉突飞猛进背后带给自己的深思

引言 2013年开始接触汽车行业,那时候所做的事情也是跟着导师去解析整车CAN信号(Message),也是从那时才知道车身现场总线——CAN总线。在那时候汽车给自己的感觉还是整车成本所占比重是机械高,软件比重低的可怜&#x…

【目标检测】语义分割之FCN算法学习

目录:FCN一、CNN与FCN的比较二、FCN上采样理论讲解2.1 双线性插值上采样2.2 反卷积上采样2.3 反池化上采样三、FCN的过程四、跳级结构一、CNN与FCN的比较 CNN:在传统的CNN网络中,在最后的卷积层之后会连接上若干个全连接层,将卷积…

字符串去重整理 哈希映射解题

目录 给你一个字符串数组,删除他们之间相同的元素,(保留一个重复值) 【方法一】使用迭代器进行区间删除 【方法二】原地删除 【方法三】使用计数跳过 1002. 查找共用字符 【解法一】我的第一个理解题意出错的解法 【解法二】初…

稀疏矩阵向量乘法的openmp并行优化

稀疏矩阵向量乘法 添加链接描述本人在这篇博客已经介绍过稀疏矩阵向量乘法以及相关的一些存储方式,这里重点开始介绍openmp的并行优化。 下面这个图片就是采用CSR格式读取稀疏矩阵向量乘法的主体架构,全称为Compressed Sparse Row Matrix压缩稀疏矩阵行格式,该格式对矩阵进…

MyBatis【MyBatis的增删改查操作与单元测试】

MyBatis【MyBatis的增删改查操作与单元测试】🍎一.单元测试🍒1.1 什么是单元测试?🍒1.2 单元测试好处🍒1.3 Spring Boot 框架 单元测试使用🍒1.4 单元测试实现🍒1.5 断言🍎二.MyBati…

性能测试-微服务性能压测监控和调优【重点】【杭州多测师_王sir】【杭州多测师】...

本文主要内容一、何为压力测试1.1、 大白话解释性能压测是什么:就是考察当前 软件和硬件环境下,系统所能承受的最大负荷,并帮助找出系统的瓶颈所在。性能压测的目的:为了系统在线上的 处理能力和稳定性维持在一个标准范围内&#…

【MySQL】MySQL存储过程与存储函数实战(MySQL专栏启动)

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

LeetCode题解 二叉树(九):106 中序和后序遍历序列构造二叉树;105 从前序与中序遍历序列构造二叉树

下面要讲的两道题,从二叉树的角度来讲,是非常重要的,此前一直是遍历二叉树,现在就要根据数组,构造二叉树 106 从中序与后序遍历序列构造二叉树 medium 示例:中序遍历 inorder [9,3,15,20,7] 后序遍历 po…

SpringBoot做个埋点监控

JVM应用度量框架Micrometer实战 前提 spring-actuator做度量统计收集,使用Prometheus(普罗米修斯)进行数据收集,Grafana(增强ui)进行数据展示,用于监控生成环境机器的性能指标和业务数据指标。…

Three.js一学就会系列:04 炫酷3D文字

系列文章目录 Three.js一学就会系列:01 第一个3D网站 Three.js一学就会系列:02 画线 Three.js一学就会系列:03 炫酷3D划线 文章目录系列文章目录前言一、创建一个vue项目二、安装及使用安装创建一个dom元素三、核心代码讲解场景处理“雾”光…

83.【JQuery.Ajax】

Ajax(一)、Ajax简介1.什么是Ajax2.jQuery.ajax介绍(二)、环境搭建1.创建Model并添加web框架2.配置Artifacts的lib文件3.配置web框架下的web.xml4.配置spring-mvc.xml配置文件5.配置汇总文件applicationContexe.xml6.进行测试(三)、伪造Ajax1.iframe内敛框架伪造Ajax(四)、使用真…

【阶段二】Python数据分析NumPy工具使用01篇:NumPy工具介绍、NumPy工具安装与数组的创建

本篇的思维导图: NumPy工具介绍 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,这个包封装了多个可以用于数组间计算的函数供你直接调用,是一个运行速度非常快的数学库。 NumPy工具安装 代码 结果

从输入URL到渲染的过程中到底发生了什么?

CDN缓存DNSTCP三次握手、四次挥手浏览器渲染过程输入URL到页面渲染过程的一些优化 下面我将“从输入URL到渲染的全过程”大概的描述出来,再对其过程加以解释,了解过程中可以做哪些优化。文章内容有点长,需要有足够的耐心看完哟!&…

MySQL数据库高级面试题(2)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java面试题…

【自学Java】Java if else-if else语句

Java else if Java else if教程 在 Java 语言 中,关键字 if 是用于测试某个条件(布尔型 或逻辑型)的语句是否满足一定的条件,如果满足特定的条件,则会执行 if 后由大括号 {} 括起来的代码块,否则就忽略该…

利用Dlib 实现人脸68个特征点的标定

系列文章目录 文章目录系列文章目录前言1. 开发环境依赖2. 设计流程68个特征点提取:OpenCv 绘图:3. 源码OpenCv 的画图函数1. 画圆2. 写字符3.关于 颜色数组:前言 利用 Dlib 官方训练好的模型 “shape_predictor_68_face_landmarks.dat” 进…