当前位置:   article > 正文

Transformer详解_transformer csdn

transformer csdn

Transformer详解

最近在搞nlp相关的内容,处于bert的大模型时代,transformer自然是nlp系列的入门内容。

起因

参考链接:https://jalammar.github.io/illustrated-transformer/

pytorch实现教程:http://nlp.seas.harvard.edu/2018/04/03/attention.html

原文链接:https://arxiv.org/pdf/1706.03762.pdf

传统的RNN策略存在一系列问题,比如难以并行化,容易遗忘较远处的历史信息等等。

transformer的策略是将固定长度的文本信息一次性输入到encoder中,允许模型无视距离的感知输入。

但是也存在一些问题,比如输入句子长度有限,没有位置信息等。作者也做了一些补救,增加了位置编码的策略

CNNRNNLSTMTransformer
概念通过卷积抽取特征序列特征抽取,融合前文的状态信息在RNN的基础上,增加了cel状态和三个门,用来保存历史状态信息提出self-attention和multi-head attention
优点简单快速能够融合序列的时序特征解决了梯度消失的问题,可以保存更长期的依赖更好的保存长期依赖信息,无视序列中的距离;可以并行化计算;语义表示更丰富
缺点无法对时间建模无法解决长期依赖的问题;存在梯度消失和梯度爆炸的问题太长的序列仍会丢失信息;时序模型,无法并行化运算,速度慢位置信息利用不明显,计算量大

为了后续查阅方便,本文就不从输入,结构,输出的顺序讲了,而是从核心模块开始讲起。

整体架构

一句话描述:一种简单的不依赖卷积或循环,仅仅只依赖attention的模型结构
transformer是一个12层的堆叠结构,由6层encoder和6层decoder组成,其中每层的结构都是一致的。
encoder:由self-attention + feedforward组成
decoder:由self-attention+masked self-attention + feed forward组成
其中,为了保证模型的收敛采用了残差网络结构+LN
在这里插入图片描述

encoder

self-attention

self-attention的本质就是计算当前词embedding与其他所有词embedding的相似度然后加权求和得到新的embedding。
可以用 s o f t m a x ( Q K T ) V softmax(QK^T)V softmax(QKT)V来进行表示,其中 s o f t m a x ( Q K T ) softmax(QK^T) softmax(QKT)表示着当前词与其他词的相似度。 V V V为当前词的值.。

在transfomer中,我们对每个词进行编码,得到其对应的embedding x x x,我们需要网络去学习参数 Q , K , V Q,K,V Q,K,V三个参数来实现attention的效果。

在这里插入图片描述
值得注意的是,这里每个embedding的 q , k , v q,k,v q,k,v是通过权重系数 W W W乘以自身embdding得到的,网络学习时学习的时矩阵参数 W W W
在这里插入图片描述在这里插入图片描述
以下是几个需要注意的点,也是八股文常问的点。
1、这里我们需要将计算的值进行scaled,即除以 ( d k ) \sqrt(d_k) ( dk),其中 d k d_k dk是词向量/隐藏层的维度。其原因有如下两点:

1、防止softmax的输入过大,导致偏导数趋近于0,除以该值可以保证梯度稳定回传
2、选择 ( d k ) \sqrt(d_k) ( dk)是因为可以使得 q ∗ k q*k qk的结果满足期望为0,方差为1的分布,类似于归一化

2、为什么Q和K使用不同的权重矩阵生成,而非使用同一个值及逆行自身的点乘?

K和Q的点乘是为了得到一个attention score矩阵,用来对V进行提纯。使用不同的权重矩阵计算是为了在不同的空间上进行投影,增强模型表达能力,提高score矩阵的泛化性。如果使用统一矩阵生成,则会引入对称性的问题,因为QK矩阵被投影到了同一个维度空间。

3、在计算attention时为什么选择点乘而非加法?两者在复杂度和效果上有无差别?

使用加法计算attention会更快,但是作为以恶搞整体计算attention的时候,相当于一个隐层,整体计算量与点积相似。而从效果来看,二者效果与 d k d_k dk有关, d k d_k dk越大加法的效果越显著

4、在计算attention score时时如何对padding做mask操作的?

由于padding都是0, 在计算时 e 0 = 1 e^0 = 1 e0=1使用softmax会导致padding的值也会占全局一定的概率,因此,使用mask的目的就是让这部分的值无穷小,让他在softmax之后基本为0从而保证不影响attention socre的分布。

multi head-attention

