transformer的分解
本文尝试用一种通俗的语言来说明白transformer,也会加一些自己的理解。
transformer基于attention,解决的是seq2seq的问题。
0.先来回顾一下attention
如果让我用一句话来总结attetion我会说针对输入做一次矩阵运算,得到(q,k,v),k和v一般一样,然后针对q,k做矩阵乘法,再加一个softmax层之后我们就可得到权重,权重和v点乘之后就是一个输出,表示的是输入之间的相联系程度。
-
基础的attention
这个是图示:
基础attention形式
这个是计算公式:
attention计算公式
dk是Q的列数,除以这个是为了提高模型泛化能力。中间的QKT还有很多其他的计算方法,最终保证的出来是一个一维向量即可,计算方法有下面这几种:
QK的不同处理方式
最终要注意一个问题:attention的输出是什么?
首先啊 权重是向量1维的,但是这个v不是,是和q,k一样的,因此就是响应的权重ai和vi对应相乘,然后相加,得到当前的attention输出,这个再放到decoder里边去。
为了防止你不懂,我又去拔了一个示意图:
attention计算过程 -
multi-head-attention
这个是transfomer用的结构,先上图。
多头自注意力机制
看这个图,初始的QKV经过了线性变换,然后分成h个头,分别进行attention,然后拼接到一起,然后再输出。
好了,疑问点就是怎么线性变换的,这可不是线形划分啊,举个栗子现在要分8个头,那么每一次线形变化都要乘上一个权重。
我们知道输入是(m,512),而QKV的维度是一样的,都是(m,64),但是输入乘以权重计算出来的,多头就是每次乘的权重都不同,然后并行计算,算完再拼接,其实就是(m,64*8),再变化一次,乘以(512,512)最后的输出和输入维度一样了,perfect。
1.transformer整体结构
概览,其实transformer跟其他的seq2seq是一样的,怎么一样呢,都是encoder和decoder构成的。先来整体理解一下他的结构:
transfomer结构
encoder由2个单元构成,decoder由3个单元构成,其中的核心还是上文回顾的多头自注意力机制。其中encoder有6层,decoder也有6层,encoder的每一层输出都是下一层的输入,主要是多头的输出维度和输入是一样的。然后encoder最后一层的输出会分到decoder的各层中,当成输入之一。
2.encoder部分
先上图:
encoder部分
- 首先是输入的embedding,embedding的方法很多,各个包都提供了算法。
-
然后是加入位置编码,位置编码有个计算公式:
位置编码计算方法
他和wordemmbedding的size一致,pos是词的位置,dmodel是词向量的维度,奇数位置是sin,偶数位置是cos。
- 然后是进去做一个多头自注意力
- 再然后利用了残差网络的思想,原数+变化以后数据的相加,在做一个标准化。
- 然后把上边的输出向前在搞一个全连接,再搞一个残差网络,最后标准化,输出给下一个encoder。
3.decoder
decoder没有encoder那么简单了,先看看啥样吧。
decoder格式
一看就是decoder要和encoder结合起来啊,
- decoder的输出是目标序列经过embedding以后加入位置编码,这点和encoder一样。
- decoder做self_attention的之后,做残差加和,做标准化
- decoder独有的encoder和decoder的self attention就是encoder最后一步输出的Q和encoder做的KV再做一个attention。做完attetion再加和标准化
只能跟他之前的词做,忽略之后的词,因此这个有两个mask机制:
一个是padding mask这个很简单就是应对输入输出长度不一样,进行补齐的。
一个是sequence mask就是说当前输出只能和之前几期的输出有关,不能和之后的有关。 - 然后做前馈神经网络,然后这一层输出和enconder输出共同作用于decoder第 2部分,最后再做一个线性变化,求一个最大概率出来。
总结
基本逻辑理清了,接下来结合源码来分享一点知识点,先不更新了。