From 083cd0c39d23304ac76fa4f2bcd5e4e436f429c5 Mon Sep 17 00:00:00 2001 From: erenup Date: Sat, 28 Aug 2021 19:40:02 +0800 Subject: [PATCH] refactor --- .../2.1-图解attention.md | 7 +++ .../2.2-图解transformer.md | 58 +++++++++++++------ 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/docs/篇章2-Transformer相关原理/2.1-图解attention.md b/docs/篇章2-Transformer相关原理/2.1-图解attention.md index 2fdabd0..0b7bec6 100644 --- a/docs/篇章2-Transformer相关原理/2.1-图解attention.md +++ b/docs/篇章2-Transformer相关原理/2.1-图解attention.md @@ -1,4 +1,11 @@ ## 图解Attention +内容组织: +- 图解Attention + - seq2seq框架 + - seq2seq细节 + - Attention + - 致谢 + 篇章1中我们对Transformers在NLP中的兴起做了概述。本教程的学习路径是:Attention->Transformer->BERT->NLP应用。因此,本篇章将从attention开始,逐步对Transformer结构所涉及的知识进行深入讲解,希望能给读者以形象生动的描述。 问题:Attention出现的原因是什么? diff --git a/docs/篇章2-Transformer相关原理/2.2-图解transformer.md b/docs/篇章2-Transformer相关原理/2.2-图解transformer.md index fd98d7c..872635f 100644 --- a/docs/篇章2-Transformer相关原理/2.2-图解transformer.md +++ b/docs/篇章2-Transformer相关原理/2.2-图解transformer.md @@ -1,4 +1,25 @@ -#

图解transformer

+ +# 图解transformer + +内容组织: +- 图解transformer + - Transformer宏观结构 + - Transformer结构细节 + - 输入处理 + - 词向量 + - 位置向量 + - 编码器encoder + - Self-Attention层 + - 多头注意力机制 + - Attention代码实例 + - 残差连接 + - 解码器 + - 线性层和softmax + - 损失函数 + - 附加资料 + - 致谢 + + 在学习完[图解attention](./2.1-图解attention.md)后,我们知晓了attention为循环神经网络带来的优点。那么有没有一种神经网络结构直接基于attention构造,并且不再依赖RNN、LSTM或者CNN网络结构了呢?答案便是:Transformer。因此,我们将在本小节对Transformer所涉及的细节进行深入探讨。 Transformer模型在2017年被google提出,直接基于Self-Attention结构,取代了之前NLP任务中常用的RNN神经网络结构,并在WMT2014 Englishto-German和WMT2014 English-to-French两个机器翻译任务上都取得了当时的SOTA。 @@ -12,7 +33,8 @@ Transformer模型在2017年被google提出,直接基于Self-Attention结构, 注释和引用说明:本文将通过总-分的方式对Transformer进行拆解和讲解,希望有助于帮助初学者理解Transformer模型结构。本文主要参考[illustrated-transformer](http://jalammar.github.io/illustrated-transformer)。 -##

Transformer宏观结构

+ +## Transformer宏观结构 注意:本小节为讲解方式为:总-分,先整体,再局部。 @@ -50,7 +72,7 @@ Transformer最开始提出来解决机器翻译任务,因此可以看作是seq 以上便是Transformer的宏观结构啦,下面我们开始看宏观结构中的模型细节。 -##

Transformer结构细节

+## Transformer结构细节 了解了Transformer的宏观结构之后。下面,让我们来看看Transformer如何将输入文本序列转换为向量表示,又如何逐层处理这些向量表示得到最终的输出。 @@ -60,9 +82,10 @@ Transformer最开始提出来解决机器翻译任务,因此可以看作是seq - 位置向量 - 编码器 - 解码器 -###

输入处理

-####

词向量

+### 输入处理 + +#### 词向量 和常见的NLP 任务一样,我们首先会使用词嵌入算法(embedding algorithm),将输入文本序列的每个词转换为一个词向量。实际应用中的向量一般是 256 或者 512 维。但为了简化起见,我们这里使用4维的词向量来进行讲解。 如下图所示,假设我们的输入文本是序列包含了3个词,那么每个词可以通过词嵌入算法得到一个4维向量,于是整个输入被转化成为一个向量序列。在实际应用中,我们通常会同时给模型输入多个句子,如果每个句子的长度不一样,我们会选择一个合适的长度,作为输入文本序列的最大长度:如果一个句子达不到这个长度,那么就填充先填充一个特殊的“padding”词;如果句子超出这个长度,则做截断。最大序列长度是一个超参数,通常希望越大越好,但是更长的序列往往会占用更大的训练显存/内存,因此需要在模型训练时候视情况进行决定。 @@ -72,7 +95,7 @@ Transformer最开始提出来解决机器翻译任务,因此可以看作是seq 输入序列每个单词被转换成词向量表示还将加上位置向量来得到该词的最终向量表示。 -####

位置向量

+#### 位置向量 如下图所示,Transformer模型对每个输入的词向量都加上了一个位置向量。这些向量有助于确定每个单词的位置特征,或者句子中不同单词之间的距离特征。词向量加上位置向量背后的直觉是:将这些表示位置的向量添加到词向量中,得到的新向量,可以为模型提供更多有意义的信息,比如词的位置,词之间的距离等。 @@ -94,7 +117,8 @@ $$ 当然,上述公式不是唯一生成位置编码向量的方法。但这种方法的优点是:可以扩展到未知的序列长度。例如:当我们的模型需要翻译一个句子,而这个句子的长度大于训练集中所有句子的长度,这时,这种位置编码的方法也可以生成一样长的位置编码向量。 -###

