Attention和Transformer【datewhale task02】

一、Attention

基于循环神经网络(RNN)一类的seq2seq模型,在处理长文本时遇到了挑战,而对长文本中不同位置的信息进行attention有助于提升RNN的模型效果。

1.1 Seq2Seq框架

全称是:sequence to sequence(序列到序列)

来源于两篇论文:

https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf

http://emnlp2014.org/papers/pdf/EMNLP2014179.pdf

seq2seq模型的输入可以是一个(单词、字母或者图像特征)序列,输出是另外一个(单词、字母或者图像特征)序列。

1.2 Seq2seq细节

seq2seq模型由编码器(Encoder)和解码器(Decoder)组成。

编码器:编码器会处理输入序列中的每个元素并获得输入信息,这些信息会被转换成为一个context向量。

解码器:解码器通过context向量中的信息,逐个元素输出新的序列。

seq2seq模型中的编码器和解码器一般采用的是循环神经网络RNN(Transformer模型还没出现的过去时代)。编码器将输入的法语单词序列编码成context向量,然后解码器根据context向量解码出英语单词序列。

RNN如何具体地处理输入序列的?

1、假设输入是一个句子,句子由n个词表示 sentence = \{w_1, w_2,...,w_n\}

2、RNN首先将句子中的每一个词映射成为一个向量得到一个向量序列: X = \{x_1, x_2,...,x_n\},每个单词映射得到的向量通常又叫做:word embedding。

3、然后在处理第t \in [1,n]​个时间步的序列输入​x_t时,RNN网络的输入和输出可以表示为:​h_{t} = RNN(x_t, h_{t-1})

        输入:RNN在时间步t​的输入之一为单词​w_t经过映射得到的向量x_t​。

        输入:RNN另一个输入为上一个时间步t-1​得到的hidden state向量​h_{t-1},同样是一个向量。

        输出:RNN在时间步t​的输出为h_t​ hidden state向量。

例如:编码器首先按照时间步依次编码每个法语单词,最终将最后一个hidden state也就是context向量传递给解码器,解码器根据context向量逐步解码得到英文输出。

1.3 Attention

基于RNN的seq2seq模型编码器所有信息都编码到了一个context向量中,便是这类模型的瓶颈。一方面单个向量很难包含所有文本序列的信息,另一方面RNN递归地编码文本序列使得模型在处理长文本时面临非常大的挑战(比如RNN处理到第500个单词的时候,很难再包含1-499个单词中的所有信息了)。

论文:

https://arxiv.org/abs/1409.0473

https://arxiv.org/abs/1508.04025

两篇论文中,提出了一种叫做注意力attetion的技术。通过attention技术,seq2seq模型极大地提高了机器翻译的质量。归其原因是:attention注意力机制,使得seq2seq模型可以有区分度、有重点地关注输入序列。

一个注意力模型与经典的seq2seq模型主要有2点不同:

A. 首先,编码器会把更多的数据传递给解码器。编码器把所有时间步的 hidden state(隐藏层状态)传递给解码器,而不是只传递最后一个 hidden state(隐藏层状态)

B. 注意力模型的解码器在产生输出之前,做了一个额外的attention处理。如下图所示,具体为:

        1.由于编码器中每个hidden state(隐藏层状态)都对应到输入句子中的一个单词,那么解码器要查看所有接收到的编码器的 hidden state。

        2.给每个 hidden state计算出一个分数

        3.所有 hidden state 的分数经过softmax进行归一化

        4.将每个 hidden state 乘以所对应的分数,从而能够让高分对应的 hidden state被放大,而低分的会被缩小。

        5.将所有的 hidden state 根据对应分数进行加权求和,得到对应时间步的 context 向量。

attention可以简单理解为:一种有效的加权求和技术,其艺术在于如何获得权重。

结合注意力的seq2seq模型解码器全流程

1、注意力模型的解码器RNN的输入包括:一个 word embedding 向量,和一个初始化好的解码器 hidden state。

2、RNN 处理上述的 2 个输入,产生一个输出和一个新的 hidden state(h4)

