transformer & bert &GPT(未完)

原文标题:⼤规模⽆监督预训练语⾔模型与应⽤(中)

1 transformer

论文Attention Is All You Need,这是一篇刷爆朋友圈的论文。因为它的效果基于现有效果有了较大幅度的提升。
transformer与之前一些结构的不同在于:

  • 双向LSTM:一个模型想要包含当前位置的信息,前一个位置的信息,后一个位置的信息
  • CNN:一个位置包含的信息取决于kernel size大小
  • transformer:可以得到全局信息

在这里插入图片描述

这个结构是由encoder和decoder组成。

1.1 encoder部分

encoder部分是有6个重复的结构组成。每一个重复结构一样,但是参数不同,每一层结果是512维的。后面有人改进:每一层结构一样,参数相同。
每一个重复 = 层正则化(残差(multi head attention)) + 层正则化(残差(前向神经网络))

1.1.1 Attention定义

Attention是利用一组(q,k)对,计算得到加权值,对一组value进行加权平均。称为scaled dot-product attention。
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q, K, V ) = softmax(\dfrac{QK^T}{\sqrt[]d_k})V Attention(Q,K,V)=softmax(d kQKT)V

d k d_k dk是key向量的维度。
为什么除以 d k \sqrt[]{d_k} dk ?是为了保证计算的值方差不会很大。
为什么不除以dk,而是除以 d k \sqrt[]{d_k} dk d k \sqrt[]{d_k} dk 消耗资源还多?dot(a,b)的标准差 = d k \sqrt[]{d_k} dk

1.1.2 Multi-head Attention

在这里插入图片描述

不是对输入做一个Attention,而是需要做多个Attention。
假如每个单词512维度,这里有h个scaled dot-product attention。每一套可以并行计算。 Q K V 做了不同的affine变换,投射到不同的空间,得到不同的维度,也就是WX+b变换。(这里的描述与之前的文章不同,应该这里的描述是正确的,因为论文里面是这样写的)
之后过一个scaled dot-product attention。
h个结果concat
然后再做Linear
论文中h=8, d k = d v = d m o d e l / h = 64 d_k=d_v=d_{model/h}=64 dk=dv=dmodel/h=64
做Attention,Q K V 形状是不会发生变化的,每个的形状还是 seq_length,x,hidden_size

1.1.3 position-wise feed-forward networks

FFN(x) = max(0, xW1 + b1 )W2 + b2
之所以成为position-wise,是因为每个位置都做了一个这样的变换

1.1.4 positional encoding

每个位置都定义了一个encoding。 在transformer中一直在做加权平均,没有前后顺序,这就会成为bag of words。

在这里有些位置用sin,有些位置用cos,表示位置信息。每个位置的encoding是什么样子并不重要。重要的是每个位置的encoding不一样

位置信息encoding之后 与 词向量相加,也就是 embed(word) + embed(position),整体作为输入送入到encoder。
在这里插入图片描述

在这里插入图片描述

按照偶数位sin,奇数位cos的方式,得到的结果确实是i,j越接近, p m . p n p_m.p_n pm.pn越大。相对位置越远,点乘的结果越⼩。
在这里插入图片描述

1.1.5 残差链接

残差链接是这样的。
将输入x加到multi-head或者feed network的输出h上。这样可以加快训练。
这一步得到的结果记为 h 1 ′ , h 2 ′ , h 3 ′ , h 4 ′ h_1',h_2',h_3',h_4' h1,h2,h3,h4

1.1.6 layer norm

层正则化,是对残差链接的结果做正则化。

h 1 ′ , h 2 ′ , h 3 ′ , h 4 ′ h_1',h_2',h_3',h_4' h1,h2,h3,h4这4个向量分别计算每个向量的均值 μ \mu μ和方差 σ \sigma σ
在这里插入图片描述
γ \gamma γ β \beta β是共享的参数,在模型中需要训练。
γ \gamma γ β \beta β可以在一定程度上抵消掉正则的操作。为什么正则了又要抵消呢?
这样做可以让每一个时间步的值更平均一些,差异不会特别大。
这一步的输出是 h 1 ′ ′ , h 2 ′ ′ , h 3 ′ ′ , h 4 ′ ′ h_1'',h_2'',h_3'',h_4'' h1,h2,h3,h4

1.2 decoder部分

解码器和编码器差不多。
解码器有一个master multi head attention。就是说在解码的时候,每一个时间步只能看到它前面的状态。例如在计算 x 2 x_2 x2的参数时候, x 2 x_2 x2作为query,能作为key和value的只有 x 1 x_1 x1

还有一点不同是
在这里插入图片描述

这里是以解码器的输出作为key和value,这一时间步的输出作为query计算attention。

1.3 transformer block

在这里插入图片描述

在bert与GPT模型中,有些时候会把layer norm放在self attention前面,称为pre-norm,这样效果更好。

2 bert

BERT:Masked Language Modeling预训练模型
论⽂地址:https://arxiv.org/pdf/1810.04805.pdf
中⽂翻译:https://zhuanlan.zhihu.com/p/59775981
参考地址

2.1 Masked Language Model

Masked Language Model实际在做一个完形填空。将一句话中的部分单词随机mask。然后预测这些位置的单词应该是什么。

人们总想预训练出一些模型,用来提升自然语言处理的其他任务的性能。这些模型一般有2种策略。一种是feature based,例如ELMo。一种是fine-tuning,例如transformer。bert使用的是fine-tuning。

