NLP-Transformer + Attention

目录

一、概述

二、结构

1.整体结构

2.Encoder

3.Decoder

三、Attention

1.概述

2.流程

3.“多头” attention


一、概述

之前的RNN, LSTM或者bi-directional LSTM等,虽然每一个都有一定的改进,但依旧是处理的时序模型,当句子非常长的时候,还是会有以下问题:

1.难以处理相距太远的单词之间的依赖关系

2.计算时间复杂度高,这个是时序模型的通病,只要句子很长,计算速度就会变慢

3.是浅层模型(纵向的角度)

。而这个transformer,并不是时序模型,但也要捕获时序的特点。

Transformer中用到了self attention,就是对句子本身进行的注意力机制操作。

二、结构

1.整体结构

transformer整体结构如下:

通过encoder模块,将输入的序列(x1,x2,...,xn)映射到一个新的序列z =(z1,z2,...,zn)。

在decoder中,对于z进行解码,每一次解码得到一个输出。每一个encoder模块,和decoder模块都是如下的结构:

2.Encoder

encoder是有6个相同的层组成,每一个层由2个子层组成。

第一个子层实现了“多头”的self-attention,第二个子层是一个position-wise的全连接前馈网络。

另外,encoder端加入了一个位置信息的embedding,直接使用加法。 

3.Decoder

decoder也是有6个相同的层组成。在encoder的层中出现的2个子层,在decoder子层中也有,只不过在这两个子层中间,又添加了一个子层,对encoder的输出实行“多头”的attention

三、Attention

1.概述

Self Attention是自己对自己的上下文信息进行考虑,把上下文的单词的信息也融合到当前的单词中。

2.流程

①先对单词进行embedding,得到每一个单词的词向量。

②创建QKV参数矩阵,这三个矩阵是线性转换的矩阵,针对每个输入都可以得到三个不同的向量qkv。q是单词本身的,用来和各个单词的k进行计算得到权重;k用来和其他单词计算权重;v是value,相当于把单词的词向量的信息,映射到了v这个向量中。

③计算每个单词的q,k,v向量,比如输入的词向量是1*4的,WKV矩阵是4*3的,那么计算出的q,k,v向量是1*3的。假设已计算出句子中,挨着的两个词thinking和machines的qkv矩阵,分别为q1, k1, v1; q2, k2, v2

④计算两两之间的dependency,对于thinking来说,我们需要计算:跟它本身的分数q1*k1,跟machine的分数q1*k2。因此两个单词计算出来是个2*2的结果。如果句子中有10个词,那就是10*10的矩阵。

⑤对分数进行除以sqrt(向量长度),然后进行softmax转换,得到权重。

⑥最后把每个词的v和各自的权重相乘,再相加,就是thinking这个词的输出。

图中:z1 = 0.88*v1 + 0.12*v2

3.“多头” attention

前面的计算,是只有一组QKV的,这样虽然考虑到了所有的词,但很可能中心词的权重占的过大,而导致在句子中碰见类似于it这样的词的时候,不清楚指代的到底是什么,于是在transformer中,使用了多组的QKV:

原本计算一次,就得到了一个z,也就是词的最终输出,现在我们重复计算多次,得到多个输出z。

对于这些z,我们拼接在一起,和一个大的权重矩阵相乘,得到最终的结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值