基于Transformers的自然语言处理入门【二】-Transformer相关原理

基于Transformers的自然语言处理入门(二)

  • 1 Tansformer相关原理
    • 1.1 seq2seq框架
    • 1.2 Attention
    • 2 Transformer详解
    • 2.1 多头注意力机制
    • 2.2 解码器
    • 2.3 线性层和softmax

1 Tansformer相关原理

对于Transformer相关学习,我们的学习路径:Attention->Transformer-Bert-NLP。Attention出现的原因是什么:基于循环神经网络(RNN)一类的seq2seq模型,在处理长文本时遇到了挑战,而对长文本中不同位置的信息进行attention有助于提升RNN的模型效果。

1.1 seq2seq框架

seq2seq是一种常见的NLP模型结果,即为"端到端",具体相关的开创性论文:Sutskever等2014年发表的Sequence to Sequence Learning with Neural Networks 和 Cho等2014年发表的Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation。
端到端模型说白了从一个序列模型到领一个序列模型。它由编码器和解码器组成。seq2seq模型中的编码器和解码器一般采用的是循环神经网络RNN(Transformer模型还没出现的过去时代),编码器将输入的序列编码成context向量,然后解码器根据context向量解码出来对应的序列,如机器翻译,输入法语序列,输出英语序列。其中context的数组长度是基于编码器RNN隐藏层神经元数量的。
RNN具体处理过程:

  1. 假设序列输入是一个句子,这个句子可以由n个词标识:sentence={w1, w2,…,wn};
  2. RNN首先将句子中的每一个词映射称为一个向量得到一个向量序列:X={x1,x2, …, wn},每个单词映射得到的向量通常叫做word embedding。
  3. 然后在处理t 属于[1,n]个时间步的序列输入xt时,RNN网络的输入和输出可以表示为ht=RNN(xt, ht-1
  • 输入:RNN在时间步t的输入之一为单词wt经过映射得到的向量xt
  • 输入:RNN在另一个输入为上一个时间步t-1得到的hidden state向量ht-1,同样是一个向量。
  • 输出:RNN在时间步t的输出为ht hidden state向量。

1.2 Attention

基于RNN的seq2seq模型编码器所有信息都编码到了一个context向量中,便是这类模型的瓶颈,一方面单个向量很难包含所有文本序列的信息,另一方面RNN递归地编码文本序列使得模型在处理长文本时面临非常大的挑战。面对上述问题,Bahdanau等2014发布的Neural Machine Translation by Jointly Learning to Align and Translate 和 Luong等2015年发布的Effective Approaches to Attention-based Neural Machine Translation 两篇论文中,提出了一种叫做注意力attetion的技术。通过attention技术,seq2seq模型极大地提高了机器翻译的质量。归其原因是:attention注意力机制,使得seq2seq模型可以有区分度、有重点地关注输入序列
注意力模型的解码器在产生输出之前,做了一个额外的attention处理。如下图所示,具体为:

  1. 由于编码器中每个 hidden state(隐藏层状态)都对应到输入句子中一个单词,那么解码器要查看所有接收到的编码器的 hidden state(隐藏层状态)。
  2. 给每个 hidden state(隐藏层状态)计算出一个分数(我们先忽略这个分数的计算过程)。
  3. 所有hidden state(隐藏层状态)的分数经过softmax进行归一化。
  4. 将每个 hidden state(隐藏层状态)乘以所对应的分数,从而能够让高分对应的 hidden state(隐藏层状态)会被放大,而低分对应的 hidden state(隐藏层状态)会被缩小。
  5. 将所有hidden state根据对应分数进行加权求和,得到对应时间步的context向量。

2 Transformer详解

Transformer模型在2017年被google提出,直接基于Self-Attention结构,取代了之前NLP任务中常用的RNN神经网络结构,与RNN这类神经网络结构相比,Transformer的一个巨大优点是,模型在处理序列输入时,可以对整个序列输入进行并行计算,不需要按照时间步循环递归处理输入序列。
基于Transformers的自然语言处理入门【二】-Transformer相关原理_第1张图片
基于Transformers的自然语言处理入门【二】-Transformer相关原理_第2张图片
我们可以看到,编码部分(encoders)由多层编码器(Encoder)组成(Transformer论文中使用的是6层编码器,这里的层数6并不是固定的,你也可以根据实验效果来修改层数)。同理,解码部分(decoders)也是由多层的解码器(Decoder)组成(论文里也使用了6层解码器)。每层编码器网络结构是一样的,每层解码器网络结构也是一样的。不同层编码器和解码器网络结构不共享参数。
对应单层encoder主要由以下两部分组成

  • Self-Attention Layer
  • Feed Forward Neural Network(前馈神经网络,缩写为 FFNN)
    编码器的输入文本序列w1, w2, …, wn最开始需要经过embedding转换,得到每个单词的向量表示,x1,x2,…, xn 。对应xi是维度为d的向量,然后所有向量经过一个self-attention神经网络层进行变换和信息交互得到h1,h2,…, hn ,其中hi 是纬度为d的向量。self-attention层处理一个词向量的时候,不仅会使用这个词本身的信息,也会使用句子中其他词的信息。Self-Attention层的输出会经过前馈神经网络得到新的x1,x2,…, xn,然后将向量送入下一次encoder,继续相同的操作。
    那么xiangdu7iyign的,解码器在编码器self-attention和FFNN中间插入了一个Encoder-Decoder Attention层,这个层帮助解码器聚焦于输入序列最相关的部分。
    基于Transformers的自然语言处理入门【二】-Transformer相关原理_第3张图片

2.1 多头注意力机制

Transformer 的论文通过增加多头注意力机制(一组注意力称为一个 attention head),进一步完善了Self-Attention。这种机制从如下两个方面增强了attention层的能力:

  • 它扩展了模型关注不同位置的能力。上述内容仅仅是单个向量,所以可能仅由第1个位置的信息主导了。而当我们翻译句子:The animal didn’t cross the street because it was too tired时,我们不仅希望模型关注到"it"本身,还希望模型关注到"The"和“animal”,甚至关注到"tired"。这时,多头注意力机制会有帮助。
  • 多头注意力机制赋予attention层多个“子表示空间”。
    总结一下就是:
  1. 把8个矩阵 {Z0,Z1…,Z7} 拼接起来
  2. 把拼接后的矩阵和WO权重矩阵相乘
  3. 得到最终的矩阵Z,这个矩阵包含了所有 attention heads(注意力头) 的信息。这个矩阵会输入到FFNN (Feed Forward Neural Network)层。
    基于Transformers的自然语言处理入门【二】-Transformer相关原理_第4张图片
    学习网多头注意力机制,让我们再来看下当我们前面提到的it例子,不同的attention heads (注意力头)对应的“it”attention了哪些内容。下图中的绿色和橙色线条分别表示2组不同的attentin heads:
    基于Transformers的自然语言处理入门【二】-Transformer相关原理_第5张图片

2.2 解码器

解码器中的 Self Attention 层,和编码器中的 Self Attention 层的区别:

  • 在解码器里,Self Attention 层只允许关注到输出序列中早于当前位置之前的单词。具体做法是:在 Self Attention 分数经过 Softmax 层之前,屏蔽当前位置之后的那些位置(将attention score设置成-inf)。
  • 解码器 Attention层是使用前一层的输出来构造Query 矩阵,而Key矩阵和 Value矩阵来自于编码器最终的输出。

2.3 线性层和softmax

Decoder 最终的输出是一个向量,其中每个元素是浮点数。我们怎么把这个向量转换为单词呢?这是线性成和softmax完成的。
线性层就是一个普通的全连接神经网络,可以把解码器输出的向量,映射到一个更大的向量,这个向量称为 logits 向量:假设我们的模型有 10000 个英语单词(模型的输出词汇表),此 logits 向量便会有 10000 个数字,每个数表示一个单词的分数。
然后,Softmax 层会把这些分数转换为概率(把所有的分数转换为正数,并且加起来等于 1)。然后选择最高概率的那个数字对应的词,就是这个时间步的输出单词。

额外提一下greedy decoding和beam search的概念:
Greedy decoding:由于模型每个时间步只产生一个输出,我们这样看待:模型是从概率分布中选择概率最大的词,并且丢弃其他词。这种方法叫做贪婪解码(greedy decoding)。
Beam search:每个时间步保留k个最高概率的输出词,然后在下一个时间步,根据上一个时间步保留的k个词来确定当前应该保留哪k个词。假设k=2,第一个位置概率最高的两个输出的词是”I“和”a“,这两个词都保留,然后根据第一个词计算第2个位置的词的概率分布,再取出第2个位置上2个概率最高的词。对于第3个位置和第4个位置,我们也重复这个过程。这种方法称为集束搜索(beam search)。

【参考】DataWhale

你可能感兴趣的:(自然语言处理,transformer,自然语言处理,神经网络)