赞
踩
目录
2.2. matrix calculation of self-attention
2.5. Residual \ Layer Normalization
在机器翻译的任务中,使用RNN会造成梯度消失和长句子传递信息缺失的问题。LSTM只能缓解,如果想要进一步提升,就引入了Transformer。这里的新思想是不用RNN来做机器翻译。
The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time.
图:梯度消失的问题
Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。 作者采用Attention机制的原因是考虑到RNN(或者LSTM,GRU等)的计算是顺序的,RNN相关算法只能从左向右依次计算或者从右向左依次计算,这种机制带来了两个问题:
(1) 时间片 t 的计算依赖 t−1 时刻的计算结果,这样限制了模型的并行能力;
(2) 顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。
Transformer的提出解决了上面两个问题:
(1) 首先它使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量;
(2) 其次它不是类似RNN的顺序结构,因此具有更好的并行性,符合现有的GPU框架。
模型结构
Nx:是一层,类似于LSTM的内部,红色框的encoder和蓝色框的decoder都是可以叠加的。
如上图,transformer模型本质上是一个Encoder-Decoder的结构。输入序列先进行Embedding,经过Encoder之后结合上一次output再输入Decoder,最后用softmax计算序列下一个单词的概率。
transformer的网络结构
一个独立的encoder包含了如下的信息:
目的就是将输入的x1转为输出的r1,x2转为r2 ...(将输入的向量转为另一个包含更多信息的向量)
第一部分就是self-attetion(x1 x2共享self-attention)
单词与单词的影响力有多大,图中的it与句子中的哪个单词最相关?用颜色强弱来代表,it指代的是the animal
第二部分就是feed forward neural network,可以理解为一个全连接层。(x1 x2分开了)
2023/04/02更新,
2023/04/02更新结束。。。
x1、x2是输入的两个单词embedding,将一个向量转为另一个向量最简单的办法就是乘以W矩阵。
将x1转为q1、k1、v1三个不同的向量。所以引入
现在已经得知v1和v2了,如何转为z1和z2呢?
q1和k1做点击后再求和,再将q1和k2做点击后求和,如上图,q1k1=112、q1k2=96,除以一个共同的数字8,所以112/8=14、96/8=12,再将14和12经过softmax,所得到的两个值就是
v1、v2已知,所以就将x1、x2转为了z1、z2,
同理,计算z2只需要将q2k1、q2k2作为v1和v2的权重。
z1是经过self-attention的输出,再经过2个全连接层,得到r1。
其中,query为搜索词、key-value是键值对。
以5g作为query,得到huawei的概率为100%,得到诺基亚的概率为50%。
为了减少计算,实际是矩阵相乘。只要做3次计算,就能算出所有词的计算。
gpu上操作两个矩阵相乘是一个时间步骤,cpu是
就是说用了很多不同的WQ、WK、WV。
因为是随机初始化的
图:产生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个值:
这个单词在原来句子中的位置;
最后想要产生的encoding vector,它的位置在哪?
不同位置的向量做点击,如下图,自己和自己做点击是最大的。关注点是这个东西离我是比较近的还是比较远的(这样就够了!)。
encoding向量的点积值对称,随着距离增大而减小。
图:所有positional encoding vector点积值热图
Residual \ Layer Normalization+attention
residual和LN在每一层都使用
输入随着时间而变化。
最开始输入就是<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结合
label smoothing
不用绝对的01,用小数
warm up(修改学习率,取决于数据量和任务难度)
代码实现
这个Transformer Block其实才是Transformer最关键的地方,核心配方就在这里。
以上所有的编码器在结构上都是相同的,但它们没有共享参数。每个解码器都可以分解成两个子层。拆分成小的来看:
以机器翻译来说,这个流程如下:
从编码器输入的句子首先会经过一个自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。
自注意力层的输出会传递到前馈(feed-forward)神经网络中。每个位置的单词对应的前馈神经网络都完全一样(译注:另一种解读就是一层窗口为一个单词的一维卷积神经网络)。
解码器中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层。除此之外,这两个层之间还有一个注意力层,用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。
针对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?读这一篇就够了 - 数据汪的文章 - 知乎 (具体实现细节看这里
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。