Skip to content

Commit

Permalink
1. R-drop 学习
Browse files Browse the repository at this point in the history
2. PET 学习
  • Loading branch information
km1994 committed Aug 8, 2021
1 parent fd42eb0 commit d6ef044
Show file tree
Hide file tree
Showing 14 changed files with 183 additions and 15 deletions.
Binary file added Dropout/R-Drop/2106.14448v1.pdf
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
79 changes: 79 additions & 0 deletions Dropout/R-Drop/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# 【关于 R-Drop】 那些你不知道的事

> 作者:杨夕
>
> 论文:R-Drop: Regularized Dropout for Neural Networks
>
> 会议:
>
> 论文下载地址:https://arxiv.org/abs/2106.14448
>
> 论文代码:https://github.com/dropreg/R-Drop
>
> 本文链接:https://github.com/km1994/nlp_paper_study
>
> 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。
>
> 【注:手机阅读可能图片打不开!!!】
- [【关于 R-Drop】 那些你不知道的事](#关于-r-drop-那些你不知道的事)
- [一、摘要](#一摘要)
- [二、Dropout 介绍](#二dropout-介绍)
- [三、R-Drop(Regularized Dropout) 方法简介](#三r-dropregularized-dropout-方法简介)
- [四、R-Drop(Regularized Dropout) 方法动机](#四r-dropregularized-dropout-方法动机)
- [五、R-Drop(Regularized Dropout) 方法核心思想](#五r-dropregularized-dropout-方法核心思想)
- [参考](#参考)

## 一、摘要

- 介绍:Dropout 是一种强大且广泛使用的技术,用于规范深度神经网络的训练。
- 论文方法:在本文中,我们在模型训练中引入了一种简单的 dropout 正则化策略,即 R-Drop,它强制 dropout 生成的不同子模型的输出分布相互一致。具体来说,对于每个训练样本,R-Drop 最小化了通过 dropout 采样的两个子模型的输出分布之间的双向 KL 散度。
- 实验结论:理论分析表明,R-Drop 降低了模型参数的自由度并补充了 dropout。
- 实验结果:在神经机器翻译、摘要、语言理解、语言建模和图像分类等 5 个广泛使用的深度学习任务(共 18 个数据集)上的实验表明,R-Drop 具有普遍性。特别是,当应用于微调大规模预训练模型(例如 ViT、RoBERTa-large 和 BART)时,它产生了实质性的改进,并使用 vanilla Transformer 模型实现了最先进的 (SOTA) 性能在 WMT14 英语→德语翻译 (30.91 BLEU) 和 WMT14 英语→法语翻译 (43.95 BLEU) 上,甚至超过了使用超大规模数据训练的模型和专家设计的 Transformer 模型的高级变体。

## 二、Dropout 介绍

- 介绍:由于深度神经网络非常容易过拟合,因此 Dropout 方法采用了随机丢弃每层的部分神经元,以此来避免在训练过程中的过拟合问题。同时提升模型的泛化(generalization)能力。
- 方法:Dropout 需要简单地在训练过程中丢弃一部分的神经元

## 三、R-Drop(Regularized Dropout) 方法简介

- 介绍:与传统作用于神经元(Dropout)或者模型参数(DropConnect)上的约束方法不同,R-Drop **作用于模型的输出层**,弥补了 Dropout 在训练和测试时的不一致性。简单来说就是在每个 mini-batch 中,**每个数据样本过两次带有 Dropout 的同一个模型,R-Drop 再使用 KL-divergence 约束两次的输出一致**
- 作用:**R-Drop 约束了由于 Dropout 带来的两个随机子模型的输出一致性**

## 四、R-Drop(Regularized Dropout) 方法动机

由于深度神经网络非常容易过拟合,因此 Dropout 方法采用了随机丢弃每层的部分神经元,以此来避免在训练过程中的过拟合问题。**正是因为每次随机丢弃部分神经元,导致每次丢弃后产生的子模型都不一样,所以 Dropout 的操作一定程度上使得训练后的模型是一种多个子模型的组合约束。**基于 Dropout 的这种特殊方式对网络带来的随机性,研究员们提出了 R-Drop 来进一步对(子模型)网络的输出预测进行了正则约束。

## 五、R-Drop(Regularized Dropout) 方法核心思想

论文通过对模型进行两次 Dropout 之后,会得到两个 不同的模型:

![](img/微信截图_20210729102133.png)

此时,模型的 Loss 包含 交叉熵 Loss 和 KL 散度 Loss 两部分:

- 交叉熵 Loss

![](img/微信截图_20210729102350.png)

- KL 散度 Loss

![](img/微信截图_20210729102409.png)

> 该损失函数的作用是让不同的 Dropout 的模型尽可能一致
- 交叉熵 Loss 和 KL 散度 Loss 加权

![](img/微信截图_20210729102536.png)

> 其中 α 为超参数根据自己的任务需要调整不同的参数来应对
在实际实现中,数据 $x_i$ 不需要过两次模型,而只需要把 $x_i$ 在同一个 batch 中复制一份即可。直观地说,在训练时,Dropout 希望每一个子模型的输出都接近真实的分布,然而在测试时,Dropout 关闭使得模型仅在参数空间上进行了平均,因此训练和测试存在不一致性。而 R-Drop 则在训练过程中通过刻意对于子模型之间的输出进行约束,来约束参数空间,让不同的输出都能一致,从而降低了训练和测试的不一致性。另外,研究员们还从理论的角度出发,阐述了 R-Drop 的约束项对于模型自由度的控制,从而更好地提升模型的泛化性能。


## 参考

1. [R-Drop: Regularized Dropout for Neural Networks](https://github.com/dropreg/R-Drop)
2. [又是Dropout两次!这次它做到了有监督任务的SOTA](https://kexue.fm/archives/8496#R-Drop)
3. [提升泛化能力的R-drop在NER中的实验](https://zhuanlan.zhihu.com/p/385796959)
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
- [理论学习篇](#理论学习篇)
- [经典论文研读篇](#经典论文研读篇)
- [【关于 transformer 】 那些的你不知道的事](#关于-transformer--那些的你不知道的事)
- [【关于 Dropout】 那些你不知道的事](#关于-dropout-那些你不知道的事)
- [【关于 预训练模型】 那些的你不知道的事](#关于-预训练模型-那些的你不知道的事)
- [【关于 信息抽取】 那些的你不知道的事](#关于-信息抽取-那些的你不知道的事)
- [【关于 实体关系联合抽取】 那些的你不知道的事](#关于-实体关系联合抽取-那些的你不知道的事)
Expand Down Expand Up @@ -204,6 +205,17 @@
- 4.18 Compressive Transformers
- 五、总结

##### 【关于 Dropout】 那些你不知道的事

- [【关于 R-Drop】 那些你不知道的事](https://github.com/km1994/nlp_paper_study/tree/master/Dropout/R-Drop/)
- 论文:R-Drop: Regularized Dropout for Neural Networks
- 论文下载地址:https://arxiv.org/abs/2106.14448
- 论文代码:https://github.com/dropreg/R-Drop
- 论文动机:
- 由于深度神经网络非常容易过拟合,因此 Dropout 方法采用了随机丢弃每层的部分神经元,以此来避免在训练过程中的过拟合问题。**正是因为每次随机丢弃部分神经元,导致每次丢弃后产生的子模型都不一样,所以 Dropout 的操作一定程度上使得训练后的模型是一种多个子模型的组合约束。**基于 Dropout 的这种特殊方式对网络带来的随机性,研究员们提出了 R-Drop 来进一步对(子模型)网络的输出预测进行了正则约束。
- 论文方法:与传统作用于神经元(Dropout)或者模型参数(DropConnect)上的约束方法不同,R-Drop **作用于模型的输出层**,弥补了 Dropout 在训练和测试时的不一致性。简单来说就是在每个 mini-batch 中,**每个数据样本过两次带有 Dropout 的同一个模型,R-Drop 再使用 KL-divergence 约束两次的输出一致**
- 作用:**R-Drop 约束了由于 Dropout 带来的两个随机子模型的输出一致性**

##### 【关于 预训练模型】 那些的你不知道的事

- [【关于Bert】 那些的你不知道的事](https://github.com/km1994/nlp_paper_study/tree/master/bert_study/):Bert论文研读
Expand Down Expand Up @@ -1194,6 +1206,12 @@
- 提出了一种寻找类别指示词的方法和一个基于上下文的单词类别预测任务,该任务训练LM使用一个词的上下文来预测一个词的隐含类别。经过训练的LM很好地推广了基于未标记语料库的自训练文档级分类
- 在四个分类数据集上,LOTClass明显优于各弱监督模型,并具有与强半监督和监督模型相当的性能。

- [【关于 PET 】那些你不知道的事](https://github.com/km1994/nlp_paper_study/tree/master/classifier_study/PET/)
- 论文名称:《exploiting cloze questions for few shot text classification and natural language inference 》
- 会议:EMNLP2020
- 论文地址:chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Faclanthology.org%2F2021.eacl-main.20.pdf#=&zoom=125
- 论文源码地址:https://github.com/timoschick/pet

##### [【关于 中文分词】那些你不知道的事](https://github.com/km1994/nlp_paper_study/tree/master/chinese_word_segmentation/)

- [【关于 中文分词】那些你不知道的事](https://github.com/km1994/nlp_paper_study/tree/master/chinese_word_segmentation/)
Expand Down
Binary file not shown.
20 changes: 20 additions & 0 deletions classifier_study/PET/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# 【关于 PET 】那些你不知道的事

> 作者:杨夕
>
> 论文名称:《exploiting cloze questions for few shot text classification and natural language inference 》
>
> 会议:EMNLP2020
>
> 论文地址:chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Faclanthology.org%2F2021.eacl-main.20.pdf#=&zoom=125
>
> 论文源码地址:https://github.com/timoschick/pet
>
> 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。


## 参考

1. [Prompt范式的缘起|Pattern-ExploitingTraining])(https://mp.weixin.qq.com/s/3XzXMZmanINcMgzySCmAXw)
2. [NLP系列之文本分类(二):小样本学习/无监督学习/半监督学习—PET范式](https://zhuanlan.zhihu.com/p/375934846)
81 changes: 66 additions & 15 deletions nlp_game/game_trick.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,46 @@

现在的NLP竞赛,基本都会使用BERT,各种体量的BERT确实效果会很好,建议使用HuggingFace的transformers包,调用和调试都很方便。

### 一、数据增强
### 一、题目解读

### 二、数据分析(Data Exploration)

所谓数据挖掘,当然是要从数据中去挖掘我们想要的东西,我们需要通过人为地去分析数据,才可以发现数据中存在的问题和特征。我们需要在观察数据的过程中思考以下几个问题:

1. 数据应该怎么清洗和处理才是合理的?
2. 根据数据的类型可以挖掘怎样的特征?
3. 数据中的哪些特征会对标签的预测有帮助?

#### 2.1 统计分析

对于数值类变量(Numerical Variable),我们可以得到min,max,mean,meduim,std等统计量,用pandas可以方便地完成,结果如下:

![](img/微信截图_20210806113559.png)

从上图中可以观察Label是否均衡,如果不均衡则需要进行over sample少数类,或者down sample多数类。我们还可以统计Numerical Variable之间的相关系数,用pandas就可以轻松获得相关系数矩阵:

![](img/微信截图_20210806113649.png)

#### 2.2 可视化

人是视觉动物,更容易接受图形化的表示,因此可以将一些统计信息通过图表的形式展示出来,方便我们观察和发现。比如用直方图展示问句的频数:

![](img/微信截图_20210806113734.png)

或者绘制相关系数矩阵:

![](img/微信截图_20210806113753.png)

### 三、数据预处理(Data Preprocessing)

刚拿到手的数据会出现噪声,缺失,脏乱等现象,我们需要对数据进行清洗与加工,从而方便进行后续的工作。针对不同类型的变量,会有不同的清洗和处理方法:

1. 对于数值型变量(Numerical Variable),需要处理离群点,缺失值,异常值等情况。
2. 对于类别型变量(Categorical Variable),可以转化为one-hot编码。
3. 文本数据是较难处理的数据类型,文本中会有垃圾字符,错别字(词),数学公式,不统一单位和日期格式等。我们还需要处理标点符号,分词,去停用词,对于英文文本可能还要词性还原(lemmatize),抽取词干(stem)等等。


### 四、数据增强

数据增强一直是提升算法效果最有效的武器,根据任务特征,构建不同的增强数据集,能有效提升模型效果。

Expand All @@ -33,49 +72,61 @@

此外,通常对于增强的数据,需要给一个小于1的权重,区别于真实数据。数据增强也能很好的缓解数据不均衡的问题。

### 二、数据清洗

对于数据质量不高的数据,一定要有数据清洗的意识,质量越差,清洗后的提升效果越明显。数据清洗通常有两种方法,基于规则和基于模型。

- 基于规则:这个需要一些领域知识或者通用常识,通常用正则表达式即可完成。
- 基于模型:这是一种思路,类似于后面的半监督的做法。利用5-fold或者10-fold训练模型,预测数据,对所有数据获得一个模型打标结果,对于那些模型打标很多出现错误的数据进行过滤(过滤规则看需求),这样可以滤除很大一部分噪音数据,对结果一般有较好提升。

### 三、训练参数调整
### 五、训练参数调整

如果模型设置是正确的,没有出现过拟合的情况,那么通常调节如下几个参数能提高模型精度。

- Epoch:模型训练轮数,让模型充分训练需要的,也有使用early stop的,同样的道理,但是epoch不宜过高,否- 则会对训练集过拟合。如果训练|测试数据集高度相似,可以设置高的Epoch。Epoch需要根据训练数据量,数据质量设置,一般5,7,12等,皆可。
- Batch Size: 越大越好,根据你的GPU,尽量完全充分的利用GPU。
- Max Sequence Length:文本的最大长度。需要统计数据的长度来设置,因为缩减了文本的最大长度,相当于对于单卡可以使用更大的Batch Size。

### 、对抗训练+混合精度
### 、对抗训练+混合精度

#### 4.1 对抗训练
#### 6.1 对抗训练

在比赛中,我们通常采用对抗训练缓解模型鲁棒性差的问题,提升模型鲁棒性和泛化能力。

对抗训练通过引入噪声来完成,和CV直接对像素点进行扰动不一样,在NLP中我们一般是通过一些embedding层添加微小扰动来进行对抗学习。根据添加的方法,一般我们使用Fast Gradient Method (FGM)和Projected Gradient Descent (PGD)。这是一篇介绍FGM 和 PGD的景点文章,也有代码实现。

其实在引入对抗训练后(无论是FGM,还是PGD),都会大大的增长模型训练的时长,其实也就是变相的降低了模型的训练效率,也会影响到模型训练结果。所以我们一般使用对抗训练的时候,会使用混合精度训练来提升训练效率。

#### 4.2 混合精度 -fp16
#### 6.2 混合精度 -fp16

因为采用对抗训练会降低计算效率(GPU充足的大佬可以跳过),我们会采用混合精度训练优化训练耗时,同时也提升训练精度。

混合精度训练,会对数据使用FP16做存储和乘法来加速模型训练,同时使用FP32做累加避免舍入误差。当然,混合精度训练还有一些其他操作,主要思想是在训练过程中,利用尽量少的数据精度损失,提升数据训练效率。正好弥补对抗训练引入的训练效率的丢失,所以通常两者混合使用。当然,有充分GPU的土豪,可以不考虑。

### 五、多模型融合
### 七、多模型融合

模型验证(Validation)
在Test Data的标签未知的情况下,我们需要自己构造测试数据来验证模型的泛化能力,因此把Train Data分割成Train Set和Valid Set两部分,Train Set用于训练,Valid Set用于验证。

#### 7.1 简单分割

将Train Data按一定方法分成两份,比如随机取其中70%的数据作为Train Set,剩下30%作为Valid Set,每次都固定地用这两份数据分别训练模型和验证模型。这种做法的缺点很明显,它没有用到整个训练数据,所以验证效果会有偏差。通常只会在训练数据很多,模型训练速度较慢的时候使用。

#### 7.2 交叉验证

交叉验证是将整个训练数据随机分成K份,训练K个模型,每次取其中的K-1份作为Train Set,留出1份作为Valid Set,因此也叫做K-fold。至于这个K,你想取多少都可以,但一般选在3~10之间。我们可以用K个模型得分的mean和std,来评判模型得好坏(mean体现模型的能力,std体现模型是否容易过拟合),并且用K-fold的验证结果通常会比较可靠。

如果数据出现Label不均衡情况,可以使用Stratified K-fold,这样得到的Train Set和Test Set的Label比例是大致相同。

### 八、多模型融合

多模型融合可以算是一个放之四海而皆准的比赛准则,虽然多用于比赛,线上受限于预测时间,CPU|GPU并行化等因素而不好用。但比赛基本都用。

通常,差异化越大的模型,最终融合结果越好,使用log权重会让模型融合和效果更优。

### 、半监督训练
### 、半监督训练

思想很简单,用训练数据获得模型M,然后利用模型预测无监督数据得到模型打标的数据,然后再用 labeled data + model labeled data 进行混合数据的训练,获得新的模型M'。和增强数据一样,我们给model labeled data一个可训练(也可以按经验固定,我一般取0.5-0.8)的权重α,效果会更好!PS:图不是我画的,网上找的。

![](img/微信截图_20210531142203.png)

## [新手入门 Kaggle NLP类比赛总结](https://zhuanlan.zhihu.com/p/109992475)
## 参考资料

1. [新手入门 Kaggle NLP类比赛总结](https://zhuanlan.zhihu.com/p/109992475)
2. [分分钟带你杀入Kaggle Top 1%](https://zhuanlan.zhihu.com/p/27424282)
3. [文本分类上分微调技巧实战](https://mp.weixin.qq.com/s/CDIeTz6ETpdQEzjdeBW93g)


Binary file added nlp_game/img/微信截图_20210806113559.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added nlp_game/img/微信截图_20210806113649.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added nlp_game/img/微信截图_20210806113734.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added nlp_game/img/微信截图_20210806113753.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit d6ef044

Please sign in to comment.