微调预训练模型的新姿势——自集成和自蒸馏_自蒸馏robust微调_郝伟博士的博客-程序员宅基地

技术标签: 自然语言处理  


转载来源:https://zhuanlan.zhihu.com/p/133804801

论文:Improving BERT Fine-Tuning via Self-Ensemble and Self-Distillation
链接:https://arxiv.org/abs/2002.10345
作者:Yige Xu, Xipeng Qiu, Ligao Zhou, Xuanjing Huang

本文提出了一种自集成和自蒸馏的fine-tuning方法,在不引入外部资源和不显著增加训练时间的前提下,可以进一步增强fine-tuning的效果。
alt
自蒸馏的前世今生——what、why、how?

1、什么是自蒸馏?

知识蒸馏(Knowledge Distillation)指的是将预训练好的教师模型(Teacher Model)的知识通过蒸馏的方式迁移到学生模型(Student Model)。自蒸馏(Self-Distillation)则指的是自己蒸馏到自己,Teacher Model就是Student Model的集成版本,称为自集成(Self-Ensemble)。集成模型在是刷榜利器,因此我们希望在训练过程中不同time step的模型也可以集成。为了不增加训练开销,我们选择一种参数平均的方式来进行自集成。

与同期的工作FastBERT的自蒸馏(高层蒸馏到底层)不同,本文的自蒸馏指的是过去time step蒸馏到当前time step。在Fine-tune过程中,目标函数除了有来自标签的监督信号以外,还有来自过去time step的监督信号。本文的自蒸馏是为了进一步提高准确率而不是模型压缩。

2、为什么要自蒸馏?

I. 在一般的Fine-tune流程当中,我们通常只关注某一个epoch结束之后的模型参数,而不关心在Fine-tune过程中某个time step的参数。那么Fine-tune的中间过程是否有什么值得我们挖掘的信息呢?

II. 在一般的训练过程当中,我们通常将数据集划分成一个个mini-batch,依次通过模型进行训练。如果某一个mini-batch的数据质量不过关,可能会将模型参数带歪,因此是否可以寻找一种方式来减缓“带歪”的趋势呢?

III.好的teacher可以教出更好的学生,而好的学生可以进一步集成为更好的教师,通过迭代可以进行自我增强。

3、如何进行自蒸馏?

在本文中,我们提出了两种自蒸馏的方式:Self-Distillation-Averaged(SDA)和Self-Distillation-Voted(SDV)。在SDA中,我们首先计算出过去K个time step参数的平均值作为Teacher Model。在SDV中,我们将过去K个time step的参数视为K个Teacher Model。

SDA的目标函数计算方式如下:
£ θ ( x , y ) = C E ( B E R T ( x , θ ) , y ) + λ M S E ( B E R T ( x , θ ) , B E R T ( x , θ ˉ ) ) \pounds _{\theta }(x,y)=CE(BERT(x,\theta ),y)+\lambda MSE(BERT(x,\theta ),BERT(x,\bar{\theta})) £θ(x,y)=CE(BERT(x,θ),y)+λMSE(BERT(x,θ),BERT(x,θˉ))
其中 θ ˉ = 1 K ∑ k = 1 K θ t − k \bar{\theta} = \frac{1}{K}\sum_{k=1}^{K}\theta_{t-k} θˉ=K1k=1Kθtk
SDV的目标函数计算方式如下:
£ θ ( x , y ) = C E ( B E R T ( x , θ ) , y ) + λ M S E ( B E R T ( x , θ ) , 1 K ∑ k = 1 K B E R T ( x , θ t − k ) ) \pounds _{\theta }(x,y)=CE(BERT(x,\theta ),y)+\lambda MSE(BERT(x,\theta ),\frac{1}{K}\sum_{k=1}^{K}BERT(x,\theta_{t-k})) £θ(x,y)=CE(BERT(x,θ),y)+λMSE(BERT(x,θ),K1k=1KBERT(x,θtk))

4、通过自蒸馏我们可以得到什么?

更稳定的训练过程

我们在SNLI数据集当中随机抽取了1500条训练数据组成一个迷你训练集。不改变模型参数初始化,只改变数据训练顺序。通过在这个迷你训练集上的实验,我们发现SDA和SDV加持下的训练更为稳定,准确率的均值更高、方差更低。

alt

更高的准确率

在SDA和SDV加持下,可以有效提升在下游任务Fine-tune BERT的性能。
alt

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43145361/article/details/106630873

智能推荐

github版本库使用详细教程(命令行及图形界面版)_github图形化界面的方式来创建本地仓库-程序员宅基地

