当前位置:   article > 正文

BERT知识点汇总(en cour...)_token embedding层是什么

token embedding层是什么

Word2Vec

Word2Vec 之 Skip-Gram 模型

http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
Word2Vec模型中,主要有Skip-Gram和CBOW两种模型,从直观上理解,Skip-Gram是给定input word来预测上下文。而CBOW是给定上下文,来预测input word。本篇文章仅讲解Skip-Gram模型。
在这里插入图片描述
在这里插入图片描述

BERT的模型架构

在这里插入图片描述
论文地址https://arxiv.org/pdf/1810.04805.pdf链接: link.
本文作者推出了一套新的语言表达模型BERT,全称为Bidirectional Encoder Representations from Transformers。与近年来提出的语言模型不一样的地方在于,BERT不再仅仅是只关注一个词前文或后文的信息,而是整个模型的所有层都去关注其整个上下文的语境信息。实验结果证明,使用预训练过的BERT模型,仅仅在后面再包一层输出层,并对其进行微调训练,就可以取得很不错的结果。具体有多不错,那就是刷爆了NLP领域的11大任务,甚至有几项任务的准确率已经超过了人类。

Token Embedding,Segment Embedding,Position Embedding

Token Embedding

在这里插入图片描述

Token embedding 层是要将各个词转换成固定维度的向量。在BERT中,每个词会被转换成768维的向量表示。
在这里插入图片描述
输入文本在送入token embeddings 层之前要先进行tokenization处理。此外,两个特殊的token会被插入到tokenization的结果的开头 ([CLS])和结尾 ([SEP]) 。其中CLS是classification,表示这是一个分类任务;SEP是separator,表示是分隔记号。

Tokenization使用的方法是WordPiece tokenization. 这是一个数据驱动式的tokenization方法,旨在权衡词典大小和oov(Out-of-vocabulary)的个数。这种方法把例子中的“strawberries”切分成了“straw” 和“berries”,可参阅 Wu et al. (2016) 和 Schuster & Nakajima (2012)。
使用WordPiece tokenization让BERT在处理英文文本的时候仅需要存储30,522 个词,而且很少遇到oov。

​Token Embeddings 层会将每一个wordpiece token转换成768维的向量。这样,例子中的6个token就被转换成了一个(6, 768) 的矩阵或者是(1, 6, 768)的张量(如果考虑batch_size的话)。

Segment Embedding

BERT 能够处理句子粒度的分类任务。这类任务就像判断两个文本之间的上下文关系。
​ Segment Embeddings 层只有两种向量表示。前一个向量是把0赋给第一个句子中的各个token, 后一个向量是把1赋给第二个句子中的各个token。如果输入仅仅只有一个句子,那么它的segment embedding就是全0。

Positon Embedding

加入position embeddings会让BERT理解下面下面这种情况:

I think, therefore I am

第一个 “I” 和第二个 “I”应该有着不同的向量表示。

Transform

Attension 方法

Scaled Dot Product Attention

在这里插入图片描述
论文地址https://paperswithcode.com/method/scaled链接: link.
在这里插入图片描述

在这里插入图片描述
Scaled Dot Porduct 和 Dot Product 唯一的区别就是乘上了一个 s q r t ( d k ) sqrt(d_{k}) sqrt(dk)

当dk比较小时,两种点积的效果几乎相同,当输入信息的维度较高时,点积模型的值通常有比较大方差,从而导致 softmax 函数的梯度会比较小。因此,缩放点积模型可以较好地解决这一问题。

除了点积注意力模型之外还有addtive attension model,addtive attension 使用的是一个含有一个隐藏成的FN实现的,它和点积的复杂度在理论上相近,但是目前程序对于点积运算已经更好的算法上的优化,所以使用点积在性能上能取得更好的效果。

Multi-head

在这里插入图片描述

1.类似于CNN中通过多通道机制进行特征选择;

2.Transformer中先通过切头(spilt)再分别进行Scaled Dot-Product Attention,可以使进行点积计算的维度d不大(防止梯度消失),同时缩小attention mask矩阵。

Feed Forward Network

在这里插入图片描述
Transformer在抛弃了 LSTM 结构后,FFN 中的 ReLU成为了一个主要的提供非线性变换的单元。

Weight trying(sharing)

在这里插入图片描述
https://arxiv.org/pdf/1608.05859v3.pdf

词表数量级高,这样可以减少参数量。这样做可以大大减少模型的参数数量却没有影响模型的效果,在论文中还提到使用权值绑定和共享还可以降低模型的perplexity。
虽然weight共享了,但是embedding和pre-softmax仍然是两个不同的层,因为bias是彼此独立的

