算法面试之transformer的结构和位置编码

1.结构

算法面试之transformer的结构和位置编码_第1张图片算法面试之transformer的结构和位置编码_第2张图片
Encoder和Decoder均由6个相同的层组成,可将上图简化为下图表示:(Encoder的输出与每个Decoder相连)
Encoder的每一层又包含两个sub-layers:
multi-head self-attention mechanism
简单的全连接层
Decoder的每一层除了在上述两个sub-layers的中间再插入一个encoder-decoder attention sub-layer。
算法面试之transformer的结构和位置编码_第3张图片

2.位置编码(Positional Encoding)

仅仅只使用自注意力机制会丢失文本原有的序列信息
位置编码 来刻画数据在时序上的特征
算法面试之transformer的结构和位置编码_第4张图片
横坐标表示输入序列中的每一个Token,每一条曲线或者直线表示对应Token在每个维度上对应的位置信息。在左图中,每个维度所对应的位置信息都是一个不变的常数;而在右图中,每个维度所对应的位置信息都是基于某种公式变换所得到。
换句话说就是,左图中任意两个Token上的向量都可以进行位置交换而模型却不能捕捉到这一差异,但是加入右图这样的位置信息模型却能够感知到。例如位置20这一处的向量,在左图中无论你将它换到哪个位置,都和原来一模一样;但在右图中,你却再也找不到与位置20处位置信息相同的位置

为什么transformer没用position embedding 而是position encoding:主要是transformer没有bert数据量大 encoding可能效果和embedding差不多

3.Encoder

对于Encoder部分来说其内部主要由两部分网络所构成:多头注意力机制和两层前馈神经网络。
self-attention能帮助当前节点不仅仅只关注当前的词,从而能获取到上下文的语义

同时,对于这两部分网络来说,都加入了残差连接,并且在残差连接后还进行了层归一化操作。这样,对于每个部分来说其输出均为在这里插入图片描述
,并且在都加入了Dropout操作。

·为什么加入残差
堆叠了很多层,容易梯度消失或是梯度爆炸。
·为什么Layer Norm
数据经过一层后偏差会越来越大,需要归一化防止落入激活函数饱和区。

4.Decoder

算法面试之transformer的结构和位置编码_第5张图片在Decoder中一共包含有3个部分的网络结构。最上面的和最下面的部分(暂时忽略Mask)与Encoder相同,只是多了中间这个与Encoder输出(Memory)进行交互的部分,作者称之为“Encoder-Decoder attention”。对于这部分的输入,Q来自于下面多头注意力机制的输出,K和V均是Encoder部分的输出(Memory)经过线性变换后得到。而作者之所以这样设计也是在模仿传统Encoder-Decoder网络模型的解码过程。因此每个位置都能参与所有位置的attention计算

5.Encoder 和 Decoder 的区别

Mask 不同:Decoder 部分采用一个上三角掩码,来避免提前观察到后续位置
Transformer-Decoder 比 Encoder 多了一个融合层

6.多层enc-dec结构

算法面试之transformer的结构和位置编码_第6张图片
多层的Transformer网络结构图(原论文中采用了6个编码器和6个解码器)
可以发现,它真的就是堆叠后的形式。不过需要注意的是其整个解码过程。在多层Transformer中,多层编码器先对输入序列进行编码,然后得到最后一个Encoder的输出Memory;解码器先通过Masked Multi-Head Attention对输入序列进行编码然后将输出结果同Memory通过Encoder-Decoder Attention后得到第1层解码器的输出;接着再将第1层Decoder的输出通过Masked Multi-Head Attention进行编码,最后再将编码后的结果同Memory通过Encoder-Decoder Attention后得到第2层解码器的输出,以此类推得到最后一个Decoder的输出。值得注意的是,在多层Transformer的解码过程中,每一个Decoder在Encoder-Decoder Attention中所使用的Memory均是同一个

7.中间层

在multi-head self-attention和FFN层之间,还有一个“intermediate layer”,即中间层,这个中间层将前面Attention-layer的hidden size扩大了4倍,然后再做一次非线性变换(即过一个激活函数,如gelu、relu),再将hidden size变回原size。中间这部分的功能,我个人理解,有点类似于“特征组合器”,增大神经元个数,增强Transformer对于distributed的文本特征的组合能力,从而获取更多、更复杂的语义信息。此外,中间层是Transformer中唯一一个过了激活函数的layer,所以也引入了非线性信息,当然从理论上也对提升模型的拟合不同语义信息能力有帮助。

上一篇:算法面试之seq2seq、attention、beam search
下一篇:算法面试之transformer的Attention和多头自注意力机制

注:本专题大部分内容来自于总结,若有侵权请联系删除。

你可能感兴趣的:(算法面试,算法,自然语言处理,transformer)