bert分为pre-training和fine-tuning两部分。
预训练是在未标注的数据集上训练的。
在fine-tuning阶段,bert会使用预训练阶段的数据初始化参数,在下游nlp任务的标注数据集上训练参数。

2.2 框架

在这里插入图片描述

在这里插入图片描述

bert 是一个multi-layer bidirectional Transformer encoder。
bert 的base框架 中L=12,H=768,A=12:有L=12层,hidden_size=768,自注意力机制的头有12个。
bert使用的架构和transformer是一样的。上图中每一个Trm是就是一个Transformer的encoder。

bert使用wordpiece embedding,词库量是3万。
每个句子的第一个token是CLS。我们可以使用CLS的向量表示一句话。
对于输入是句子对形式的打包成一个句子,句子之间好用SEP隔开。:[CLS] I study at [MASK] . [SEP] I love [MASK] language processing . [SEP]

E表示input embedding
C表示CLS的hidden state
T i T_i Ti表示第i个token的hidden state

输入表示:
BERT的输入的编码向量(长度是512)是3个嵌入特征的单位和,这三个词嵌入特征是:

WordPiece 嵌入:WordPiece是指将单词划分成一组有限的公共子词单元,能在单词的有效性和字符的灵活性之间取得一个折中的平衡。例如图4的示例中‘playing’被拆分成了‘play’和‘ing’;
位置嵌入(Position Embedding):位置嵌入是指将单词的位置信息编码成特征向量,位置嵌入是向模型中引入单词位置关系的至关重要的一环。位置嵌入的具体内容参考我之前的分析;
分割嵌入(Segment Embedding):用于区分两个句子,例如B是否是A的下文(对话场景,问答场景等)。对于句子对,第一个句子的特征值是0,第二个句子的特征值是1。
在这里插入图片描述

Bert的预训练任务是由2个任务组成的:Masked LM 和Next Sentence Prediction。

任务Masked LM:随机的mask掉一些单词,然后预测这些单词。在实验中,每个句子隐藏了15%的词(词库总量是3万。这里的词并不是一个单词,而可能是单词的一部分,因为bert使用的是wordpiece)。在预测的时候预测被隐藏的这部分内容。
因为下游任务中并不会有[MASK]标签。所以在被隐藏的位置中,有80%是[MASK],有10%是一个随机的token,有10%是token原来自己,不会变。
I study at July.如果July是被选择要隐藏的部分。那么有80%的情况,句子会被变成: I study at [MASK]。有10%的机会,会变成: I study at pear. 有10%的机会保持原样: I study at July.
然后 T i T_i Ti使用交叉熵损失来预测原始的token。

任务下一句话预测:许多重要的下游任务如问答自然语言推断都基于对两句话关系的理解,但这并不能直接由语言模型学到。为了能训练一个可以理解句子关系的模型,我们训练了一个二分类的下一句话预测任务,数据很容易获取。值得注意的是,当选择句子A和B作为预训练样本时,50%的时候B时真的A的下一句,50%的时候是一个随机的句子(即负样本)。

代码实现 google-research/bert
老师讲的代码 huggingface/transformers modeling_bert

bert wordpiece
elmo:字符
transformer:单词
bert:wordpiece

两篇论文 两篇代码看一下,代码重点是 bertselfAttention部分

如何同时做两个任务: total_loss = masked_ml_loss + next_sentecne_loss

为什么bert的特征提取器比bi-lstm好?
bert:训练一般1天,一般12层-24层
bi-lstm:训练量大,耗时时一般一个月
只能说因为训练量大小不同,在相同数据集,训练相同之间内bert效果要好。如果给予bi-lstm足够的时间,应该能拿到一样,或者更好的效果。

2.2 Bert升级版本

中文bert https://github.com/ymcui/Chinese-BERT-wwm

2.2.1 RoBERTa:更强⼤的BERT

论⽂地址:https://arxiv.org/pdf/1907.11692.pdf
特点是:

  • 加⼤训练数据 16GB -> 160GB,更⼤的batch size,训练时间加⻓
  • 不需要NSP Loss: natural inference
  • 使⽤更⻓的训练 Sequence
  • 模型训练成本在6万美⾦以上(估算)

2.2.2 ALBERT:参数更少的BERT

论⽂地址:https://arxiv.org/pdf/1909.11942.pdf
⼀个轻量级的BERT模型
核⼼思想:

  • 共享层与层之间的参数 (减少模型参数)
  • 增加单层向量维度
  • 实际训练时间更长

2.2.3 DistilBERT:轻量版BERT

一个tearcher框架,一个student框架。训练student框架的时候从teacher框架学东西。

2.2.4 Patient Distillation

论文
在这里插入图片描述
bert是12层的,训练一个6层的模型。
引入Patinet loss。在训练中还需要考虑每一层的输出尽量接近。因为新模型的层数少,比较的时候可以是隔一层比较一次,也可以是比较最后6层。

2.2.5 ELECTRA

3 OpenAI GPT

GPT
Radford et. al., Improving Language Understanding by Generative Pre-Training
这篇⽂章推出了generative pre-training + discriminative fine-tuning的⽅法,后来也被BERT沿⽤。task-aware input transformation也是BERT借⽤的⼀个点。

代码解读
https://github.com/ZeweiChu/gpt-2/blob/master/src/model.py
huggingface代码
https://github.com/huggingface/transformers/blob/master/src/transformers/modeling_gpt2.py

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值