详解谷歌机器翻译模型:Transformer2021-03-06

详解谷歌机器翻译模型:Transformer

1. 模型框/架

 Transformer 是谷歌提出的机器翻译模型。其包括了一个编码器Encoder和Decoder,这是一个翻译的模型,将源语言input进编码器,然后通过解码器输出模型 。可以表示为如下

图1:整个Transformer由编码器和解码器组成

 输入编码器是一系列的编码器的集合,这个编码器是,论文中包括了六个编码器(六个并没有特殊的要求),同样,解码器就是也是由六个编码器堆叠而成的如图2。

图二

  六个编码器都是一样的结构(尽管他们并不共享权重),每一个都可以分解为如下的两个子层,即子注意力。

图三:

 输入首先经过一个Self-Attention层作为输入,这一层在编码一个句子中指定的单词的时候可以帮助观察到其他的单词,输出。

 Self-Attention的输出被送入前馈神经网络,并且一个句子的每个单词在送入前馈神经网络中都是独立的,不会交叉输入。

 解码器也有这些层,但是在自注意层和前馈层还有一个Encoder-Decoder Attention 层,并且在堆叠的这些编码器的顶部通往每一个,堆叠的解码器中的每一个Encoder-Decoder Attention 层。

图4

2. 具体的步骤

2.1 Embedding algorithm

 一般都会把每一个单词使用embedding algorithm编码成一个向量,这种编码发生在编码器最底部的输入之前。如下是把其编码成了512个维度:

图5

 在上图我们可以看到一个句子的输入会在自己对应的位置开始输入,一般会设置一个输入的最长的长度如N=1000即每次最多能输入和翻译1000个单词。

2.2 使用单词进行具体说明
图6

 对于下面这句话:
The animal didn't cross the street because it was too tired. 中的 it 指的是什么,自注意力就可以把它和 animal 相关联。

图7
2.3 三个向量Query\,vector,Key\,vector和Value\, vector的细节
step 1 后面的计算position都以1为标准

 第一步是根据每一个输入的向量中计算出三个向量: Query\,vector,Key\,vector和Value\, vector, 这些向量通过原始输入乘法上三个矩阵(在训练中学习到的)生成。注意到这些新的vector的维度要比原始的输入的维度小很多,只有64(假设)。

图8
step 2

 第二步是计算一个 score ,按照比如第一个单词x_1:score(x_1,x_1) = q1\cdot k1,score(x_1,x_2)=q1,k2 \cdots

图9
step3

 把这些score/8(让其为\sqrt{Key\,vector的维度}),从而获得更为稳定的梯度。然后使用Softmax进行概率的计算。来得到每一个单词的在这个位置(position)的占比或重要程度。

 接着把每一个(Value \,vector)*(Softmax\,score)进行加权求和(权重为Softmax\,score),来得到这一位置的最后输出向量z_1

2.4 向量化表示,三个向量的矩阵话运算表示
图10
图11

 可以从上图看出,输入的横向量堆砌而成的矩阵,经过和三个变换矩阵的乘积然后得到

Query\,matrix,Key\,matrix和Value\, matrix这三个矩阵,然后经过一系列运算得到最终的Z matrix

2.5 Multi-Headed

 我们希望能够生成多组 Q,K,V从而更好的提升模型的表达效果

图12

 对于生成的各组z我们也会通过增广矩阵的形式并乘上一个权重矩阵从而得到最后的z ,如下图所示

图13
2.6 位置编码 Positional Encoding

 这里方法用到的理念:把这些只跟位置相关的值加入到embedding后,把他们投影到Q/K/V后就可以在dot\,product\,attention过程中提供有效的距离。

图14

 原文提出了两种方式:一种是训练出一个位置编码,第二种是用原文使用的三角函数编码的方式,其具体公式如下:
PE(pos)= \begin{cases} sin\left( \cfrac {pos}{10000^{\cfrac{i}{d_{model}}}}\right) if\, i为偶数 \\ cos\left( \cfrac {pos}{10000^{\cfrac{i-1}{d_{model}}}}\right) if\,i为奇数 \end{cases}\\ 注:使用三角函数是因为三角函数的性质既可以考虑到绝对位置又可以考虑到相对位置\\ cos(\alpha + \beta)=cos(\alpha)*cos(\beta)-sin(\alpha)*sin(\beta)\\ sin(\alpha+\beta)=sin(\alpha)*cos(\beta)+cos(\alpha)*sin(\beta)\\ 通过这些公式可以通过位置k的先行表达来表示位置k+x

# 具体的编码代码实现,可以了解一下
class PositionalEncoding(nn.Module):
    "Implement the PE function."
    def __init__(self, d_model, dropout, max_len=5000):
        super(PositionalEncoding, self).__init__()
        self.dropout = nn.Dropout(p=dropout)
        (
        # Compute the positional encodings once in log space.
        pe = torch.zeros(max_len, d_model)  # (max_words_nums,d_model)维度矩阵
        position = torch.arange(0, max_len).unsqueeze(1)    # 生成一个[0,1...max_len-1]的列向量,维度为(max_len,1)
        div_term = torch.exp(torch.arange(0, d_model, 2) *
                             -(math.log(10000.0) / d_model))
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        pe = pe.unsqueeze(0)
        self.register_buffer('pe', pe)  #使用这个函数 是为了不放入模型的self.parameters(),而是注册一个缓冲区进行保存
    def forward(self, x):
        x = x + Variable(self.pe[:, :x.size(1)], 
                         requires_grad=False)
        return self.dropout(x)
2.7 残差块

 在Encoder之间会有残差连接,具体可以如下:
图15

 由上图可以看出残差连接会从下面的一个Self-Attention的输入连接到Self-Attention的输出进行Add和Normalize操作,具体如下图所示:

图16

 同时解码器也有同样的结构,具体的可以用下图来表示:

图17
2.8 解码器工作

 编码器以处理输入序列作为开始,最顶端的编码器输出的Q,K,V会送入解码器的每一个Encoder-Decoder\,Attention层,从而能让解码器注意到适当的位置。

图18

 由上图可以看出,解码器的工作方式和编码器有些不同,解码器每一步输出一个元素,并重复这个过程直到输出一个特定的符号来表示一个翻译的结尾。,每一步的输出在下一次运算时被送入底部的解码器,并且项编码器一样被加入了位置信息。

 Decoder中的Self-Attention层和Decoder中的有一些的区别,在Decoder中,self-attention layer 仅仅能访问之前输出的Output,这是通过在self-attenion 计算过程中Softmax步骤之前就把后面的位置填充为-inf符号来实现的。

2.9 最后的Linear 和Softmax Layer

 解码器把输出堆叠为浮点型向量,这个向量通过Linear层后跟Softmax layer 来实现的。通过Softmax layer算的对数概率,最后输出概率最大的那个单词。

图19

3. 训练的一些细节

 在训练过程中,可以把标注和输出进行监督学习.为了可视化这个过程,假设输出词汇仅包含六个单词(“a”, “am”, “i”, “thanks”, “student”, and “<eos>(eos是句子的结束符号)” ).

图20

 没有训练的输出可以比较杂乱无章, 他们之间的loss就可以用一些交叉熵和KL散度等其他的方式来计算.

图21

 在经历过多次的迭代优化后,可以让其在对应的位置达到很高的概率.

4.

后续的一些工作:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352