当前位置:   article > 正文

【深度学习】NLP之Transformer (1) Encoder_transformer encoder

transformer encoder

目录

1. 背景

2. 模型

Encoder

2.1. self-attention

2.2. matrix calculation of self-attention

2.3. muti-headed attention

2.4. positional encoding

2.5. Residual \ Layer Normalization

Decoder

2.6. 损失函数 cross-entroy loss

2.7. 训练技巧

3. Transformer优缺点

4. 回顾

5. QA


在机器翻译的任务中,使用RNN会造成梯度消失和长句子传递信息缺失的问题。LSTM只能缓解,如果想要进一步提升,就引入了Transformer。这里的新思想是不用RNN来做机器翻译。
The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time.

                                                                  图:梯度消失的问题 

1. 背景

Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。 作者采用Attention机制的原因是考虑到RNN(或者LSTM,GRU等)的计算是顺序的,RNN相关算法只能从左向右依次计算或者从右向左依次计算,这种机制带来了两个问题: 

  (1) 时间片 t 的计算依赖 t−1 时刻的计算结果,这样限制了模型的并行能力;

  (2) 顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力

  Transformer的提出解决了上面两个问题:

  (1) 首先它使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量;

  (2) 其次它不是类似RNN的顺序结构,因此具有更好的并行性,符合现有的GPU框架

2. 模型

模型结构

Nx:是一层,类似于LSTM的内部,红色框的encoder和蓝色框的decoder都是可以叠加的。

如上图,transformer模型本质上是一个Encoder-Decoder的结构。输入序列先进行Embedding,经过Encoder之后结合上一次output再输入Decoder,最后用softmax计算序列下一个单词的概率。

transformer的网络结构

Encoder

一个独立的encoder包含了如下的信息:

目的就是将输入的x1转为输出的r1,x2转为r2 ...(将输入的向量转为另一个包含更多信息的向量)

第一部分就是self-attetion(x1 x2共享self-attention)

单词与单词的影响力有多大,图中的it与句子中的哪个单词最相关?用颜色强弱来代表,it指代的是the animal

第二部分就是feed forward neural network,可以理解为一个全连接层。(x1 x2分开了)

2.1. self-attention

2023/04/02更新,

 

 

 2023/04/02更新结束。。。

x1、x2是输入的两个单词embedding,将一个向量转为另一个向量最简单的办法就是乘以W矩阵。

将x1转为q1、k1、v1三个不同的向量。所以引入WQWkWv,这里x1和x2共享了三个矩阵,在某种程度上输入的x1和x2已经有个某种联系

现在已经得知v1和v2了,如何转为z1和z2呢? z1=v1θ1+v2θ2

θ1 和 θ2 如何得到呢?

q1和k1做点击后再求和,再将q1和k2做点击后求和,如上图,q1k1=112、q1k2=96,除以一个共同的数字8,所以112/8=14、96/8=12,再将14和12经过softmax,所得到的两个值就是θ1 和 θ2 。

v1、v2已知,所以就将x1、x2转为了z1、z2,z1=v1θ1+v2θ2

同理,计算z2只需要将q2k1、q2k2作为v1和v2的权重。

z1是经过self-attention的输出,再经过2个全连接层,得到r1。

其中,query为搜索词、key-value是键值对。

以5g作为query,得到huawei的概率为100%,得到诺基亚的概率为50%。

WQWkWv是随机初始化,网络学习到的参数,代表什么样的qkv最契合我现在要解决的问题。

2.2. matrix calculation of self-attention

为了减少计算,实际是矩阵相乘。只要做3次计算,就能算出所有词的计算。

gpu上操作两个矩阵相乘是一个时间步骤,cpu是 O(n3)

        

2.3. muti-headed attention

就是说用了很多不同的WQ、WK、WV。

因为是随机初始化的 W0Q  、W0KW0V,所以得到的 Q0 、Q1 也是不同的,通过网络误差传递,有更丰富的层次,每个head都是从不同的角度来看待问题。。

                                               图:产生8个不同的attention输出

如何将不同的z0,z1转为一个Z呢?(参考FC)(这个的muti-headed attention的额外步骤,将多个head输出的z转为最终想要的Z)

multi-head self-attention整体流程