Gelu

https://arxiv.org/pdf/1606.08415.pdf
在这里插入图片描述
在这里插入图片描述
GeLu:在激活中引入了随机正则的思想,
原理
根据当前input大于其余inputs的概率进行随机正则化,即为在mask时依赖输入的数据分布,即x越小越有可能被mask掉,因此服从bernoulli(Φ(x))
相比于Relu的优点
ReLu缺乏随机因素,只用0和1

BERT的优缺点

优点
1.利用了文本的双向信息,得到基于上下文的token表示,效果更好

2.计算可并行化

缺点
1.[MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现。预训练阶段与微调阶段不一致,因为微调阶段是不会有【MASK】存在的,所以考虑到这一层面,作者也不总是将随机选择的词屏蔽为MASK,主要的操作如下描述
在这里插入图片描述

2.每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢(它们会预测每个token)正因为从理论上来讲每一次都只有15%的词是来被训练到的,所以,需要更多预训练的计算与时间成本。而作者也在后文实验证实了该方法确实收敛的较慢,但是效果好呀!(对于这种,只要做好一次,就能一劳永逸的预训练模型,时间和计算成本的增加对谷歌来说确实是小case哈哈)
3.这是非语言模型,所以不能适用于生成文本。

NLU pre-training

word level generative

MLM

Bert 采取的策略subword

15% tokens: 80% [MASK], 10% random, 10% unchanged
在预处理阶段,给每个句子采样10种mask方式

WWM(Whole Word Masking )

在这里插入图片描述

根据分词后的词边界mask,思想很简单如下图所示。
在这里插入图片描述

Pre-Training with Whole Word Masking for Chinese BERT

2019.6.19

https://arxiv.org/abs/1906.08101
https://github.com/ymcui/Chinese-BERT-wwm

Entity/Phrase (Baidu ERNIE1.0)

在这里插入图片描述

Mask策略:word-level/phrase-leve/entity-level
mask掉的不是字符也不是词变成了更大粒度的词组。
50%的时候选entity或phrase,剩下选word(保持总体subword在15%)
在这里插入图片描述

1.0: https://arxiv.org/abs/1904.09223

2019.4.19

2.0: https://arxiv.org/abs/1907.12412

2019.7.29

Span/N-gram (SpanBERT)

根据几何分布,先随机选择一段(span)的长度,之后再根据均匀分布随机选择这一段的起始位置,最后按照长度遮盖。文中使用几何分布取 p=0.2,最大长度只能是 10,平均被遮盖长度是 3.8 个词的长度。

参考Roberta的动态masking/一直训练长句

2019.7.24

https://arxiv.org/abs/1907.10529

https://zhuanlan.zhihu.com/p/75893972

Dynamic (RoBERTa)

每个Epoch见到的样本mask位置都不一样,实际上效果只提升了不到一个点

RoBERTa: A Robustly Optimized BERT Pretraining Approach

2019.7.26

https://arxiv.org/abs/1907.11692

PLM(XLNet)

XLNet: Generalized Autoregressive Pretraining for Language Understanding
AR(autoregressive):自回归,假设序列数据存在线性关系,用 x 1 , . . . , x t − 1 x_{1},...,x_{t-1} x1,...,xt1 预测 x t x_{t} xt 。以前传统的单向语言模型(ELMo、GPT)都是以AR作为目标。

AE(autoencoding):自编码,将输入复制到输出。BERT的MLM就是AE的一种。

本文作者指出了BERT采用AE方法带来的两个问题:

BERT有个不符合真实情况的假设:即被mask掉的token是相互独立的。比如预训练时输入:“自然[Mask][Mask]处理”,目标函数其实是 p(语|自然处理)+p(言|自然处理),而如果使用AR则应该是 p(语|自然)+p(言|自然语)。这样下来BERT得到的概率分布也是基于这个假设的,忽略了这些token之间的联系。
BERT在预训练和精调阶段存在差异:因为在预训练阶段大部分输入都包含[Mask],引入了噪声,即使在小部分情况下使用了其他token,但仍与真实数据存在差异。
以上就是BERT采用AE方法存在的痛点,接下来请看XLNet如何解决这些问题。
与其说XLNet解决了BERT的问题,不如说它基于AR采用了一种新的方法实现双向编码,因为AR方法不存在上述两个痛点。

XLNet的创新点是Permutation Language Modeling,如下图:
在这里插入图片描述

理论上
对于长度为T的序列x,存在T!种排列方法,如果把 [公式] 重新排列成 [公式] ,再采用AR为目标函数,则优化的似然为 [公式]

因为对于不同的排列方式,模型参数是共享的,所以模型最终可以学习到如何聚集所有位置的信息。

操作上
由于计算复杂度的限制,不可能计算所有的序列排列,因此对于每个序列输入只采样一个排列方式。而且在实际训练时,不会打乱序列,而是通过mask矩阵实现permutation。作者特意强调,这样可以保持与finetune输入顺序的一致,不会存在pretrain-finetune差异。

对于实现的细节,问题的信息如何加入成为了问题,因为要计算概率,在公式的已知信息中没有信息。

那下一个问题又来了,传统的attention只带有token编码,位置信息都在编码里了,而AR目标是不允许模型看到当前token编码的,因此要把position embedding拆出来。怎么拆呢?作者就提出了Two-Stream Self-Attention。

Query stream:只能看到当前的位置信息,不能看到当前token的编码

Content stream:传统self-attention,像GPT一样对当前token进行编码

预训练阶段最终预测只使用query stream,因为content stream已经见过当前token了。在精调阶段使用content stream,又回到了传统的self-attention结构。
在这里插入图片描述

SBO(SpanBERT)

在训练时取 Span 前后边界的两个词,不在 Span 内,然后用这两个词向量加上 Span 中被遮盖掉词的位置向量,来预测原词。详细做法是将词向量和位置向量拼接起来,过两层全连接层

比NSP表现好,有一个点的提升(个别3个点)

在span抽取式任务上有很大提升

infoWord

在这里插入图片描述

ICLR2020

A Mutual Information Maximization Perspective of Language Representation Learning

2019.10.18

DeepMind & CMU

https://arxiv.org/abs/1910.08350

word level descrimitive

WSO (StructBERT)

Word Structural Objective在这里插入图片描述
按K个一组打乱token顺序,预测原顺序(5%个trigram)
和MLM jointly等权重训练
平均不到1个点或负增长,CoLA任务上有4个点的提升
CLR2020
https://arxiv.org/abs/1908.04577

RTD (ELECTRA)

Efficiently Learning an Encoder that Classifies Token Replacements Accurately
新的预训练任务和框架,把生成式的Masked language model(MLM)预训练任务改成了判别式的Replaced token detection(RTD)任务,判断当前token是否被语言模型替换过。那么问题来了,我随机替换一些输入中的字词,再让BERT去预测是否替换过可以吗?可以的,因为我就这么做过,但效果并不好,因为随机替换太简单了。

于是作者就干脆使用一个MLM的G-BERT来对输入句子进行更改,然后丢给D-BERT去判断哪个字被改过,如下:
在这里插入图片描述
和GAN的区别
在这里插入图片描述

ICLR2020
https://openreview.net/forum?id=r1xMH1BtvB

https://zhuanlan.zhihu.com/p/89763176

Capitalization Prediction (ERNIE2.0)

判断token是否大写,对英文NER有用

Token-Document Relation (ERNIE2.0)

判断token是否在文中其他地方出现

作者认为重复出现的都是比较重要的词

sentence level self-supervised

NSP (BERT)

2 class: 50% next, 50% random from corpus

从消融实验来看,只对QNLI任务影响较大(3.5),对其他任务只有不到1%对影响
缺点:

SpanBERT:
1.相比起两句拼接,一句长句,模型可以获得更长上下文(类似 XLNet 的一部分效果);
2.在 NSP 的负例情况下,基于另一个文档的句子来预测词,会给 MLM 任务带来很大噪音。
ALBERT:
3.学到的是主题相关
RoBERTa:
4. BERT的消融实验可能只去掉了NSP的loss term,但输入仍是sentence pair
Symmetric Regularization:
5. BERT的顺序敏感,致使swap之后NLI任务效果下降

NSP SOP Sentence Order Prediction(StructBERT)

3 class:预测是上一句/下一句/随机
平均不到1个点的提升
StructBERT: Incorporating Language Structures into Pre-training for Deep Language Understanding
2019.8.13
https://arxiv.org/abs/1908.04577

PN5cls+smth

previous sentence prediction
5 classs: next/prev/next-inadjacent/prev-inadjacent/diffdoc
在prev-inadj/next-inadj上用了0.8的label smoothing到prev/next
比BERTbase提升约1个点(8个glue任务)
Symmetric Regularization based BERT for Pair-wise Semantic Reasoning

2019.9.8

蚂蚁金服+达摩院

https://arxiv.org/abs/1909.03405

SOP

Sentence Order Prediction

2class: 是next=1,是prev=0

提升1-3个点

ALBERT: A Lite BERT for Self-supervised Learning of Language Representations

ICLR2020

2019.9.26

Google+Toyota

https://arxiv.org/abs/1909.11942

https://zhuanlan.zhihu.com/p/84273154

Sentence Reordering (ERNIE2.0)

把一段中的句子划分为m个片段,打乱,进行K分类
K = sum(n!), n = 1, …, m
2019.7.29

Sentence Distance (ERNIE2.0)

3 class:在同一篇文档且相邻/在同一篇文档不相邻/不在同一篇文档

sentence level supervised

Dialogue Language Model

多轮对话:QRQ, QRR, QQR

2 class: 判断对话是真实的还是Fake,和MLM任务交替训练

有一个点的提升

IR Relevance (ERNIE2.0)

3 class: 被点击/出现在搜索结果中/随机

Discourse Relation (ERNIE2.0)

判断句子的语义关系例如logical relationship( is a, has a, contract etc.)

Distilled

原理

Hinton在NIPS2014[1]提出了知识蒸馏(Knowledge Distillation)的概念,旨在把一个大模型或者多个模型ensemble学到的知识迁移到另一个轻量级单模型上,方便部署。简单的说就是用小模型去学习大模型的预测结果,而不是直接学习训练集中的label。

在蒸馏的过程中,我们将原始大模型称为教师模型(teacher),新的小模型称为学生模型(student),训练集中的标签称为hard label,教师模型预测的概率输出为soft label,temperature(T)是用来调整soft label的超参数。

蒸馏这个概念之所以work,核心思想是因为好模型的目标不是拟合训练数据,而是学习如何泛化到新的数据。所以蒸馏的目标是让学生模型学习到教师模型的泛化能力,理论上得到的结果会比单纯拟合训练数据的学生模型要好。

方法

蒸馏发展到今天,有各种各样的花式方法,我们先从最基本的说起。

之前提到学生模型需要通过教师模型的输出学习泛化能力,那对于简单的二分类任务来说,直接拿教师预测的0/1结果会与训练集差不多,没什么意义,那拿概率值是不是好一些?于是Hinton采用了教师模型的输出概率q,同时为了更好地控制输出概率的平滑程度,给教师模型的softmax中加了一个参数T。
在这里插入图片描述

有了教师模型的输出后,学生模型的目标就是尽可能拟合教师模型的输出,新loss就变成了:
在这里插入图片描述

其中CE是交叉熵(Cross-Entropy),y是真实label,p是学生模型的预测结果,阿尔法是蒸馏loss的权重。这里要注意的是,因为学生模型要拟合教师模型的分布,所以在求p时的也要使用一样的参数T。另外,因为在求梯度时新的目标函数会导致梯度是以前的 ,所以要再乘上,不然T变了的话hard label不减小(T=1),但soft label会变。

有同学可能会疑惑:如果可以拟合prob,那直接拟合logits可以吗?

当然可以,Hinton在论文中进行了证明,如果T很大,且logits分布的均值为0时,优化概率交叉熵和logits的平方差是等价的。

具体模型 - BERT Distilled

在BERT提出后,如何瘦身就成了一个重要分支。主流的方法主要有剪枝、蒸馏和量化。量化的提升有限,因此免不了采用剪枝+蒸馏的融合方法来获取更好的效果。接下来将介绍BERT蒸馏的主要发展脉络,从各个研究看来,蒸馏的提升一方面来源于从精调阶段蒸馏->预训练阶段蒸馏,另一方面则来源于蒸馏最后一层知识->蒸馏隐层知识->蒸馏注意力矩阵。

Distilled BiLSTM

Distilled BiLSTM[2]于2019年5月提出,作者将BERT-large蒸馏到了单层的BiLSTM中,参数量减少了100倍,速度提升了15倍,效果虽然比BERT差不少,但可以和ELMo打成平手。
在这里插入图片描述
Distilled BiLSTM的教师模型采用精调过的BERT-large,学生模型采用BiLSTM+ReLU,蒸馏的目标是hard labe的交叉熵+logits之间的MSE(作者经过实验发现MSE比上文的更好)。

BERT-PKD (EMNLP2019)

既然BERT有那么多层,是不是可以蒸馏中间层的知识,让学生模型更好地拟合呢?

BERT-PKD[3]不同于之前的研究,提出了Patient Knowledge Distillation,即从教师模型的中间层提取知识,避免在蒸馏最后一层时拟合过快的现象(有过拟合的风险)。

在这里插入图片描述
对于中间层的蒸馏,作者采用了归一化之后MSE,称为PT loss。

教师模型采用精调好的BERT-base,学生模型一个6层一个3层。为了初始化一个更好的学生模型,作者提出了两种策略,一种是PKD-skip,即用BERT-base的第[2,4,6,8,10]层,另一种是PKD-last,采用第[7,8,9,10,11]层。最终实验显示PKD-skip要略好一点点(<0.01)。

DistillBERT (NIPS2019)

之前的工作都是对精调后的BERT进行蒸馏,学生模型学到的都是任务相关的知识。HuggingFace则提出了DistillBERT[4],在预训练阶段进行蒸馏。将尺寸减小了40%,速度提升60%,效果好于BERT-PKD,为教师模型的97%。

DistillBERT的教师模型采用了预训练好的BERT-base,学生模型则是6层transformer,采用了PKD-skip的方式进行初始化。和之前蒸馏目标不同的是,为了调整教师和学生的隐层向量方向,作者新增了一个cosine embedding loss,蒸馏最后一层hidden的。最终损失函数由MLM loss、教师-学生最后一层的交叉熵、隐层之间的cosine loss组成。从消融实验可以看出,MLM loss对于学生模型的表现影响较小,同时初始化也是影响效果的重要因素:

在这里插入图片描述

TinyBERT(EMNLP2019)

既然精调阶段、预训练阶段都分别被蒸馏过了,理论上两步联合起来的效果可能会更好。

TinyBERT[5]就提出了two-stage learning框架,分别在预训练和精调阶段蒸馏教师模型,得到了参数量减少7.5倍,速度提升9.4倍的4层BERT,效果可以达到教师模型的96.8%,同时这种方法训出的6层模型甚至接近BERT-base,超过了BERT-PKD和DistillBERT。

在这里插入图片描述
TinyBERT的教师模型采用BERT-base。作者参考其他研究的结论,即注意力矩阵可以捕获到丰富的知识,提出了注意力矩阵的蒸馏,采用教师-学生注意力矩阵logits的MSE作为损失函数(这里不取attention prob是实验表明前者收敛更快)。另外,作者还对embedding进行了蒸馏,同样是采用MSE作为损失。
在这里插入图片描述
于是整体的loss计算可以用下式表示:
在这里插入图片描述
其中m表示层数。 L p r e d L_{pred} Lpred表示教师-学生最后一层logits的交叉熵。

最后的实验中,预训练阶段只对中间层进行了蒸馏;精调阶段则先对中间层蒸馏20个epochs,再对最后一层蒸馏3个epochs。

MobileBERT(ACL2020)

前文介绍的模型都是层次剪枝+蒸馏的操作,MobileBERT则致力于减少每层的维度,在保留24层的情况下,减少了4.3倍的参数,速度提升5.5倍,在GLUE上平均只比BERT-base低了0.6个点,效果好于TinyBERT和DistillBERT。

MobileBERT压缩维度的主要思想在于bottleneck机制,如下图所示:
在这里插入图片描述
其中a是标准的BERT,b是加入bottleneck的BERT-large,作为教师模型,c是加入bottleneck的学生模型。Bottleneck的原理是在transformer的输入输出各加入一个线性层,实现维度的缩放。
对于教师模型,embedding的维度是512,进入transformer后扩大为1024,而学生模型则是从512缩小至128,使得参数量骤减。

另外,作者发现在标准BERT中,多头注意力机制MHA和非线性层FFN的参数比为1:2,这个参数比相比其他比例更好。所以为了维持比例,会在学生模型中多加几层FFN。
MobileBERT的蒸馏中,作者先用b的结构预训练一个BERT-large,再蒸馏到24层学生模型中。蒸馏的loss有多个:

Feature Map Transfer:隐层的MSE
Attention Transfer:注意力矩阵的KL散度
Pre-training Distillation:
同时作者还研究了三种不同的蒸馏策略:直接蒸馏所有层、先蒸馏中间层再蒸馏最后一层、逐层蒸馏。如下图:
在这里插入图片描述
最后的结论是逐层蒸馏效果最好,但差距最大才0.5个点,性价比有些低了。。

MobileBERT还有一点不同于之前的TinyBERT,就是预训练阶段蒸馏之后,作者直接在MobileBERT上用任务数据精调,而不需要再进行精调阶段的蒸馏,方便了很多。

MiniLM

之前的各种模型基本上把BERT里面能蒸馏的都蒸了个遍,但MiniLM[7]还是找到了新的蓝海——蒸馏Value-Value矩阵:
在这里插入图片描述
Value-Relation Transfer可以让学生模型更深入地模仿教师模型,实验表明可以带来1-2个点的提升。同时作者考虑到学生模型的层数、维度都可能和教师模型不同,在实验中只蒸馏最后一层,并且只蒸馏这两个矩阵的KL散度,简直是懒癌福音。

另外,作者还引入了助教机制。当学生模型的层数、维度都小很多时,先用一个维度小但层数和教师模型一致的助教模型蒸馏,之后再把助教的知识传递给学生。

最终采用BERT-base作为教师,实验下来6层的学生模型比起TinyBERT和DistillBERT好了不少,基本是20年性价比数一数二的蒸馏了。

精调技巧
MT-DNN Multi-Task Deep Neural Network

在这里插入图片描述

ACL2019

https://arxiv.org/abs/1901.11504

https://arxiv.org/abs/2002.07972

https://github.com/namisan/mt-dnn

https://zhuanlan.zhihu.com/p/56868716

Layer Combination

https://arxiv.org/abs/1910.03176

a generalized fine-tuning method that (1) enables the extraction of global information among all layers through Squeeze and Excitation
在这里插入图片描述

and (2) enriches local information by capturing neighboring contexts via Gaussian blurring.
在这里插入图片描述

Sentence Embedding

在这里插入图片描述
In this publication, we present Sentence-BERT
(SBERT), a modification of the pretrained
BERT network that use siamese and triplet network structures to derive semantically meaningful sentence embeddings that can be compared using cosine-similarity. This reduces the
effort for finding the most similar pair from 65
hours with BERT / RoBERTa to about 5 seconds with SBERT, while maintaining the accuracy from BERT

SBERT-WK

It was shown in previous study that different
layers of BERT capture different linguistic properties. This allows
us to fuse information across layers to find better sentence
representations. In this work, we study the layer-wise pattern
of the word representation of deep contextualized models. Then,
we propose a new sentence embedding method by dissecting
BERT-based word models through geometric analysis of the
space spanned by the word representation. It is called the
SBERT-WK method
. 在这里插入图片描述

  1. Determine a unified word representation for each word
    in a sentence by integrating its representations across
    layers by examining its alignment and novelty properties.
  2. Conduct a weighted average of unified word representations based on the word importance measure to yield
    the ultimate sentence embedding vector.
UTR Universal Text Representation

NLI精调+各层融合
文章参考
https://www.cnblogs.com/d0main/p/10447853.html#token-embeddings
https://www.jianshu.com/p/4cb1f255cd7c

Transfer Finetuning

在这里插入图片描述

Task Structure
BERT and PALs

ICML2019
这篇论文研究的问题是如何将bert应用到multi-task的领域中,最简单的办法是针对每一个task去fine tune一个模型,而本文最主要的思想是,将bert在多任务中进行参数共享,当然文章的主要贡献点是如何共享参数,以及如何将task specific的部分添加到bert模型中。一般而言共享参数有hard parameter sharing和soft parameter sharing,前者是在所有task中完全共享绝大部分参数,而后者则是将不同task中的参数限制在某一个范围之内,比如利用L2距离进行限制,也就是要求不同任务中的参数比较接近。本文中因为使用的是bert,如果选用soft方式,则参数太多,因此主要讨论hard parameter sharing方式,然后将重点放在保持绝大部分参数共享之外,如何将task specific的参数添加到bert的什么地方(比如通常来说是加在bert的最后一层)。

分析bert中的参数计算
1.self-attension 三个矩阵分别为 d/ nd 其中n是multi head的个数。
参数总数为 3
d/ndn
2.在multi’-head之后还有一个dd的变换矩阵。
3.规范层和前向传播层的传播总数为 2d+2d
dff
4.以上提到的注意力层一共有12层 所以参数还需要乘上12
5.在最后的最后还有一个cls位置还有一个矩阵 为pooling layer 参数大小为d*d
将task模型的参数加到bert的顶部
可以将task specific的参数都加到bert的顶部。TS就是task specific function。
task specific model的形式有简单的也有复杂的形式,或者增加一个bert layer
在这里插入图片描述

如果需要将输入进行同一个维度的变换和映射,也就是原来的d维映射到还是d维的向量,如果直接使用一个矩阵进行映射,则参数量将会是 d * d,在bert中d=768,这个平方关系将带来很多参数。为了避免这一点,引入一个中间的变换,这里的参数大概是d * ds + ds * d,可以将ds设置的比较小一些,最后使得总参数要小很多
简化版的TS函数如下所示:
其中Ve是ds*dm的encoder Vd是decoder。
在这里插入图片描述
将task模型的参数加到bert的内部
在这里插入图片描述
内部加task specific的方式
在这里插入图片描述
对于TS中的g函数变换,文中实验了如下几种方式:

PALs: Projected Attention Layers,这实际上就是一个multi-head attention机制,只不过没有BERT中做完multi-head之后再加的一个参数映射而已
Projected Attention:在PALs的基础上多出一个参数矩阵,如下式所示

最后,作者总结说将task specific model加到bert的内部效果相应要好于将其加到bert的顶部(在相同参数的情况下),并且every layer of bert和后半部分的bert添加task specific model效果会相对较好。并且并行的添加方式比串行的添加方式效果要好。

https://arxiv.org/abs/1902.02671

将Task specific层并行地加到BERT内部

https://zhuanlan.zhihu.com/p/74050878

K-Adapter

2020|通过知识适配器向预训练模型中注入知识
Title: K-ADAPTER: Infusing Knowledge into Pre-Trained Models with Adapters
本文研究问题:向大型预训练(语言)模型中注入知识。

尽管预训练模型(GPT、BERT、XLNET等模型)取得了很大的进展,最近的一些研究表明,以无监督方式训练的语言模型很难捕获丰富的知识;

先前的工作主要集中与通过设计 knowledge-driven 的训练目标来增强standard LM的训练目标,然后通过多任务学习的方式更新模型的全部参数;

这样的方式存在几点限制:

1\无法进行终身学习(continual learning)

模型的参数在引入新知识的时候需要重新训练;
对于已经学到的知识来说,会造成灾难性遗忘(catastrophic forgetting);
2\模型产生的是耦合的表示(entangled representations)

为进一步探究引入不同知识的作用/影响带来困难;
Note:这篇文章中Related Work部分对于向PLM中注入知识这一方向进行了很好的梳理,推荐阅读原文Sec. 2,相关工作的区别主要在于 a) knowledge sources 和 b) training objective;
2. This Work
基于上述问题,本文提出了 K-Adapter,一种灵活、简便的向PLM(Permuted Language Model)中注入知识的方法,可以进行持续知识融合以及产生解耦的表示,保留了PLM产生的原始表示,可以引入多种知识;

