自用预训练语言模型->Transformer模型
Posted 王六六的IT日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自用预训练语言模型->Transformer模型相关的知识,希望对你有一定的参考价值。
[2017] Transformer 模型
根据我们组大神发给我的学习资料做成的一个笔记,方便自己进行复习~~~~~~~
参考:[论文] Attention Is All You Need [kjhv]
【博客】史上最小白之Transformer详解
【博客】图解Transformer(完整版)
【知乎】如何理解Transformer论文中的positional encoding,和三角函数有什么关系?
【视频】 汉语自然语言处理-从零解读碾压循环神经网络的transformer模型[B站up主:1espresso]
尽管Transformer模型不是预训练语言模型(是seq2seq模型),但BERT是从transformer中衍生出来的预训练语言模型。因此在这里介绍它有着重要意义。
在Transformer没有诞生之前,大多数模型都是基于CNN和RNN的。但Transformer做出了一个大胆的创新:引入一个新的机制并完全抛弃CNN和RNN,这个机制就是attention机制。attention可以解决RNN及其变体存在的长距离依赖问题,也就是attention机制可以有更好的记忆力,能够记住更长距离的信息。另外最重要的就是attention支持并行化计算,这一点十分关键。
Transformer之所以如此强大是因为它特有的结构。
Transformer模型主要包括四个部分,分别是:输入、编码、解码和输出,如下图。接下来将依次讲解。
1 Input
(1)输入
transformer有两个输入口,一个是编码器侧Inputs指向的入口(下称Inputs入口),另一个是解码器侧Outputs指向的入口(下称Outputs入口)。
Inputs入口(包含Input Embedding部分)
Inputs入口输入的内容可以为one-hot或任何词嵌入模型生成的词向量(在此以one-hot举例)。假设总共词数word_num为512,输入的句子最大长度max_num(如果输入的序列太长,超过了max_num,则是保留左边的内容,把多余的直接舍弃)为3,句子总数batch_size为1(作为例子,仅用一个句子)。那么输入的矩阵inputs尺寸为(1,3,512),即只有一个句子,(如果有)多个句子中最大词数为3,词数为512。为了方便表示,省略1,之后的引例仅表示为(3,512)。
Outputs入口(包含Output Embedding部分)
Outputs入口分为 训练输入 和 预测输入 两种输入模式。
当模型在训练参数时,假设Inputs处输入一句‘I am a student’,那么Outputs处需要输入其目标语言的翻译。假设目标语言为中文,则应给Outputs处输入‘我是一名学生’。
当模型在预测时,假设Inputs处输入一句‘I am a student’,那么Outputs处只需要输入一个起始符,比如等用作‘开始翻译’的信号。
(2) 位置编码(positional encoding)
由于transformer是并行化计算的,并行化计算会忽略每个词的前后顺序,因此作者引入了位置编码。
《Attention Is All You Need》论文中Transformer使用的是正余弦位置编码。
位置编码通过使用不同频率的正弦、余弦函数生成,然后和对应的位置的词向量相加,位置向量维度必须和词向量的维度一致。过程如上图,PE(positional encoding)计算公式如下:
解释一下上面的公式:
pos表示单词在句子中的绝对位置,pos=0,1,2…,例如:Jerry在"Tom chase Jerry"中的pos=2;
dmodel表示词向量的维度,在这里dmodel=512;
2i和2i+1表示奇偶性,i表示词向量中的第几维,例如这里dmodel=512,故i=0,1,2…255。
需要明确的是,建模位置信息(无论是绝对位置还是相对位置)并不是必须用到三角函数。我(被引用的知乎答主)想,作者在这里使用正余弦函数,只是根据归纳偏置和一些经验作出的选择罢了。
另外,对于位置编码来说,对矩阵inputs拼接相加都可以,只是本身词向量的维度512维就已经蛮大了,再拼接一个512维的位置向量,变成1024维,这样训练起来会相对慢一些,影响效率。两者的效果是差不多地,既然效果差不多当然是选择学习习难度较小的相加了。
Transformer 的 Decoder的输入与Encoder的输出处理方法步骤是一样的。一个接受source数据,一个接受target数据。对应到上面例子里面就是:Encoder接受英文"Tom chase Jerry",Decoder接受中文"汤姆追逐杰瑞"。只是在有target数据时也就是在进行有监督训练时才会接受Outputs Embedding,进行预测时则不会接收。
2 Encoder
(1) 自注意力机制(Self-attention Mechanism)
多头(Multi-Head)
多头机制准备了h组上面的三个矩阵,重复上面的操作获得h组尺寸为(3,64)的Q、K和V矩阵。公式:
计算获得h个子Attention矩阵(3,64)。其中
Transformer也就是用了这种方式实现了单词间的自注意力机制。
另外,Encoder中的多头需要进行mask处理,至于如何处理请见Decoder中的附带掩码的多头机制(Masked Multi-Head Attention)。
(2) 残差连接(Add)
每经过一定的处理后,矩阵携带的信息梯度将会有一定程度的‘消失’。为了缓和这个问题,在处理前保留原来的矩阵,再与处理后的矩阵对应数值相加,这样就可以在一定程度上避免梯度消失的情况。
(3) 层标准化(Norm, Layer Normalization) 是一种优化行为。
为什么要进行Normalize呢?
在神经网络进行训练之前,都需要对于输入数据进行Normalize归一化,目的有二:1,能够加快训练的速度。2.提高训练的稳定性。
为什么使用Layer Normalization(LN)而不使用Batch Normalization(BN)呢?
先看图,LN是在同一个样本中不同神经元之间进行归一化,而BN是在同一个batch中不同样本之间的同一位置的神经元之间进行归一化。
BN是对于相同的维度进行归一化,但是咱们NLP中输入的都是词向量,一个300维的词向量,单独去分析它的每一维是没有意义地,在每一维上进行归一化也是适合地,因此这里选用的是LN。
(4) 前馈神经网络(Feed Forward, Feedforward Neural Network)
这里的全连接层是一个两层的神经网络,先线性变换,然后ReLU非线性,再线性变换。其公式为:
运算后,维度没有发生变化,这两层网络就是为了将输入的Z映射到更加高维的空间中,然后通过非线性函数ReLU进行筛选,筛选完后再变回原来的维度。
3 Decoder
(1) 附带掩码的多头机制(Masked Multi-Head Attention)
Masked Multi-Head Attention与Encoder的Multi-Head Attention计算原理一样,只是在原来的基础上多加了一个掩码(mask码),它对某些值进行掩盖,使其在参数更新时不产生效果。
Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。
padding mask
因为放入Inputs入口用来训练的每个句子并不能保证长度一致,因此要对输入序列进行对齐。具体来说,就是给在较短的序列后面填充不会影响训练的数据,因为这些填充的位置,其实是没什么意义的,所以attention机制不应该把注意力放在这些位置上。
一般可能会想到将填充的数据统统设为0,但这是不对的。因为在softmax中 e^0=1会对训练产生一些影响。
正确的做法是把这些位置的值加上一个非常大的负数(负无穷),这样的话,经过 softmax,这些位置的概率就会接近0。
sequence mask
sequence mask 是为了使得 Decoder 不能看见未来的信息。对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此需要想一个办法,把 t 之后的信息给隐藏起来。具体做法是产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的。
sequence mask在训练的时候是需要的,因为训练时,每次我们都是将target数据完整输入进decoder中的。而预测时不需要,预测的时候我们只能得到前一时刻预测出的输出。
在Encoder中的Multi-Head Attention也需要进行mask,只不过Encoder中只需要padding mask即可,而Decoder中需要padding mask和sequence mask。
4 Output
Output如图中所示,首先经过一次线性变换,然后Softmax得到输出的概率分布,然后通过词典,输出概率最大的对应的单词作为我们的预测输出。
5 参数介绍
可任意设定的参数
总共词数 word_num
句子最大长度 max_num
句子总数 batch_size
输入矩阵 inputs(batch_size,max_num,word_num)
多头数 h
编码器和解码器个数 N
6 图解流程
7 Transformer 评价
优点
(1) 虽然Transformer最终也没有逃脱传统学习的套路,Transformer也只是一个全连接(或者是一维卷积)加Attention的结合体。但是其设计已经足够有创新,因为其抛弃了在NLP中最根本的RNN或者CNN并且取得了非常不错的效果,算法的设计非常精彩,值得每个深度学习的相关人员仔细研究和品位;
(2) Transformer的设计最大的带来性能提升的关键是将任意两个单词的距离是1,这对解决NLP中棘手的长期依赖问题是非常有效的;
(3) Transformer不仅仅可以应用在NLP的机器翻译领域,甚至可以不局限于NLP领域,是非常有科研潜力的一个方向;
(4) 算法的并行性非常好,符合目前的硬件(主要指GPU)环境;
(5) Transformer为后来诸多重要的大型预训练语言模型开辟了道路:之后著名的模型如BERT及OpenAI GPT等都是在Transformer模型的基础上创造而来的。
局限性
(1) 粗暴地抛弃RNN和CNN虽然非常炫技,但是它也使模型丧失了捕捉局部特征的能力,RNN + CNN + Transformer的结合可能会带来更好的效果;
(2) 完全基于self-attention,对于词语位置之间的信息有一定的丢失,虽然加入了positional encoding来解决这个问题,但也还存在着可以优化的地方。
以上是关于自用预训练语言模型->Transformer模型的主要内容,如果未能解决你的问题,请参考以下文章
NLP预训练语言模型(三):逐步解析Transformer结构
让预训练语言模型读懂数字:超对称技术发布 10 亿参数 BigBang Transformer [乾元]金融大规模预训练语言模型...