attention is all your need论文阅读总结

119 阅读7分钟

1. 什么是注意力机制

注意力机制就是从上下文中找到需要注意的关键信息,帮助模型理解每个字的正确含义。

2. Transformer原理

Transformer框架有两个核心的组件Encoder和Decoder,

3. Transformer中的Token

模型是无法处理文本的,只能处理数字,就像ASCII码表,Unicode码表一样,计算机在处理文本时也是将文本转化为对应的字码。并为每个字码编写一个对应的数字记录在表里,最后再处理。

3.1将模型拆分成token

所以模型在处理文本时,就是讲文本转化为对应的字码,也就是token。具体怎么将文本转化为Token有以下几种方式;

3.1.1 基于单词的标词器
第一种标词器是基于单词的。它通常很容易设置和使用。只需要几条规则,并且通常会产生不错的效果。
3.1.2 基于字符的分词器
基于字符的分词器,就是将单词的每个字符作为标记,但是这样模型就需要处理大量的标记量。为了弥补这两种标记模式的不足,可以采取分词的标记器。
3.1.3 基于分词的标记器
基于分词的标记器,会将一个单词拆分为多个子单词。

3.2 transformer的组件

transformer的组件包括encoder和decoder,这两个组件分别是编码器和解码器。Transformers是由多个独立的encoder和decoder组成的。每个encoder是由注意力层和前馈网络层组成的。decoder除了注意力层和前馈网络层,中间还有一个编解码注意力层,这个组件主要是帮助Decoder输入。

3.3 理解token在编码器中的流转

模型将文本转化为token后,紧接着就会将token转化为向量表达。得到每个token的向量后,从最底层的encoder开始,每个token就会沿着自己的路径,由下往上流转,经过每一个encoder。对每个encoder来说,共同点是他们接收的向量的维度是相同的。为了保证这一点,所有token都需要被embedding成大小相同的向量。
3.3.1 对Token进行位置编码
在流经encoder
这里需要注意的是,不同位置的向量在进入自注意层时,是有相互依赖关系的,这就是文本上下文信息。
试想一下,一段文本如果不区分位置信息,就会造成理解有问题。例如:sam is looking for ball. ball is looking for sam.所以需要对token进行位置编码。
但是token流向网络反馈层后就不需要注意位置,可以并发处理。
传统的CNN网络是如何处理文本上下文的呢?传统的CNN通过顺序处理token来解决这个问题。这样就需要处理每个token的参数保持一致,例如:输入参数,隐藏参数,输出参数。但在CNN的窗口很小,就造成CNN处理大量的token后就不记得前面处理过的token,造成上下文理解缺失。
Transformer是如何对token进行位置编码的呢?
我们知道token会被转换为512纬的向量,我们可以把这个向量拆分成两组,奇数向量和偶数向量。对于奇数向量,我们使用cos函数处理,加上位置的pos;对于偶数向量,我们使用sin函数,加上位置信息的pos。最后拿token的embedding和pos的embedding相加。得到位置编码后的positional input embeddings。
自注意力机制
有了
残差网络
残差网络在transforemer中的利用,原始向量X通过自注意力层得到向量Z,然后把向量X和向量Z做残差链接,然后进过LayerNorm函数做归一化处理。计算得到新的Z向量,然后输入到前馈层。
前馈网络
归一化后的残差输出,被送入到前馈网络进一步处理,前馈网络把输出结果和输入做残差链接,然后使用LayerNorm函数做归一化处理。
理解Token在解码器中的流转
解码器和编码器大概相同,但是也有不同的地方,解码器拥有两个多头注意力层,一个前馈网络层,并且每层之间都要做归一化。
解码器不仅接受来自前一个解码器的输出,还接收来自编码器的输出。

150.png 在Transformer模型的训练过程中,解码器的第一个输出序列通常是根据特定的输出标记,这个起始标记是一个特定的符号,他标志着输出序列的开始。以下是解码器如何获得第一个输出序列的详细过程:

1. 起始标记
    解码器的输入序列是以一个起始标记开始的。
2. 初始化状态
    解码器在开始输出之前,会接收到编码器的输出,即编码器的上下文向量。在某些情况下,解码器的初始化也可以通过一个额外的向量来初始化。
3. 自注意力机制
    解码器使用自注意力机制处理起始标记,由于没有之前的输出,自注意力机制会更关注标记本身。
4. 编码器-解码器注意力
    解码器使用编码-解码自注意力机制来处理编码器的输出,这让解码器在生成第一个输出序列时就利用输入的人序列。
5. 输出层
    解码器将上述步骤得到的向量作为概率输出,
6. 选择第一个输出
    在训练阶段,解码器会使用强制策略,这意味这解码器的第一个输出会是目标序列里的第一个词。但是在推理阶段,解码器会根据概率选择概率最高的词输出。
7. 迭代生成
    一旦产生第一个输出。解码器会将其作为下一步的输入,重复上述步骤进行输出。

多头注意力机制

    需要注意的是解码器的第一层是一个特殊的多头注意力层,是一个执行了mask的注意力层。因为解码器是自回归的,所以需要防止解码器处理当前token后面的内容。原因是模型在训练的时候,是不应该未来输出的tokne是什么的。我们就需要保证解码器在计算某个token的注意力值时,只关注已经处理过的token,屏蔽掉当前token之后的token。
    

151.png

计算注意力值

在解码器中计算注意力值时,是用Encoder最后的

线性分类器

解码器最后输出一组向量,我们怎么转换为文本呢?这就是liner层要做的事。liner层属于前馈网络层,前馈网络层由一层层线性层Liner组成,中间是Relu函数,将前馈网络输入结果和线性网络输出结果做残差连接。liner层后面是softmax层,其实是softmax函数。
liner是一个简单的全连接神经网络,**它将解码器产生的向量投射到一个更大的向量中**,称为logits向量。
假设我们的模型从训练数据中学到了10000个词,那logits向量就有10000个单元格宽,每个单元格对应一个唯一单词的分数,然后softmax层就将这些分数转化为概率,按照概率高的输出,就转化为单词了。

编解码器的协同工作

transformer如何提升上下文长度

传统的transformer模型中上下文长度是固定的。这就会限制模型在长文本上的理解和推理能力。为了解决这个问题,月之暗面在Transformer做了一些扩展,实现了自己的框架Transformer-XL框架。