Adapter:可以看做是一个 knowledge-specific 模型,可以作为一个插件,加在PLM外部,输入包含PLM中间层输出的隐状态,一种知识类型对应于一个Adapter,一个PLM可以连接多个Adapter;

本文引入的知识类型(具体引入知识的任务形式,在模型部分进行介绍):

factual knowledge,将Wikipedia文本对齐到Wikidata三元组;
linguistic knowledge,对web文本进行依存分析得到;
本文贡献:提出了一个K-Adapter模型;

通过知识适配器可以同时引入factual knowledge和linguistic knowledge;
相应地,最终的模型包含一个PLM和两个Adapter;
在下游任务(包含),以及在LAMA上的实验表明,与RoBERTa相比,K-Adapter 可以捕获更丰富的factual和commonsense知识;
本文工作与先前工作的3个不同之处:

同时考虑了fact-related和linguistic-related的目标函数(为了同时引入两种类型的知识);
在注入知识的过程中,原始的PLM参数没有变化;
可以支持持续学习,不同的知识适配器的学习是解耦的(独立的),后续再加入知识不会对已加入的知识产生影响;
3. K-ADAPTER
本文中的PLM使用RoBERTa;
图:(a) 基于多任务学习向PLM引入知识的框架,(b) 本文通过知识适配器引入知识的框架;
在这里插入图片描述
3.1 Adapter结构
在这里插入图片描述
每个Adapter模型包含K个adapter层,每个adapter层包含:

N 个transformer层;
2 个映射层;
1 个残差连接;
与PLM的连接位置:将adapter层连接到PLM中不同的transformer层上;

与PLM的连接方式:

当前adapter层的输入:a) transformer层输出的隐藏层,b) 前一个adapter层的输出,这两个表示进行concat;
Adapter模型的输出:a) PLM最后一层的隐藏层输出,和 b) 最后一个adapter层的输出,进行concat作为最终的输出;

预训练-微调阶段:

不同的Adapter在不同的预训练任务上分别进行训练;
对于不同的下游任务,K-Adapter采用和RoBERTa相同的微调方式;
只使用一种Adapter时,Adapter模型的最终输出作为task-specific层的输入;
使用多种Adapter时,将多个Adapter模型的输出进行concat作为task-specific层的输入;

预训练设置:

使用RoBERTa-Large模型,335M参数;
adapter层中的transformer层数 [公式] ,维度 [公式] ,self-attention heads [公式] ;
adapter层中的两个映射层维度分别是 1024 和 768;
adapter层连接在RoBERTa模型的 [公式] 层上;
不同的adapter层之间不共享参数;
Adapter模型参数量:42M;
3.2 Factual Adapter
Factual Knowledge 主要来源于文本中实体之间的关系;

数据集:T-REx,将Wikipedia摘要和wikidata三元组进行了对齐;

