[nlp] 小傻学transformer

what is transformer?

自Attention机制提出后,加入attention的Seq2seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合rnn和attention的模型。
之后google提出了解决sequence to sequence问题的transformer模型,用全attention的结构代替了lstm,在翻译任务上取得了更好的成绩。

attention

attention源于人类的视觉注意力机制;人类一般不会关注整体,而是根据需要观察某个重要的部分;其概念最早在图像领域出现(当我们观察一幅画时,我们只观察其局部也可得到有用信息)
attention:赋予模型对于重要性的区分辨别能力
attention本质:一系列当权重分配
权重分配——>抽取关键信息——>准确判断
self-attention: 能注意输入序列的不同位置以计算该序列的表达能力

后续阅读

• Recurrent Models of Visual Attention(RNN Attention 图像分类)
• NLP:Neural Machine Translation by Jointly Learning to Align and Translate (机器翻译)

why transformer?

RNN很难进行并行计算。RNN的序列化特征难以并行化,长距离和层次化的依赖关系很难建立句法信息,指代信息。
google大佬用transformer进行翻译任务,效果碾压之前结果。
Seq2Seq模型使用attention机制并用MLE(maximum likelihood estimation)进行计算时,其时间复杂度为指数级!
在这里插入图片描述
parameterize with RNN
In Seq2Seq with attention model, the context is a weighted average of source hidden state vector;
Attention is a powerful mechanism, maybe we can use it simplify the encoder and the decoder?
Removing the RNNs would make our model a lot more efficient and scalable.

the strength of transformer

transformer效率提升

与RNN相比,直觉上其不存在位置交互,且可并行计算

the architecture of transformer

在这里插入图片描述

Encoder

即上图最左侧部分。其由6层相同的layer组成,每层layer包含一个multi-head self-attention mechanism和fully connected feed-forward network的两个sublayer,且每个sublayer都进行残差连接和归一化。

multi-head attention

attention可由式 attention_output = Attention(Q, K, V)进行表示,而multi-head attention通过h个不同的线性变换对Q,K,V进行投影,最后将不同的attention结果拼接起来(self-attention 中取Q, K, V 相同):
在这里插入图片描述

why multi-head
  1. **扩展模型专注于不同位置的能力。**如果我们翻译一个句子,比如“The animal didn’t cross the street because it was too tired”,我们会想知道“it”指的是哪个词,这时模型的“多头”注意机制会起到作用。

  2. **给出了注意力层的多个“表示子空间”(representation subspaces)。**对于“多头”注意机制,我们有多个查询/键/值权重矩阵集,这些集合中的每一个都是随机初始化的,在训练之后,每个集合都被用来将输入词嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。

the architecture of multi-head

在这里插入图片描述
Every input vector Xi is used in three ways in self-attention:
1. Query: compare Xi to every other vector to compute attention weights for its own output yi
2. Key: compare Xi to every other vector to compute attention weights for the other outputs yi
3. Value: use Xi in the weighted sum to compute every output vector for the other outputs
We can make attention more flexible by assuming separate, trainable weights foreach of these roles: Wq, Wk and Wv
the attention is computed as follows:
attention计算公式
Now the self-attention layer has parameters that allows it to modify the incoming vectors to suit the three roles they must play.

Scaled Dot-Product Attention