目录[-]教程【一】教程【二】教程【三】教程【四】教程【五】教程【六】Git是一个分布式的版本控制系统,作为开源代码库以及版本控制系统,Github目前拥有140多万开发者用户。随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法。Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作L_github图形化界面的方式来创建本地仓库

HTML列表项_列表项是什么意思-程序员宅基地

有序无序列表无序列表coffeeteamilk有序列表coffee tea milk自定义列表 coffee -black hot drink milk -white cold drink 自定义起始选项 app bann_列表项是什么意思

C++ 如何删除string最后一个字符_c++ string去掉最后一个字符-程序员宅基地

#include<iostream>#include<string>using namespace std;int main() { string str; str = "123456"; cout << str << endl; //方法一:使用substr() str = str.substr(0, str.length(..._c++ string去掉最后一个字符

Android知识点收集-程序员宅基地

View篇ViewPager使用PagerAdapter的notifyDataSetChanged()方法,不会立即触发ViewPager.PageTransformer的动画效果,必须在滑动后才会触发。_android知识点

JUnit单元测试中的setUpBeforeClass()、tearDownAfterClass()、setUp()、tearDown()方法小结-程序员宅基地

这几天做Junit测试接触到了setup和teardown两个方法,简单的可以这样理解它们,setup主要实现测试前的初始化工作,而teardown则主要实现测试完成后的垃圾回收等工作。 需要注意的是Junit3中每个测试方法执行时都会执行它们,而不是一个类中执行一次,查了查资料,JUnit4版本采用注解的方式可以实现一个类只执行一次,下面看看测试代码:jar下载地址:

java中关于删除文件夹中固定大小的文件和空文件夹_java删除本地文件,判断文件夹是否为空_墨本无岸的博客-程序员宅基地

比如:删除给定文件夹下所有大于2M的文件,如果文件夹下的子文件或者子文件夹被删除完毕了,也将该文件夹删除public class IODemo{ public static void main(String[] args) { File file = new File("E:\\itcast");//给定的文件夹 deleteDir(file); } private static void deleteDir(File file) {..._java删除本地文件,判断文件夹是否为空

随便推点

IDEA 代码分析工具_idea analyze-程序员宅基地

IDEA 代码分析功能分析工具使用步骤总结分析工具使用步骤1) 打开 Analyze->Inspect Code.2)选择分析范围,如下图所示。3)分析结果如下4)以我项目的情况,我一般只关注 java里面的问题。展开折叠内容,可以一个一个查查,一些类型是可以全部处理。比如1:接口方法定义成public类型的。2:定义了变量从未使用的。具体情况具体分析吧。总结感觉..._idea analyze

批处理的注释:批处理程序中的多行注释方法_批处理注释多行-程序员宅基地

在批处理中,段注释(多行注释)有一种比较常用的方法,即使用goto跳过:goto start= 可以是多行文本,可以是命令= 可以包含重定向符号和其他特殊字符= 只要不包含 :start 这一行,就都是注释:start其他各种注释形式有如:1、:: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符)2、rem 注释内容(不能出现重定向符号和管道符号)3、echo 注释内..._批处理注释多行

Asp.Net Core API网关Ocelot_asp.net core ocelot-程序员宅基地

首先,让我们简单了解下什么是API网关? API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。 API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。..._asp.net core ocelot

FreeRTOS开发实战_队列管理_对freertos进一步封装-程序员宅基地

队列管理在FreeRTOS各个任务之间可能会进行相互通信,而在FreeRTOS中所有通信和同步的机制都是基于队列来实现的。本小结主要说明一下问题: 如何创建一个队列。 队列如何管理其数据。 如何像队列发送数据。 如何从队列接受数据。 队列阻塞是什么意思。往队列发送和从队列接收时优先级会有什么影响。3.1 队列的特性3.1.1 数据存储队列可以保存有限个确_对freertos进一步封装

0x800704cf 共享打印机_电脑无法访问局域网共享文件,提示0x800704cf错误的解决方法【实操已解决问题】 ......-程序员宅基地

window 无法访问,您没有权限访问共享资源。请与网络管理员联系请求访问权限。相信大家都遇到过这样的问题,有时候困扰了好久都没找到解决的办法,先汇集小编所知道的解决访问局域网内共享文件夹的方法,实实在在的解决电脑无法访问局域网共享文件的问题。【实操遇到问题情况】有一台电脑是win7的系统,在访问局域网内共享的一个目录时,提示0x800704cf错误,出现这个问题的只有这一台笔记本,其他电脑可以正..._0x800704cf