数据集规模:5.5M句子,430种关系;

FacAdapter的预训练任务:关系分类,给定context和一对实体,对其间关系标签进行分类;

预训练任务相关的模块:引入了pooling层;

FacAdapter的参数随机初始化;
3.3 Linguistic Adapter
Linguistic Knowledge 主要来源于文本中词之间的依存关系;

数据集:BookCorpus,利用Standford Parser进行处理;

数据集规模:1M;

LinAdapter的预训练任务:依存关系分类,预测给定句子中每个token在依存分析结果中的father index;

预训练任务相关的模块:引入了pooling层;

LinAdapter的参数随机初始化;

Deformer

Deformer: 双塔模型与匹配模型的结合

但模型压缩还是会带来一定的精度损失。因此我们思考,是不是可以参考双塔模型的结构,提前进行一些计算,从而提升模型的推理速度?

如果这种思路可行,会有几个很大的优势

它不需要大幅修改原来的模型架构
也不需要重新预训练,可以继续使用标准Transformer初始化+目标数据集fine-tune的精调方式
还可以叠加模型压缩技术
经过不断地尝试,我们提出了《Deformer:Decomposing Pre-trained Transformers for Faster Question Answering》,在小幅修改模型架构且不更换预训练模型的情况下提升推理速度。下面将为大家介绍我们的思考历程。

