Transformer算法说明

1 前言

Transformer算法是基于attention算法改造的,它去掉了attention算法的rnn操作从而实现了并行化操作。所以要先从attention算法说起。

本文参考:https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/%E7%AF%87%E7%AB%A02-Transformer%E7%9B%B8%E5%85%B3%E5%8E%9F%E7%90%86/2.2-%E5%9B%BE%E8%A7%A3transformer.md

2 Attention算法

2.1 Seq2seq

Attention算法最主要的用途是seq2seq场景,也就是从一个文本序列得到另一个文本序列。最初的seq2seq是基于rnn算法的,rnn的过程说明如下:

输入input#1 和hidden state#0两类信息,输出output#1 和 hidden state#1两类信息。基于RNN的seq2seq整体动态过程如下:

静态效果如下:

Seq2seq以机器翻译为例描述为:seq2seq分为encoder和decoder两个部分。

在encoder阶段,根据输入的单词的embedding信息,rnn的每个时间点会输出hidden state。然后将该hidden state与下一个时间点的输入再输入rnn模型继续生成新的hidden state,直到输出最后一个hidden state,我们称该hidden state为context,因为它汇总了所有输入单词的信息。

       穿插机器翻译的特殊符号:<bos>句子的开始,<eos>句子的结尾,<pad>填充字符。

       在decoder阶段,将<bos>的embedding和context输入rnn模型得到hidden state,hidden state可以通过fc映射到voc上的概率分布,然后取argmax上的单词为第一个预测单词。接着将上一步的hidden state和context再输入rnn模型继续得到下一步的hidden state,同时可以预测出第二个翻译单词。该过程直到预测出的单词为<eos>为止。

      

Seq2seq的瓶颈:

  1. context向量很难包含所有文本序列的信息
  2. rnn递归地编码文本序列使得模型在处理长文本时面临非常大的挑战,比如rnn处理到500个单词的时候,很难再包含1-499个单词中的所有信息了。

2.2 attention算法

attention算法的编码器会把更多的数据传递给解码器,它会把所有时间步的hidden state传递给解码器,而不是只传递最后一个hidden state。

Context每一步也不一样了,解码器根据输入的所有hidden state计算每步的context操作如下:

具体过程如下:

  1. 解码器查看所有接收到的编码器的hidden state
  2. 给每个hidden state计算出一个分数
  3. 所有hidden state的分数经过softmax进行归一化
  4. 将每个hidden state乘以所对应的分数,从而能够让高分对应的hidden state会被放大,而低分对应的hidden state会被缩小
  5. 将所有hidden state根据对应分数进行加权求和,得到对应时间步的context向量

解码器整个过程如下:

  1. 注意力模型的解码器RNN输入包括:一个word embedding向量(我理解是<bos>的向量),和一个初始化好的解码器hidden state(hinit)
  2. Rnn处理上述2个输入,产生一个输出和一个新的hidden state(h4)
  3. 使用编码器的所有hidden state向量和h4向量来计算整个时间步的context向量
  4. 把h4和c4拼接起来,得到一个橙色的向量
  5. 把这个橙色向量输入一个前馈神经网络
  6. 根据前馈神经网络的输出向量得到输出单词:假设输出序列可能的单词有N个,那么这个前馈神经网络的输出向量通常是N维的,每个维度的下标对应一个输出单词,每个维度的数值对应的是该单词的输出概率
  7. 在下一个时间步重复1-6步骤

3 transformer算法

3.1 encoders和decoders整体框架

每层编码器网络结构是一样的,每层解码器网络结构也是一样的。不同层编码器和解码器结构不共享参数。

单层编码器由2部分组成:

  1. Self-Attention Layer
  2. Feed Forward Neural Network(前馈神经网络)

Self-Attention层处理一个词向量的时候,不仅会使用这个词本身的信息,也会使用句子中其他词的信息,它的输入输出维度保持不变。

3.2 输入处理

将输入文本序列的每个词转换为一个词向量,再加上位置向量来得到该词的最终向量。

加:并非concat的方式,而是直接数值相加。

3.3 Self-Attention

假设一句话输入两个单词:Thinking Machines。

第1步,对输入编码器的词向量进行线性变换:Query向量q1和q2,Key向量k1和k2,value向量v1和v2。这3个向量是词向量分别和3个参数矩阵相乘得到的,而这个矩阵也是模型要学习的参数。

穿插:Query向量、key向量、value向量其实只是3个向量,给他们加上一个名称而已。Query和key计算得到attention得分,然后根据attention得分对value进行加权求和。

第2步,计算attention分数。Query向量和其他位置的每次词的key向量进行点积得到。

第3步,把每个分数除以sqrt(dk),dk是key向量的维度。除以一个数是为了在反向传播时,求梯度更加稳定。

第4步,把这些分数经过一个softmax函数

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

第6步,把第5步得到的value向量相加,就得到了self attention在当前位置(比如第1个位置)对应的输出。

3.4 多头注意力机制

它增强了attention层的能力。

  1. 扩展了模型关注不同位置的能力。第一个位置的输出​包含了句子中其他每个位置的很小一部分信息,但​仅仅是单个向量,所以可能仅由第1个位置的信息主导了。而当我们翻译句子:The animal didn’t cross the street because it was too tired时,我们不仅希望模型关注到"it"本身,还希望模型关注到"The"和“animal”,甚至关注到"tired"。
  2. 多头注意力机制赋予attention层多个“子表示空间”。多头注意力机制会有多组​WQ,WK,WV 的权重矩阵(在 Transformer 的论文中,使用了 8 组注意力),,因此可以将​变换到更多种子空间进行表示。

在多头注意力机制中,为每组注意力设定单独的WQ,WK,WV参数矩阵,将输入X和每组注意力的WQ,WK,WV相乘,得到8组Q,K,V矩阵。接着,把每组K,Q,V计算得到每组的Z矩阵,就得到8个Z矩阵。

由于前馈神经网路层接收的是1个矩阵,而不是8个矩阵,所以把8个子矩阵拼接成一个大的矩阵,然后和另一个权重矩阵WO相乘做一次变换,映射到前馈神经网络所需要的维度。

整个多头注意力机制的流程放到一张图中如下:

3.5 残差连接和标准层

3.6 解码器

编码器一般有多层,第一个编码器的输入是一个序列文本,最后一个编码器输出是一组序列的向量,这组序列向量会作为解码器的K、V输入,其中K=V=解码器输出的序列向量表示。

解码阶段的每一个时间步都输出一个翻译后的单词,解码器当前时间步的输出又重新作为Q和编码的输出K、V共同作为下一个时间步解码器的输入。然后重复整个过程,直到输出一个结束符。

解码器的self attention和编码器的self attention层的区别:

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

3.7 线性层和softmax

线性层是一个普通的全连接神经网络,把解码器输出的向量,映射到一个更大的向量。假设模型有10000个英语单词,此向量便会有10000个数字,每个数表示一个单词的分数。

然后,softmax层会把这些分数转换为概率。然后选择最高概率的那个数字对应的词,就是整个时间步的输出单词。

3.8 损失函数

交叉熵,使得输出概率分布和目标概率分布接近一致。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值