3、注意力的步骤:我们使用编码器的所有 hidden state向量和 h4 向量来计算这个时间步的context向量(C4)

4、把 h4 和 C4 拼接成一个向量。

5、把这个向量输入一个前馈神经网络(与模型一起训练)

6、根据前馈神经网络的输出向量得到输出单词:假设输出序列可能的单词有N个,那么这个前馈神经网络的输出向量通常是N维的,每个维度的下标对应一个输出单词,每个维度的数值对应的是该单词的输出概率。

7、在下一个时间步重复1-6步骤

二、Transformer

Transformer模型在2017年被google提出,直接基于Self-Attention结构,取代了之前NLP任务中常用的RNN神经网络结构,并在WMT2014 Englishto-German和WMT2014 English-to-French两个机器翻译任务上都取得了当时的SOTA。

与RNN这类神经网络结构相比,Transformer一个巨大的优点是:模型在处理序列输入时,可以对整个序列输入进行并行计算,不需要按照时间步循环递归处理输入序列。

 Transformer模型结构中的左半部分为编码器(encoder),右半部分为解码器(decoder)

2.1 Transformer宏观结构

Transformer最开始提出来解决机器翻译任务,因此可以看作是seq2seq模型的一种。

编码部分(encoders)由多层编码器(Encoder)组成(Transformer论文中使用的是6层编码器,这里的层数6并不是固定的,你也可以根据实验效果来修改层数)。同理,解码部分(decoders)也是由多层的解码器(Decoder)组成(论文里也使用了6层解码器)。每层编码器网络结构是一样的,每层解码器网络结构也是一样的。不同层编码器和解码器网络结构不共享参数。

 单层encoder主要由以下两部分组成:

① Self-Attention Layer

② Feed Forward Neural Network(前馈神经网络,缩写 FFNN)

编码器的输入文本序列w_1, w_2,...,w_n最开始需要经过embedding转换,得到每个单词的向量x_1, x_2,...,x_n表示,其中x_i \in \mathbb{R}^{d}是维度为d的向量,然后所有向量经过一个Self-Attention神经网络层进行变换和信息交互得到,其中是维度为的向量。self-attention层处理一个词向量的时候,不仅会使用这个词本身的信息,也会使用句子中其他词的信息(你可以类比为:当我们翻译一个词的时候,不仅会只关注当前的词,也会关注这个词的上下文的其他词的信息)。Self-Attention层的输出会经过前馈神经网络得到新的x_1, x_2,..,x_n,依旧是个维度为的向量。这些向量将被送入下一层encoder,继续相同的操作。

单层decoder

与编码器对应,如下图,解码器在编码器的self-attention和FFNN中间插入了一个Encoder-Decoder Attention层,这个层帮助解码器聚焦于输入序列最相关的部分(类似于seq2seq模型中的 Attention)

2.2 Transformer结构细节

2.2.1输入处理

词向量

常见的NLP任务,首先会使用词嵌入算法(embedding algorithm),将输入文本序列的每个词转换为一个词向量。实际应用中的向量一般是 256 或者 512 维。

假设我们的输入文本是序列包含了3个词,那么每个词可以通过词嵌入算法得到一个4维向量,于是整个输入被转化成为一个向量序列。在实际应用中,我们通常会同时给模型输入多个句子,如果每个句子的长度不一样,我们会选择一个合适的长度,作为输入文本序列的最大长度:如果一个句子达不到这个长度,那么就填充先填充一个特殊的“padding”词;如果句子超出这个长度,则做截断。最大序列长度是一个超参数,通常希望越大越好,但是更长的序列往往会占用更大的训练显存/内存,因此需要在模型训练时候视情况进行决定。

输入序列每个单词被转换成词向量表示还将加上位置向量来得到该词的最终向量表示。

位置向量

Transformer模型对每个输入的词向量都加上了一个位置向量。这些向量有助于确定每个单词的位置特征,或者句子中不同单词之间的距离特征。词向量加上位置向量背后的直觉是:将这些表示位置的向量添加到词向量中,得到的新向量,可以为模型提供更多有意义的信息,比如词的位置,词之间的距离等。

