ref. https://zhuanlan.zhihu.com/p/360932588
https://zhuanlan.zhihu.com/p/611472975
目录
2014年-Seq2Seq模型
Seq2Seq模型是一类端到端(end-to-end)的算法框架,通过encoder-decoder架构来实现。该模型的目标是给定一个长度为
m
m
m的输入序列
x
=
{
x
1
,
.
.
.
x
m
}
x=\left\{x_1,...x_m\right\}
x={x1,...xm} ,来生成一个长度为
n
n
n的目标序列
y
=
{
y
1
,
.
.
.
y
n
}
y=\left\{y_1,...y_n\right\}
y={y1,...yn}。
编码器和解码器都是RNN(LSTM)结构,编码器实现将输入的任意长度的输入序列映射为固定长度的上下文序列
c
c
c,c可以通过最后一个隐状态
h
m
h_m
hm获取,也可以通过所有隐状态
h
1
,
.
.
.
,
h
m
h_1,...,h_m
h1,...,hm获取; 解码器用来将上述固定长度的中间序列
c
c
c映射为变长度的目标序列作为最终输出,其中输出序列中的每一个元素
y
i
y_i
yi依赖中间序列
c
c
c以及其之前的隐状态
c
=
e
n
c
o
d
e
r
(
x
1
,
.
.
.
,
x
m
)
c = encoder(x_1,...,x_m)
c=encoder(x1,...,xm)
y
i
=
d
e
c
o
d
e
(
c
,
s
1
,
.
.
.
,
s
i
−
1
)
y_i = decode(c, s_1,...,s_{i-1})
yi=decode(c,s1,...,si−1)
缺点:
- 固定长度的上下文序列对较长的输入序列表达能力差
- 输入序列的每一个x都对每一个输出序列y有相同的影响
2015年-注意力Seq2Seq模型
注意力模型最大的改进在于其不再要求编码器将输入序列的所有信息都压缩为一个固定长度的上下文序列c中,取而代之的是将输入序列映射为多个下文序列
c
1
,
.
.
.
c
n
c_1,...c_n
c1,...cn
y
i
=
d
e
c
o
d
e
(
c
i
,
s
1
,
.
.
.
,
s
i
−
1
)
y_i = decode(c_i, s_1,...,s_{i-1})
yi=decode(ci,s1,...,si−1)
c
i
=
∑
j
α
i
j
h
j
c_i = \sum_{j}\alpha_{ij}h_j
ci=∑jαijhj
其中
α
i
j
\alpha_{ij}
αij为注意力权重系数,
α
i
j
\alpha_{ij}
αij越大,表示第i个输出在第j个输入上分配的注意力越多,即生成i个输出时受到第j个输入的影响也就越大。
如何得到注意力权重系数?在注意力模型中,注意力权重系数是通过构造一个全连接网络,然后再对该网络输出向量进行概率化得到的。全连接网络的训练与整个模型其他部分的训练同时完成(即实现端到端训练)。
但是,RNN模式是否真的有必要?
Google2017年-Transformer模型: Attention is all you need
Transformer模型采用的也是encoder-decoder架构,但是在该模型中,编码器和解码器不再是 RNN结构,取而代之的是编码器栈(堆叠)和解码器栈
注意力机制
由QKV组成,简单说就是用Q和K计算出来的权重加权平均V (参考链接里有一个生动的例子)
其中,缩放点击注意力(SDPA):
多头注意力机制(MHA):
QVV模式(K=V)和VVV模式(Q=K=V)两种模式应用最为广泛,因为二者蕴含了特征表示中的两个非常重要的问题:QVV模式代表着如何用一个特征集合表示另一个集合,而VVV模式代表了如何用一个特征集合表示自己。
编码器和解码器自注意力模块,都是VVV模式,不同的是,解码器部分添加了掩膜机制,这是由于在解码器中,自注意力模块只被允许处理当前项之前的那些项,这一点与编码器需要“看到”所有项是不同的
而编码器-解码器注意力模块是QVV模式,其中Q来自于上一个解码器的输出,而V来自于最后一个编码器输出(即也是编码器栈的最终输出)
整体结构如下,注意,normalize是layer normalize不是batch normalize.然后该向量由后续的 softmax 层进行概率化,得到的结果即为每个输入词汇在目标词汇上的概率分布。
OpenAI2018年-GPT
论文:Improving Language Understanding by Generative Pre-Training
“We explore a semi-supervised approach for language understanding tasks using a combination of unsupervised pre-training and supervised fine-tuning. Our goal is to learn a universal representation that transfers with little adaptation to a wide range of tasks.”
手段是半监督训练(自监督的预训练+有监督的微调),目的是构建一个能够快速适配诸多NLP任务的通用语言表示。
难点:如何选择合适的损失函数、如何适配下游的子任务
无监督预训练:神经网络语言模型
GPT首先基于一个庞大的语料库,以无监督的方式训练一个语言模型, 这个语言模型就是用链式词语接龙的方式,最大化条件概率。即给定前i个词,预测第i+1个词出现的概率。条件分布只考虑对前文的依赖关系,因此称之为单向模型。
nnlm的损失函数就是最大似然估计:
我们可以仅在一个序列的窗口中考虑问题,即将完全的前文依赖简化为仅对前k个词的依赖(即k阶马尔可夫假设)
无监督预训练: 基于Transformer的语言模型
GPT是Transformer只用解码器部分
u
u
u是独热编码,经过word embedding和positional embedding得到u’
U
′
=
U
W
e
+
W
p
U' = UW_e+W_p
U′=UWe+Wp
而解码器的部分对Transformer做了简化,仅保留掩膜多头自注意力(masked mha) 和全连接前馈网络两个模块。因为其根本不存在编码器的输出Q:
有监督微调
GPT在预训练结束后,会再进行一轮有监督的微调训练,以使得GPT模型的参数能够更好的适配NLP其他下游任务。GPT的监督微调被设定为一个文本分类任务,即根据句子 x = { x 1 , . . . x m } x=\left\{x_1,...x_m\right\} x={x1,...xm}预测标签 l l l.
GPT还给出了将有监督训练和无监督语言模型训练两个阶段合并的联合训练方法(其中无监督LM训练视为辅助训练),认为这种合并方法具有两个优点:(1)能够改进监督模型的泛化能力;(2)能够加速模型的收敛。
下游任务适配
第一类是应用场景是“分类”(classification),将最后一层的输出放入线形层。例如对一段文本进行情感分类,判断其是正面还是负面。
第一个应用场景是“蕴含”(entailment),即判断一段文本是否蕴含某种假设。该应用可以看作是一个三分类问题,需要将两段文本串联成一个长序列,采用特殊的开始符、分隔符和抽取符来区分不同部分。注意,这些特殊标记不能和文本中的其他词重复。
第二个应用场景是“相似”(similarity),即判断两段文本的相似程度。该应用同样采用GPT算法,但需要考虑相似关系的对称性。因此,对于每一对文本,需要构造两个序列,分别将它们放在不同的位置上,并用特殊标记区分不同部分。这些序列将分别输入模型中进行处理,得到最终的输出结果,然后通过一个线性层进行判断,是相似还是不相似。
第三个应用场景是“多选题”(multiple choice),即从多个答案中选择正确的答案。该应用需要构造多个序列,其中每个序列的开头都是同一个问题,而每个答案则依次作为第二个序列进行处理。这些序列将分别输入模型中进行处理,最终通过一个线性投影层输出对应的答案得分,用softmax函数将得分转换为对每个答案的选择概率。在这个应用中,GPT算法同样能够发挥出色的表现。
为什么GPT只用Transformer的右手
GPT主要应用于生成式任务,如文本生成、对话生成等。这些任务需要模型能够根据前面的文本预测下一个单词或句子。因此,GPT只需使用解码器部分,即能够生成文本的部分,而不需要编码器部分,即能够理解文本的部分。总之,GPT只使用解码器部分是为了提高模型的效率和性能,同时适应生成式任务的需求。如果需要进行其他任务,如文本分类、序列标注等,则需要使用编码器和解码器结合的模型,如BERT、RoBERTa等。
GPT和Bert的区别是什么
Bert用的是Transformer的编码器,没有掩码的transformer块
Bert本质上是完形填空,而GPT是预测未来,难度更大,天花板也更大。
在Bert的论文中,Bert base版本和GPT用了相同的模型参数,更多的训练数据集,精度略高于额GPT, 而Bert Large是base的3倍的参数,精度更高。总之,gpt1被Bert用更大的模型、更大的数据集打败。