Transformer-self attention

详见知乎~感恩~

小白记录贴,侵删~感恩

Encoder

包括Multi-head self attention,Skip connection,LayerNorm,FF

Transformer-self attention

self-attention

之前看过一位老师说transformer在长文本上效果没有RNN好, 针对这一问题, 这篇文章做了相关阐述---- Why Self-Attention? A Targeted Evaluation ofNeural Machine TranslationArchitectures, 中文版是 为什么使用自注意力机制?

通过构造三个矩阵Q(query-去match),K(key-被q match),V(value-抽取出来的information)来计算Scaled Dot-Product Attention矩阵。Self attention会让当前输入单词和句子中任意单词发生关系,然后集成到一个embedding向量里,但是当所有信息到了embedding后,位置信息并没有被编码进去。???搞不懂搞不懂,哭泣,啊啊啊啊!

Transformer-self attention

Transformer-self attention

其中,Transformer-self attention这一步可以想象一下加权平均数的数学概念,softmax用于归一化,得到正值且和为1的结果。(私认为transformer和CNN不能处理变长序列的原因是矩阵运算,后续可以再了解一下

Multi-Head Attention

私认为multi head的时候可能会丢失位置信息。

Transformer-self attention

Multi-Head Attention有多个查询/键/值权重矩阵集(Transformer使用八个注意力头,因此我们对于每个编码器/解码器有八个矩阵集合,每一个都是随机初始化的)。其他运算同self-attention,故结果得到8个Attention(Q,K,V)。可以想到利用不同注意力头,其他单词对当前单词的作用不同

Transformer-self attention

加入位置编码(这块有疑问,后续更新~)

在处理NLP任务时,我们知道位置信息很重要,但是目前并没有看到attention对位置信息进行编码,故需要将位置信息加入。

Transformer-self attention

Transformer-self attention

对于句子里的每个词Transformer-self attention,计算其对应的词嵌入Transformer-self attention如下:

Transformer-self attention

使用正弦+使用余弦的结果拼在一起得到每一个位置编码向量。这不是唯一可能的位置编码方法。然而,它的优点是能够扩展到未知的序列长度(例如,当我们训练出的模型需要翻译远比训练集里的句子更长的句子时)。为什么论文中要用三角函数,可以看一下这个问题如何理解Transformer论文中的positional encoding,和三角函数有什么关系?

残差连接

Transformer-self attention

用于解决梯度消失和权重矩阵的退化问题。(可能是想利用skip-connect能使神经网络做到更深,参考论文Deep Residual Learning for Image Recognition)。

Decoder Blocks
Decoder和Encoder的结构差不多,但是多了一个mask attention的sub-layer。transformer block中每一部分都很重要,可以看一下这篇文章Rethinking the Value of Transformer Components,或许对transformer会有进一步的了解~

Transformer-self attention

tips:解码器中的自注意力层表现的模式与编码器不同:在解码器中,自注意力层只被允许处理输出序列中更靠前的那些位置。在softmax步骤前,它会把后面的位置给隐去(把它们设为-inf)。
# 下三角矩阵!!!
diag_vals = tf.ones_like(outputs[0, :, :])
tril = tf.linalg.LinearOperatorLowerTriangular(diag_vals).to_dense()
masks = tf.tile(tf.expand_dims(tril, 0), [tf.shape(outputs)[0], 1, 1])
paddings = tf.ones_like(masks)*(-2**32+1)
outputs = tf.where(tf.equal(masks, 0), paddings, outputs)

参考文献

Transformer 中self-attention以及mask操作的原理以及代码解析

Transformer: 英文版:The Illustrated Transformer

中文版:数据汪:BERT大火却不懂Transformer?读这一篇就够了

BERT: 英文版: https://medium.com/dissecting-bert/dissecting-bert-part-1-d3c3d495cdb3

中文版: [blog] Dissecting BERT Part 1: The Encoder 解析BERT解码器(transformer)

进阶: The Annotated Transformer

transformer pytorch版代码实现: https://github.com/jadore801120/attention-is-all-you-need-pytorch/blob/master/transformer/Models.py

至此,各位看官可以撤退了,下边的内容没有营养且无知,但如果您愿意对问题做相关解答的话,本人会炒鸡炒鸡感谢~感恩


个人思考/混淆部分---后续会持续更新~

  1. GNN?

Transformer-self attention

华来知识:Transformer 是 CNN 是 GNN 是 RNN ?

Transformers是一种图神经网络

2. 位置信息

self-attention为什么丢失了位置信息?

(了解之后会持续更新~)

更新---

仔细思考一下,X输入的维度为512,Q/K/V却是64维,也就是文本长度为512的句子经过self-attention之后变为了64维,其中还包含 Transformer-self attention 等计算。或许在这些计算中位置信息丢失?

灰墙:Transformer结构中获得相对位置信息的探究

全连接层能传递位置信息吗?

上一篇:self-attention 的 pytorch 实现


下一篇:语义分割路在何方!