Transformer

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

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值