Transformer整体架构
网络运行流程
训练时的流程
以翻译任务为例
Input embedding | 输入 我有一个好朋友P |
Output embedding | 输入 S I have a good friend . S作为起始符号 |
输出的正确标签 | I have a good friend . E E作为预测的结束标志 |
输出 与I have a good friend . E 计算损失 | |
训练时会有非常多对的这样的中文输入和英文输出
预测时的流程
input embedding | 输入中文比如 我有一个好朋友P |
Output embedding | 输入起始符号 S |
output 输出会预测 | S I |
Output embedding | 把之前输出作为output embedding的输入即S I (Input embedding 输入“我有一个好朋友P” 这个是不变的) |
output | S I have |
Output embedding | S I have 输入 |
output | S I have a |
Output embedding | S I have a 输入 |
以此类推 | |
output | S I have a good friend E |
检测到E结束 |
transformer会学习输入的位置关系和词向量特征,学习如何根据当前的input embedding和output embedding预测输出。而此输出会作为下次预测的output embedding。直到预测得一个好的结果。
目前这个例子是根据训练数据添加的 S 和E 作为起始符和结束符作为开始和结束的标志。或许有更好地办法来实现结束预测。
网络模块和关键点
首先从输入开始,我们分析一下网络的构成和一些关键点:
inputs | 这里input输入已经单词经过比如(one-hot,word2vec)的编码,转成向量形式,不过注意这里向量的取值是离散的如(0 1 0 1) |
Inputs embedding | 将input 离散的向量映射成固定维度的连续向量,方便神经网络的训练(会使用nn自带的函数nn.Embedding 来做这件事) |
Positional Encoding | 采用一种位置编码方法,使得网络能够学习输入单词的顺序(后面详细解释这个模块) |
Multi-Head Attention | 多头注意力机制模块,(后面详细解释这个模块) |
注意多头注意力机制模块前后会有个残差连接 | 这里采用Resnet思想 |
Feed Forward | 两个全连接层 |
Norm | 归一化 |
Masked Multi-Head Attention | 与Muli-Head Attention类似 |
注意Nx | 表示encoder block是由N个这样的基本模块堆叠而成 |
Positional Encoding
是对词向量结合其位置进行编码。如 S I have a good friend
比如词向量原编码采用10维的向量进行编码,shape为[10],[0 0 0 0 0 1 1 1 1 1 ],公式中dmodel为10。
进行位置编码同样会得到一个10维的位置向量。以单词I为例
PE公式中pos对应I的位置,这里I的pos为1(pos=0,1,2...)。
PE公式中i=0,1,2,3,4,5。10维位置向量中第1个数,就是将0带入公式(3)来计算,第8个数就是将2i+1=7,代入公式(4)计算。
最终计算完位置向量PE与原编码向量直接叠加,得到一个新的10维位置向量,shape仍为[10]。
Multi-head Attention
可以任务multi-head Attension是self-attension的变种。我们先介绍说明self-attention
self-attention
如图所示将X与三个权值网络,表示分别为WQ,WK,WV构成,三个权值网络其实就是三个全连接层。
X经过这三个网络后得到,Q(查询) K(键) V矩阵(值)。最后将Q K V矩阵进行,如下图运算得到Z就是自注意力网络的输出。
下图为SCORE得分矩阵,对V进行加权,以自动选择V中更重要的值。score矩阵是通过求解Q、K相似度的方法来获取的。
Multi-head Attention
多头注意力举Q矩阵输入例子,Q的shape为[batch,seq_len,dim] (seq_len是句子长度,dim为词向量维度)
设置全连接网络WQ为[dim,n_heads*d_q] (d_q为Q向量维度,n_heads为头数)
全连接输出[batch,seq_len,n_heads*d_q],将该矩阵转换为Q[batch,n_heads,seq_len,d_q]
对于K V矩阵都是如此。 最后输出Z矩阵为[batch,n_heads,seq_len,d_v]
接下来Z矩阵转为[batch,seq_len,n_heads,sd_v] ->[batch,seq_len,n_heads*d_v] 相当于将多头的词向量维度进行叠加。到这里相当于词向量维度变为了n_heads*d_v。为了让最后输出词向量维度与原来相同
最后需要输入Wo([n_heads*d_v,d_model])的全连接层进行聚合操作将词向量维度复原。
Masked-Multi-head Attention
分为两种mask,padding mask 和 sequence mask。
Padding mask
应用于不定长序列的情况下,因为计算的长度是确定的,如果序列不定长往往需要填充,padding mask会将得分矩阵中,填充位置的得分清零
sequence mask
会确保未来位置的得分清零。限制模型只能看到当前位置的信息
如图所示对得分矩阵进行进行上三角的掩码,使得运算得到Z的第一行只包含,词向量0的信息。
第二行包含词向量0 1的信息。最后通过卷积神经网络聚合复原的Z向量也是如此。
总结
以上就是transformer的全部介绍了。附上transformer实现简单的翻译任务代码。
https://github.com/Githuyou/transformer.git