最终self-attention得到的z1\z2通过不同的FC转为r1、r2,这个r1、r2再下一个encoder中再作为x1、x2继续下去。

为什么需要muti-head?

右图有8个head,it与其他单词在不同维度发生不同强度的关联。橙色关注it是什么?绿色关注it的状态。

2.4. positional encoding

希望网络在自注意力的时候,不仅知道要聚焦在哪个单词上,还想知道单词之间互相离多远。

输入有2个值:

这个单词在原来句子中的位置;

最后想要产生的encoding vector,它的位置在哪?

不同位置的向量做点击,如下图,自己和自己做点击是最大的。关注点是这个东西离我是比较近的还是比较远的(这样就够了!)。

encoding向量的点积值对称,随着距离增大而减小。

图:所有positional encoding vector点积值热图

2.5. Residual \ Layer Normalization

Residual \ Layer Normalization+attention

residual和LN在每一层都使用

Decoder

输入随着时间而变化。

最开始输入就是<start>,起始向量+positional encoding (对应位置相加)

与encoder唯一区别是encoder-decoder attention这一层用到了encoder的输出作为它的输入。softmax为预测某个单词的概率值。

这里m没懂??????????????????

什么是masked multi-head attention?

神经网络的输入是固定长度的,让网络知道哪一部分是它现在需要忽略的,不用考虑的。

举例:

decoder output输入,x为我所不知道的内容,需要主动去忽略的。

t=3时   <start> I am a x x x x   则mask为 0 0 0 1 1 1 1

t=4时                                       则mask为 0 0 0 0 1 1 1  (这时候student已经预测出来了~)

encoder和decoder结合

2.6. 损失函数 cross-entroy loss

2.7. 训练技巧

label smoothing

不用绝对的01,用小数

warm up(修改学习率,取决于数据量和任务难度)

3. Transformer优缺点

代码实现

4. 回顾

这个Transformer Block其实才是Transformer最关键的地方,核心配方就在这里。

以上所有的编码器在结构上都是相同的,但它们没有共享参数。每个解码器都可以分解成两个子层。拆分成小的来看:

以机器翻译来说,这个流程如下:

从编码器输入的句子首先会经过一个自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。

自注意力层的输出会传递到前馈(feed-forward)神经网络中。每个位置的单词对应的前馈神经网络都完全一样(译注:另一种解读就是一层窗口为一个单词的一维卷积神经网络)。

解码器中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层。除此之外,这两个层之间还有一个注意力层,用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。

5. QA

针对NLP任务的特点来说下Transformer的对应解决方案。

1、自然语言一般是个不定长的句子,那么这个不定长问题怎么解决呢?

Transformer做法跟CNN是类似的,一般设定输入的最大长度,如果句子没那么长,则用Padding填充,这样整个模型输入起码看起来是定长的了。

2、NLP句子中单词之间的相对位置是包含很多信息的,RNN因为结构就是线性序列的,所以天然会将位置信息编码进模型;而CNN的卷积层其实也是保留了位置相对信息的,所以什么也不做问题也不大。但是对于Transformer来说,为了能够保留输入句子单词之间的相对位置信息,必须要做点什么。为啥它必须要做点什么呢?

因为输入的第一层网络是Muli-head self attention层,Self attention会让当前输入单词和句子中任意单词发生关系,然后集成到一个embedding向量里,但是当所有信息到了embedding后,位置信息并没有被编码进去。所以,Transformer不像RNN或CNN,必须明确的在输入端将Positon信息编码,Transformer是用位置函数来进行位置编码的,而Bert等模型则给每个单词一个Position embedding,将单词embedding和单词对应的position embedding加起来形成单词的输入embedding。

3、关于NLP句子中长距离依赖特征的问题,Self attention天然就能解决这个问题,因为在集成信息的时候,当前单词和句子中任意单词都发生了联系,所以一步到位就把这个事情做掉了。不像RNN需要通过隐层节点序列往后传,也不像CNN需要通过增加网络深度来捕获远距离特征,Transformer在这点上明显方案是相对简单直观的。

文章参考:

BERT大火却不懂Transformer?读这一篇就够了 - 数据汪的文章 - 知乎 (具体实现细节看这里

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