相当于同一内容以不同的初始化种子做多次self-attention再融合
使用8个self-attention结构并行计算最后的值函数,然后concat到一起,乘以参数矩阵 W W W恢复至设定维度
在这里插入图片描述
在这里插入图片描述

5、Transformer如何使用多头注意力机制的?为什么不使用一个头?

多头注意力机制从直觉上的解释其实类似于CNN中的多核,关注不同子空间的信息来捕捉更加丰富的特征信息
有文章证明确实使用一个头的效果可能真的不够https://www.zhihu.com/question/341222779
本质就是bagging的集成思想,可以聚合更多的子空间信息

位置编码

核心结构介绍完了,简单聊一下输入部分。
由于所有此都是并行输入到网络中的,同时selfattention的计算方式对所有位置也都是一样的,这会导致模型无法捕捉语序问题。
在这里插入图片描述
因此,位置编码本质上是一种补救措施
位置编码的策略可以有很多,但是通常来说,我们希望它可以满足一下几点要求:
1、每个时间步输出一个独一无二的编码
2、不同长度的句子之间,任何连个时间步之间的距离应该保持一致
3、能够泛化到更长的句子,值应该有界
4、必须时确定性的
在原文中,作者采用的时正余弦位置编码策略
在这里插入图片描述

残差结构与LN

在这里插入图片描述
6、为什么使用LN而非BN,LN在transformer的位置时哪里,BN的使用场景与LN的区别

BN 一般在MLP和CNN上有较好的表现,在RNN模型中表现较差。这是因为BN时对每个特征在每个batch size上求均值和方差。而LN则是对整个文本长度求均值和方差。
而残差结构可以防止梯度消失,帮助深层网络进行训练。

feed forward

feed forward层比较简单,为一个两层全连接层,第一层的激活函数为relu,第二层不使用激活函数。

由此,encoder部分各块组成已经介绍完毕,我们看一下整体的架构:
在这里插入图片描述

decoder

decoder部分主要由三部分组成,两层selfattention + 一层feedfoeard
每一个block的输入为最顶层encoder的输出,使用参数矩阵 W k , W v W_k,W_v Wk,Wv来得到第二层的self attetnion的K和V值。

在这里插入图片描述
值得注意的时,在decoder中,每个block的self attention只被允许关注序列中较早的位置,通过mask来屏蔽未来位置实现的。
与encoder对比:
1、包含了两个multi -headceng
2、第一个self attention采用了mask操作,掩盖未来信息
3、第二个self attention层的K,V矩阵是使用encoder计算得到的,而Q是使用decoder上一个block的输出
4、最后多一层softmax计算单词概率

第一个self attention

采用了masked操作,因为在翻译的过程中是顺序翻译的,即完成第一个单词才能继续翻译第二单词。采用mask是为了防止模型提前知道i+1单词的信息。,类似于seq2seq的语言生成模型的思路。
由于transformer是并行输入,在第一个encoder的时候实际上是看不到后续的输出的,因为使用mask掩盖掉后续内容,被掩盖掉部分仅起一个占位的作用
在这里插入图片描述

在这里插入图片描述

注意,上图还未过softmax
在这里插入图片描述

第二层self attention

Decoder block 第二个 Multi-Head Attention 变化不大, 主要的区别在于其中 Self-Attention 的 K, V矩阵不是使用 上一个 Decoder block 的输出计算的,而是使用 Encoder 的编码信息矩阵 C 计算的。

根据 Encoder 的输出 C计算得到 K, V,根据上一个 Decoder block 的输出 Z 计算 Q (如果是第一个 Decoder block 则使用输入矩阵 X 进行计算),后续的计算方法与之前描述的一致。

这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)。

最后feedback输出

Decoder block 最后的部分是利用 Softmax 预测下一个单词,在之前的网络层我们可以得到一个最终的输出 Z,因为 Mask 的存在,使得单词 0 的输出 Z0 只包含单词 0 的信息,如下:
在这里插入图片描述

最后的最后词袋+softmax的到最后的翻译结果
在这里插入图片描述

训练与预测
训练时:第i个decoder的输入 = encoder输出 + ground truth embeding
预测时:第i个decoder的输入 = encoder输出 + 第(i-1)个decoder输出

训练时因为知道ground truth embeding,相当于知道正确答案,网络可以一次训练完成。
预测时,首先输入start,输出预测的第一个单词 然后start和新单词组成新的query,再输入decoder来预测下一个单词,循环往复 直至end

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/306984
推荐阅读
相关标签
  

闽ICP备14008679号