模型结构

在开篇的介绍中,我们指出了QA任务的计算瓶颈主要在于自注意力机制需要交互编码的token太多了。因此我们猜想,是否能让文档和问题在编码阶段尽可能地独立?

这样的话,就可以提前将最难计算的文档编码算好,只需要实时编码较短的问题文本,从而加速整个QA过程。

部分研究表明,Transformer 的低层(lower layers)编码主要关注一些局部的语言表层特征(词形、语法等等),到高层(upper layers)才开始逐渐编码与下游任务相关的全局语义信息。因此我们猜想,至少在模型的某些部分,“文档编码能够不依赖于问题”的假设是成立的。 具体来说可以在 Transformer 开始的低层分别对问题和文档各自编码,然后再在高层部分拼接问题和文档的表征进行交互编码,如图所示:
在这里插入图片描述
为了验证上述猜想,我们设计了一个实验,测量文档在和不同问题交互时编码的变化程度。下图为各层输出的文档向量和它们中心点cosine距离的方差:
在这里插入图片描述
可以看到,对于BERT-Based的QA模型,如果编码的文档不变而问题变化,模型的低层表征往往变化不大。这意味着并非所有Transformer编码层都需要对整个输入文本的全部token序列进行自注意力交互。

因此,我们提出Transformer模型的一种变形计算方式(称作 DeFormer):在前k层对文档编码离线计算得到第 k 层表征,问题的第k层表征通过实时计算,然后拼接问题和文档的表征输入到后面k+1到n层。下面这幅图示意了DeFormer的计算过程:
在这里插入图片描述
总结
这篇文章提主要提出了一种变形的计算方式DeFormer,使问题和文档编码在低层独立编码再在高层交互,从而使得可以离线计算文档编码来加速QA推理和节省内存。

