Transformer

目录

transformer

Encoder

每个block进行的操作

layer norm

Decoder

 Masked Attention

AT&NAT

 encoder的输出如何融入到decoder中?

transformer训练和测试不一样的点

 训练chat-bot时的一些tips


transformer

原论文网络结构图

 transformer有一个Encoder一个Decoder,吧编码器解析输入得出的结果放到解码器中得到输出。

Encoder

Encoder由一组输入先做Positional Encoding后,再经过多个block后得到

每个block进行的操作

先对输入做self-attention得到输出,再将得到的输出加上输入构造一个残差结构得到layer norm的输入,经过layer norm处理后的值作为全连接层的输入,FC层也需要添加残差结构,得到的输出再进行layer norm后才得到encoder的输出。

layer norm

对同一个样本的不同维度计算均值方差(batch norm是对不同样本的同一纬度计算)

以上是transformer原文中结构,可以尝试改变例如layer norm位置等,可能会得到更好的结果。

Decoder

encoder得到的输出会以某种方式读入decoder中,后面会提到。

先看一下decoder的结构:

先输入一个开始符,begin也是一个独热向量

decoder的每一个输出都会作为下一次的输入,所以decoder的计算不是并行的。

注意到decoder中的attention模块比encoder多了一个Masked

 Masked Attention

attention计算是需要看所有输入之间的重要程度,加了masked表示只看当前输入之前的所有内容的相关性。

产生b1时只考虑a1

产生b2时只考虑a1,a2

产生b3时只考虑a1,a2,a3

产生b4时考虑前面的所有

实现这种效果时就用对应的q去与前面所有的k计算相关性,而不计算全局的q*k

因为在做输出的时候可能是不定长的,而且,每一个输出是串行计算的,需要有了前一个输出,才有下一个节点的输入。

AT&NAT

AT(autoregressive)表示下图左边结构,输入一个起始符和终止符都为独热向量,根据输出的end判断什么时候结束。

NAT(Non-autoregressive)下图右边结构,直接丢入一组起始符,输出对应的输出

起始符的个数如何确定?

1.再加入一个可学习参数用来记录每组数据的输出个数,从而决定起始符个数

2.直接丢入一个超长的起始符,例如你的实际应用中每组输出不会超过300,就丢300个begin进去,看在什么地方输出了end符,结束符后面的输出全都丢弃。虽然有一部分计算浪费,但是由于可以并行处理,所以NAT跑的是比AT快的。

 encoder的输出如何融入到decoder中?

decoder从encoder中得到一部分输入,再从上一个decoder模块得到一个输入

这一部分模块叫做cross attention

具体实现方式:用decoder前一个模块输出的q去计算encoder的所有k的相关性,得到α然后加上v得到输出作为encoder下一层输入。

 encoder和decoder都有很多层attention模块

在原始论文中是用的encoder的最后一层与decoder计算

后来还有很多魔改

transformer训练和测试不一样的点

训练和测试时需要用不同的评估方式,训练时用的是cross entropy测试时用的是BLEU

因为BLEU对比每一个位置是否一样,无法计算梯度

训练时decoder的输入就是正确答案

而测试时的输入是上一步的输出,如果出现错误计算会影响后面每一步的值

 

 训练chat-bot时的一些tips

 有很多时候需要的输出可能在训练中从来没出现过

例如做对话机器人出现人名,或者做摘要提取之类任务时

需要有复制粘贴的能力,能更加方便的做输出。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值