编码器encoder

+### 编码器encoder + 编码部分的输入文本序列经过输入处理之后得到了一个向量序列,这个向量序列将被送入第1层编码器,第1层编码器输出的同样是一个向量序列,再接着送入下一层编码器:第1层编码器的输入是融合位置向量的词向量,*更上层编码器的输入则是上一层编码器的输出*。 下图展示了向量序列在单层encoder中的流动:融合位置信息的词向量进入self-attention层,self-attention的输出每个位置的向量再输入FFN神经网络得到每个位置的新向量。 @@ -107,7 +131,7 @@ $$ ![一层传一层](./pictures/2-multi-encoder.webp) 图:2个单词的例子:$x_1, x_2 \to z_1, z_2 \to r_1, r_2$ -####

Self-Attention层

+####

Self-Attention层

下面来分析一下上图中Self-Attention层的具体机制。 @@ -171,7 +195,7 @@ Attention score是根据"*Thinking*" 对应的 Query 向量和其他位置的每 ![Think计算](./pictures/2-sum.png) 图:Thinking经过attention之后的向量表示$z_1$ -#####

Self-Attention矩阵计算

+##### Self-Attention矩阵计算 将self-attention计算6个步骤中的向量放一起,比如$X=[x_1;x_2]$,便可以进行矩阵计算啦。下面,依旧按步骤展示self-attention的矩阵计算方法。 $$X = [X_1;X_2] \\ @@ -187,7 +211,7 @@ Z = softmax(\frac{QK^T}{\sqrt{d_k}}) V$$ ![输出](./pictures/2-attention-output.webp) 图:得到输出$Z$ -####

多头注意力机制(multi-head attention)

+#### 多头注意力机制 Transformer 的论文通过增加多头注意力机制(一组注意力称为一个 attention head),进一步完善了Self-Attention。这种机制从如下两个方面增强了attention层的能力: @@ -226,7 +250,7 @@ Transformer 的论文通过增加多头注意力机制(一组注意力称为 当我们编码单词"it"时,其中一个 attention head (橙色注意力头)最关注的是"the animal",另外一个绿色 attention head 关注的是"tired"。因此在某种意义上,"it"在模型中的表示,融合了"animal"和"tire"的部分表达。 -####

Attention代码实例

+#### Attention代码实例 下面的代码实现中,张量的第1维是 batch size,第 2 维是句子长度。代码中进行了详细注释和说明。 ``` @@ -317,7 +341,7 @@ print(output.shape) ``` -###

残差连接

+#### 残差连接 到目前为止,我们计算得到了self-attention的输出向量。而单层encoder里后续还有两个重要的操作:残差链接、标准化。 @@ -337,7 +361,7 @@ print(output.shape) ![2层示意图](./pictures/2-2layer.png) 图:2层Transformer示意图 -##

解码器

+## 解码器 现在我们已经介绍了编码器中的大部分概念,我们也基本知道了编码器的原理。现在让我们来看下, 编码器和解码器是如何协同工作的。 @@ -354,7 +378,7 @@ print(output.shape) 1. 在解码器里,Self Attention 层只允许关注到输出序列中早于当前位置之前的单词。具体做法是:在 Self Attention 分数经过 Softmax 层之前,屏蔽当前位置之后的那些位置(将attention score设置成-inf)。 2. 解码器 Attention层是使用前一层的输出来构造Query 矩阵,而Key矩阵和 Value矩阵来自于编码器最终的输出。 -##

线性层和softmax

+## 线性层和softmax Decoder 最终的输出是一个向量,其中每个元素是浮点数。我们怎么把这个向量转换为单词呢?这是线性成和softmax完成的。 @@ -365,7 +389,7 @@ Decoder 最终的输出是一个向量,其中每个元素是浮点数。我们 ![线性层](./pictures/2-linear.png) 图:线性层 -##

损失函数

+## 损失函数 Transformer训练的时候,需要将解码器的输出和label一同送入损失函数,以获得loss,最终模型根据loss进行方向传播。这一小节,我们用一个简单的例子来说明训练过程的loss计算:把“merci”翻译为“thanks”。 @@ -402,7 +426,7 @@ Transformer训练的时候,需要将解码器的输出和label一同送入损 - Greedy decoding:由于模型每个时间步只产生一个输出,我们这样看待:模型是从概率分布中选择概率最大的词,并且丢弃其他词。这种方法叫做贪婪解码(greedy decoding)。 - Beam search:每个时间步保留k个最高概率的输出词,然后在下一个时间步,根据上一个时间步保留的k个词来确定当前应该保留哪k个词。假设k=2,第一个位置概率最高的两个输出的词是”I“和”a“,这两个词都保留,然后根据第一个词计算第2个位置的词的概率分布,再取出第2个位置上2个概率最高的词。对于第3个位置和第4个位置,我们也重复这个过程。这种方法称为集束搜索(beam search)。 -##

附加资料

+## 附加资料 我希望上面讲的内容,可以帮助你理解 Transformer 中的主要概念。如果你想更深一步地理解,我建议你可以参考下面这些: @@ -421,7 +445,7 @@ Transformer训练的时候,需要将解码器的输出和label一同送入损 - 查看这个项目:【Tensor2Tensor repo】 链接地址:https://github.com/tensorflow/tensor2tensor -##

致谢

+## 致谢 主要由哈尔滨工业大学张贤同学翻译撰写,由多多同学、datawhale项目同学重新组织。最后,期待您的阅读反馈和star哦,谢谢。