transformer的解释
文章目录
前言
transformer应用十分广泛并且还很有趣,其中有很多细节之前看过但是并不完全清楚,希望自己能够完全理解,学习transformer并记录怕自己忘记,计划从头开始梳理并时常更新改正错误。原文献参考《Attention Is All You Need》,参考代码以及相关知识也会放在末尾。
一、transformer结构
1.positional encoding
对于input embedding来说,就是将每个词进行向量的表示,在论文原文中将每个词用512维的向量进行表示。举个例子来说
enc_input_1 = "我有一个好朋友P"
enc_input_2 = "我有零个女朋友p"
#对应词库为
src_vocab = {'P': 0, '我': 1, '有': 2, '一': 3, '个': 4, '好': 5, '朋': 6, '友': 7, '零': 8, '女': 9}
这样得到的相对应的的每一句话可以这样表示:
enc_input_1 = [1,2,3,4,5,6,7,0]
enc_input_2 = [1,2,8,4,9,6,7,0]
以上的两个句子的长度全为8,那么通过文字编码将这两句话编码得到(2,8,512)维度,当然在同一个batch中需要padding使得句子的长度一致,也就是每句话都由该句话词汇量的多少以及词向量长度构成的矩阵来表示。
接下来就是一直困扰很久的position encoding部分,采用self-attention没有考虑到句子中每个词的位置信息,所以这一部分主要目的就是加上位置信息。position encoding部分将词的位置信息进行编码,原文中采用正余弦的位置编码方式:
其中pos代表单词在句子序列中的位置,i表示单词的某一维度(每个单词维度均为d_model=512)。
然后直接与enbedding后的词向量直接进行相加,这样不仅得到了词信息,还得到了每个词的位置信息。(在这里我也搞不懂为何不将词信息与位置信息concat?)
那么为什么选用正余弦函数呢?这里有个解释我觉着非常好→解释 Transformer 中的绝对位置编码以及b站这个→Transformer的位置编码(Position Encoding)进展梳理
2.multi-head attention
self-attention是transformer的核心内容,可以参考这个来理解→超详细图解Self-Attention的那些事儿
self-attention以及attention可以参考→attention与self-attention
多头注意力机制大致可以表示为如下公式:
代码中将多头的参数矩阵放在一起做线性变换,然后再拆分为多个头。多头的目的简单来讲就是Q、K、V都是通过线性变化得到的,通过多个头可以学习到更多的内容。而对于小于最大长度的句子进行补0操作,但是会对注意力分数产生一定的影响,所以将补0位置分数置于负无穷,这样softmax后变成了0。
3.residual connection
可以参考ResNet→ResNet
后续会详细介绍这篇论文
4.LayerNorm
可以参考这个,言简意赅→BatchNorm与LayerNorm的异同
5.Masked multi-head attention
这里的mask操作主要是防止decoder看到输入序列后面的信息,这个链接具体介绍了其操作→Transformer 中的mask
总结
还有很多没有介绍,后续会补齐,写这篇博客原因是怕自己忘记,如果有不正确地方欢迎指出。