创新之处在于它对原始模型并没有太大修改。部署简单,且效果显著。 实验结果表明基于BERT和XLNet的DeFormer均能取得很好的表现。笔者推测对其他的Transformer模型应该也同样有效,并且其他模型压缩方法和技术应该也可以叠加使用到DeFormer上来进一步加速模型推理。

Adversarial training
FreeLB (Free Large-Batch)

我们知道,对抗学习最初在生成模型中应用,比如最简单的GAN,能够生成以假乱真的图像等;后来该模型被用于判别模型中,因为普通的图像分类器泛化能力差,易受攻击导致分类错误,通过增加对抗训练,能够有效提高模型的鲁棒性,同时也能提高模型的泛化能力。
对抗训练中关键的是需要找到对抗样本,通常是对原始的输入添加一定的扰动来构造,然后放给模型训练,这样模型就有了识别对抗样本的能力。其中的关键技术在于如果构造扰动,使得模型在不同的攻击样本中均能够具备较强的识别性。

本文针对自然语言中的对抗学习,针对攻击的“一阶扰动”场景,总结了最近的工作进展,涉及到的知识包括:基本单步算法FGM,“一阶扰动”最强多步算法PGD,以及针对时耗等改进的FreeAT,YOPO和FreeLB,其中FreeLB成为了目前刷榜的SOA。
对抗训练
https://openreview.net/forum?id=BygzbyHFvB

AE+AR

Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer

Unified Language Model Pre-training for Natural Language Understanding and Generation
ERNIE-GEN: An Enhanced Multi-Flow Pre-training and Fine-tuning Framework for Natural Language Generation

Baidu

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/372084?site
推荐阅读
相关标签
  

闽ICP备14008679号