NMT

Transformer

Transformer机器翻译模型

Posted by biggan on April 3, 2019

Transformer

1. transformer架构

attention is

分析
1.Transformer主体都是由Encoders和Decoders两部分构成

ENCODER对源句子进行一个表示,得到一个叫encoder_outputs的输出,然后将这个输出作为 DECODER的部分输入,然后对目的句子进行预测。

2.Transformer的Encoders和Encoders都是层叠结构

Encoders由$N_X$层相同的encoder层连接构成;

Decoders由$N_X$层相同的decoder层连接构成。

note:”连接构成”指的是层与层之间串接,前一层的输出会作为后一层的输入。

3.encoder结构

TIM截图20190403110500_gaitubao_com_546x269

4.decoder结构

TIM截图20190403111456_gaitubao_com_553x352

​ transformer【以二层为例】transformer_resideual_layer_norm_3

Attention计算在干什么

Attention计算的输入有当前句子的向量表示Q,参考句子的向量表示K,参考句子的另外一个向量表示V输出的是当前句子新的向量表示Z。也就是对当前句子的每一个单词向量进行更新。

  • 当Q=K=V,→→ Self-Attention
  • 当Q=目的句子向量,K=V=源句子向量,→→Encoder-Decoder Attention
Attention计算的过程
  • 公式 \(Attention(Q,K,V)\\ Q=QW^Q,K=KW^K,V= VW^V\\ attn=softmax(\frac{QK^T}{\sqrt{d_k}})\\ Z=attnV\) 对公示的简单理解:Q、K用来求权重,然后利用此权重对V进行加权平均得到Q的新表示Z。

  • 具体过程

$\longrightarrow$先分别对Q,K,V做一个普通的线性变换得到新的Q,K,V,其中要求Q,K映射到相同的维度

$\longrightarrow$当前句子某一个单词向量$Q_i$的更新过程如下:

拿$Q_i$分别和参考句子的单词向量$K_j$(j=1,…,$len(K)$)做点乘,得到一个长度为参考句子单词数量的向量,然后用$softmax$将这个向量转化成具有相对概率的权重向量$attn_i$(len($attn_i$)=len(Q),$attn_i$的一个元素$attn_{ij}$表示参考句子的第$j$个单词对当前句子的第$i$个单词的权重),然后利用$attn_i$对参考句子的另外一个向量表示$V$进行加权平均,得到$Z_i$。

2. 训练和翻译的区别

  • 训练:

TIM截图20190403133914

note

训练时,为了加快训练速度,decoder的输入直接就是bos+目的句子,为了模拟逐个单词翻译的过程,加入了masked—attention。

  • 翻译时,decoder仍然按照seq2seq中decoder的方式,逐个单词翻译。

3.transformer pytorch版代码

(1 Positional Encoding

​ Model.py get_sinusoid_encoding_table()

TIM截图20190403165729

\[cal\_angle(pos,2i) =\frac{pos}{10000^{\frac{2i}{d_{model}}}},PE(pos,2i)=sin( cal\_angle(pos,2i))\] \[cal\_angle(pos,2i+1) =\frac{pos}{10000^{\frac{2i}{d_{model}}}},PE(pos,2i)=cos( cal\_angle(pos,2i))\]
(2 Multi—Head Attention

​ ①attention

​ Modules.py ScaledDotProductAttention()

TIM截图20190403172227

​ ②MultiHeadAttention

​ Sublayer.py MultiHeadAttention()

TIM截图20190403172414

(3 FeedForward

Sublayer.py PositionwiseFeedForward()

TIM截图20190403174057

(4 Encoder,Decoder

Layers.py EncoderLayer() DecoderLayer()

(5 Encoders,Decoders

Models.py Encoder() Decoder()

(6 Transformer

Models.py Transformer()

4. transformer,seq2seq ranslation和GNMT比较

(1)seq2seq translation模型架构

seq2seq

(2)GNMT模型架构

img

(3)三者比较
  • 相同

①三者主体都是由encoder和decoder两部分构成。

②都是先通过encoder对源句子进行一个表示,得到一个叫encoder_outputs的输出,然后将这个输出或者输出的一部分作为decoder的部分输入,然后对目的句子进行预测。

  • 差异

①transformer的encoder和decoder分别分成了6个子层,每个子层的结构相同。 这种层与层的堆叠方式类似于8层的GNMT的结构,而不再像seq2seq只是一层结构transformer。

②transformer的子层没有使用具有循环结构的RNNs的结构,所以它比seq2seq translation,GNMT。【训练时transformer的快在encoder和decoder上均有体现,但是翻译时,decoder可能比RNNs的方法还慢】

②最朴素的seq2seq translation只是把最后一个单词的encoder_output喂给decoder;而transformer是把所有单词的encoder_output以attention的方式喂给decoder,这一点也和GNMT类似。