在这里插入图片描述
The softmax function can be sensitive to very large input values
This kills the gradient and can slow down learning or cause it to stop
It helps to scale the dot product back to stop the inputs to the softmax function from growing too large
w x i ‘ = q i ∗ k j / D k w^`_{xi} = q_i * k_j / \sqrt{Dk} wxi=qikj/Dk

自注意力计算步骤
  1. **从每个编码器的输入向量(每个单词的词向量)中生成三个向量。**也就是说对于每个单词,我们各创造一个query、key、value。这三个向量是通过词嵌入与三个权重矩阵后相乘创建。(可以发现这些新向量在维度上比词嵌入向量更低。他们的维度是64,而词嵌入和编码器的输入/输出向量的维度是512. 但实际上不强求维度更小,这只是一种基于架构上的选择,它可以使多头注意力(multiheaded attention)的大部分计算保持不变。)X1与WQ权重矩阵相乘得到q1, 就是与这个单词相关的查询向量。
  2. **计算得分。**所考虑单词计算出都分数决定在编码此单词的过程中有多重视句子的其它部分。
    分数 = qi * kj (qi为计算单词的query,kj为句子中其他单词都key)
  3. **将所得分数除以 D k \sqrt{Dk} Dk ,**这可让结果更为稳定。
  4. **将上述结果进行softmax,使单词分数归一化。**softmax分数决定了每个单词对编码当下位置的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,但有时关注另一个与当前单词相关的单词也会有帮助。
  5. **将每个value乘以softmax分数(这是为了准备之后将它们求和)。**这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。
  6. 对加权值向量求和(译注:自注意力的另一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到。),然后即得到自注意力层在该位置的输出(在我们的例子中是对于第一个单词)。
    在这里插入图片描述
    至此,自注意力计算完成,所得向量可传给前馈神经网络。而实际中,这些计算是以矩阵形式完成的,以便算得更快。
多头计算说明

在“多头”注意机制下,我们为每个头保持独立的查询/键/值权重矩阵,从而产生不同的查询/键/值矩阵。用X乘以WQ/WK/WV矩阵来产生查询/键/值矩阵。
八个矩阵压缩成一个矩阵:直接把这些矩阵拼接在一起,然后用一个附加的权重矩阵WO与它们相乘。
在这里插入图片描述

Decoder

decoder 与encoder相比,结构上多了一个Mask 层,其他两层不变。
解码器Self-Attention输入层与编码器区别:只允许关注输出序列中较前的位置(mask遮罩)

masked multi-head attention

在这里插入图片描述

Positional Encoding

在RNN中,其可以表示单词间的时序关系。但在transformer中,目前无此功能,故对位置进行编码以表示其时序关系。
P E p o s , 2 i = s i n ( p o s / 1000 0 2 i / d k ) PE_{pos, 2i} = sin(pos/10000^{2i/d_{k}}) PEpos,2i=sin(pos/100002i/dk)
P E p o s , 2 i + 1 = c o s ( p o s / 1000 0 2 i / d k ) PE_{pos, 2i+1} = cos(pos/10000^{2i/d_{k}}) PEpos,2i+1=cos(pos/100002i/dk)
pos: position;i:index over dimensions;
Transformer为每个输入的词嵌入添加了一个向量。这些向量遵循模型学习到的特定模式,这有助于确定每个单词的位置,或序列中不同单词之间的距离。这里的直觉是,将位置向量添加到词嵌入中使得它们在接下来的运算中,能够更好地表达的词与词之间的距离。

code

https://tensorflow.google.cn/tutorials/text/transformer

others

based on transformer’s work

后续很多预训练语言模型的基础: BERT, GTP
什么是attention?
语言学角度:描述词与词之间的关系
机器学习的角度:神经网络隐层之间的相似度表示

  1. 什么是self-attention?
    句子内部词与词之间的关联关系
    可以用于解决指代消歧等问题

  2. 什么是encoder-decoder attention ?

    编码序列与解码序列中词与词的关联关系
    以机器翻译为例:表征翻译中源端到目标端的词关系

  3. Transformer优缺点:
    优点:
    不对数据的时间和空间关系做假设,可以处理一组对象
    层输出可以并行计算,不像RNN需要序列计算
    远距离项可以影响彼此输出,无需多步RNN或各种卷积层
    可以学习长距离的依赖
    缺点:
    对于时间序列,一个单位时间的输出是从整个历史记录计算的,并不是仅从输入和当前的隐含状态得到,可能效率会降低。
    如果输入数据有时间或空间的关系,则必须加上位置编码,否则模型会有效地看到一堆单词。

相关疑惑

Attention对比RNN和CNN,分别有哪点你觉得的优势?

对比RNN的是,RNN是基于马尔可夫决策过程,决策链路太短,且单向
对比CNN的是,CNN基于的是窗口式捕捉,没有受限于窗口大小,局部信息获取,且无序

写出Attention的公式?

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q, K, V) = softmax(\frac {QK^T}{\sqrt d_k})V Attention(Q,K,V)=softmax(d kQKT)V

解释你怎么理解Attention的公式的?

  • Q : n ∗ d k , K : d k ∗ m , V : m ∗ d v Q: n* d_k, K: d_k * m, V: m* d_v Q:ndk,K:dkm,V:mdv
    • 首先,我们可以理解为Attention把input重新进行了一轮编码,获得一个新的序列
  • 除以 d k \sqrt d_k d k的目的是为了平衡qk的值,避免softmax之后过小
    • qk除了点击还可以直接拼接再内接一个参数变量等等
  • Multi-Attention只是重复了h次的Attention,最后把结果进行拼接

Attention机制,里面的q,k,v分别代表什么?

  • Q:指的是query,相当于decoder的内容
  • K:指的是key,相当于encoder的内容
  • V:指的是value,相当于encoder的内容

q和k对齐了解码端和编码端的信息相似度,相似度的值进行归一化后会生成对齐概率值(注意力值)。V对应的是encoder的内容,刚说了attention是对encoder对重编码,qk完成权重重新计算,v复制重编码

为什么self-attention可以替代seq2seq?

  • seq2seq最大的问题在于将Encoder端的所有信息压缩到一个固定长度的向量中,并将其作为Decoder端首个隐藏状态的输入,来预测Decoder端第一个单词(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失Encoder端的很多信息,而且这样一股脑的把该固定向量送入Decoder端,Decoder端不能够关注到其想要关注的信息
  • self-attention让源序列和目标序列首先“自关联”起来,这样的话,源序列和目标序列自身的embedding表示所蕴含的信息更加丰富,而且后续的FFN层也增强了模型的表达能力,并且Transformer并行计算的能力是远远超过seq2seq系列的模型

Attention模型怎么避免词袋模型的顺序问题的困境的?

增加了position Embedding

  • 可以直接随机初始化
  • 也可以参考Google的sin/cos位置初始化方法
    • 如此选取的原因之一是sin(a+b)=sin(a)cos(b)+cos(a)sin(b)。这很好的保证了位置p+k可以表示成p的线性变换,相对位置可解释

维度与点积大小的关系是怎么样的,为什么使用维度的根号来放缩?

  • 假设向量 q 和 k 的各个分量是互相独立的随机变量,均值是0,方差是1,那么点积 qk 的均值是0,方差是 dk
  • 针对Q和K中的每一维i都有qi和ki相互独立且均值0方差1,不妨记,
    • E(XY) = E(X)E(Y)=0
    • 所以k维度上的qk方差会为dk,均值为0,用维度的根号来放缩,使得标准化

References

  1. 知乎:【NLP】Transformer详解
  2. attention is all you need
  3. the pictures
  4. 图解transformer
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值