2.2.2编码器

编码部分的输入文本序列经过输入处理之后得到了一个向量序列,这个向量序列将被送入第1层编码器,第1层编码器输出的同样是一个向量序列,再接着送入下一层编码器:第1层编码器的输入是融合位置向量的词向量,*更上层编码器的输入则是上一层编码器的输出*。

 self-attention计算的6个步骤

第1步:对输入编码器的词向量进行线性变换得到:Query向量:q_1, q_2 ,Key向量: k_1, k_2,Value向量:v_1, v_2 。这3个向量是词向量分别和3个参数矩阵相乘得到的,而这个矩阵也是是模型要学习的参数。

Query 向量,Key 向量,Value 向量是什么含义呢?

其实它们就是 3 个向量,给它们加上一个名称,可以让我们更好地理解 Self-Attention 的计算过程和逻辑。attention计算的逻辑常常可以描述为:query和key计算相关或者叫attention得分,然后根据attention得分对value进行加权求和。

第2步:计算Attention Score(注意力分数)。假设我们现在计算第一个词Thinking 的Attention Score(注意力分数),需要根据Thinking 对应的词向量,对句子中的其他词向量都计算一个分数。这些分数决定了我们在编码Thinking这个词时,需要对句子中其他位置的词向量的权重。

第3步:把每个分数除以\sqrt{d_k} ​,d_k​是Key向量的维度。你也可以除以其他数,除以一个数是为了在反向传播时,求梯度时更加稳定。

第4步:接着把这些分数经过一个Softmax函数,Softmax可以将分数归一化,这样使得分数都是正数并且加起来等于1, 如下图所示。

这些分数决定了Thinking词向量,对其他所有位置的词向量分别有多少的注意力。

第5步:得到每个词向量的分数后,将分数分别与对应的Value向量相乘。这种做法背后的直觉理解就是:对于分数高的位置,相乘后的值就越大,我们把更多的注意力放到了它们身上;对于分数低的位置,相乘后的值就越小,这些位置的词可能是相关性不大的。

第6步:把第5步得到的Value向量相加,就得到了Self Attention在当前位置(这里的例子是第1个位置)对应的输出。

在实际的代码实现中,Self Attention的计算过程是使用矩阵快速计算的,一次就得到所有位置的输出向量。

多头注意力机制

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

①它扩展了模型关注不同位置的能力。

②多头注意力机制赋予attention层多个“子表示空间”。

残差连接

到目前为止,我们计算得到了self-attention的输出向量。而单层encoder里后续还有两个重要的操作:残差链接、标准化。

编码器的每个子层(Self Attention 层和 FFNN)都有一个残差连接和层标准化(layer-normalization),如下图所示。

 

 

2.2.3解码器

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

  1. 在解码器里,Self Attention 层只允许关注到输出序列中早于当前位置之前的单词。具体做法是:在 Self Attention 分数经过 Softmax 层之前,屏蔽当前位置之后的那些位置(将attention score设置成-inf)。

  2. 解码器 Attention层是使用前一层的输出来构造Query 矩阵,而Key矩阵和 Value矩阵来自于编码器最终的输出。

2.2.4线性层和softmax

Decoder 最终的输出是一个向量,其中每个元素是浮点数。

线性层就是一个普通的全连接神经网络,可以把解码器输出的向量,映射到一个更大的向量,这个向量称为 logits 向量:假设我们的模型有 10000 个英语单词(模型的输出词汇表),此 logits 向量便会有 10000 个数字,每个数表示一个单词的分数。

然后,Softmax 层会把这些分数转换为概率(把所有的分数转换为正数,并且加起来等于 1)。然后选择最高概率的那个数字对应的词,就是这个时间步的输出单词。

2.2.5损失函数

Transformer训练的时候,需要将解码器的输出和label一同送入损失函数,以获得loss,最终模型根据loss进行方向传播。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值