This commit is contained in:
erenup 2021-08-18 09:48:28 +08:00
parent 26d190a195
commit 463b18a221
3 changed files with 11 additions and 11 deletions

View File

@ -17,7 +17,7 @@
## Transformer的兴起 ## Transformer的兴起
2017年[Attention Is All You Need](https://arxiv.org/pdf/1706.03762.pdf)论文首次提出了**Transformer**模型结构并在机器翻译任务上取得了The State of the Art(SOTA, 最好)的效果。2018年[BERT: Pre-training of Deep Bidirectional Transformers for 2017年[Attention Is All You Need](https://arxiv.org/pdf/1706.03762.pdf)论文首次提出了**Transformer**模型结构并在机器翻译任务上取得了The State of the Art(SOTA, 最好)的效果。2018年[BERT: Pre-training of Deep Bidirectional Transformers for
Language Understanding](https://arxiv.org/pdf/1810.04805.pdf)使用Transformer模型结构进行大规模语言模型language model预训练Pre-train再在多个NLP下游downstream任务中进行微调Finetune,一举刷新了各大NLP任务的榜单最高分轰动一时。2019年-2021年研究人员将Transformer这种模型结构和预训练+微调这种训练方式相结合提出了一系列Transformer模型结构、训练方式的改进比如transformer-xlXLnetRoberta等等。如下图所示各类Transformer的改进不断涌现。 Language Understanding](https://arxiv.org/pdf/1810.04805.pdf)使用Transformer模型结构进行大规模语言模型language model预训练Pre-train再在多个NLP下游downstream任务中进行微调Finetune一举刷新了各大NLP任务的榜单最高分轰动一时。2019年-2021年研究人员将Transformer这种模型结构和预训练+微调这种训练方式相结合提出了一系列Transformer模型结构、训练方式的改进比如transformer-xlXLnetRoberta等等。如下图所示各类Transformer的改进不断涌现。
![放在一起](./pictures/1-x-formers.png)图各类Transformer改进来源[A Survey of Transformers](https://arxiv.org/pdf/2106.04554.pdf) ![放在一起](./pictures/1-x-formers.png)图各类Transformer改进来源[A Survey of Transformers](https://arxiv.org/pdf/2106.04554.pdf)

View File

@ -54,7 +54,7 @@ seq2seq模型是由编码器Encoder和解码器Decoder组成的。
解码器也持有 hidden state隐藏层状态而且也需要把 hidden state隐藏层状态从一个时间步传递到下一个时间步。我们没有在上图中可视化解码器的 hidden state是因为这个过程和解码器是类似的我们现在关注的是 RNN 的主要处理过程。 解码器也持有 hidden state隐藏层状态而且也需要把 hidden state隐藏层状态从一个时间步传递到下一个时间步。我们没有在上图中可视化解码器的 hidden state是因为这个过程和解码器是类似的我们现在关注的是 RNN 的主要处理过程。
现在让我们用另一种方式来可视化序列到序列seq2seq模型。下面的动画会让我们更加容易理解模型。这种方法称为展开视图。其中我们不只是显示一个解码器而是在时间上展开每个时间步都显示一个解码器。通过这种方式我们可以看到每个时间步的输入和输出。 现在让我们用另一种方式来可视化序列到序列seq2seq模型。下面的动画会让我们更加容易理解模型。这种方法称为展开视图。其中我们不只是显示一个解码器而是在时间上展开每个时间步都显示一个解码器。通过这种方式我们可以看到每个时间步的输入和输出。
![](./pictures/1-6-seq2seq-decoder.gif) 动态图:解码器相关 ![](./pictures/1-6-seq2seq-decoder.gif) 动态图:解码器相关
## Attention 讲解 ## Attention 讲解
事实证明上下文context向量是这类模型的瓶颈。这使得模型在处理长文本时面临非常大的挑战。 事实证明上下文context向量是这类模型的瓶颈。这使得模型在处理长文本时面临非常大的挑战。
@ -86,8 +86,8 @@ seq2seq模型是由编码器Encoder和解码器Decoder组成的。
3. 注意力的步骤:我们使用编码器的 hidden state隐藏层状态和 h4 向量来计算这个时间步的上下文向量C4 3. 注意力的步骤:我们使用编码器的 hidden state隐藏层状态和 h4 向量来计算这个时间步的上下文向量C4
4. 我们把 h4 和 C4 拼接起来,得到一个向量。 4. 我们把 h4 和 C4 拼接起来,得到一个向量。
5. 我们把这个向量输入一个前馈神经网络(这个网络是和整个模型一起训练的)。 5. 我们把这个向量输入一个前馈神经网络(这个网络是和整个模型一起训练的)。
6. 前馈神经网络的输出的输出表示这个时间步输出的单词。 6. 前馈神经网络的输出表示这个时间步输出的单词。
7. 在下一个时间步重复这个步骤。 7. 在下一个时间步重复1-6步骤。
![](./pictures/1-7-attention-pro.gif) 动态图attention过程 ![](./pictures/1-7-attention-pro.gif) 动态图attention过程
下图,我们使用另一种方式来可视化注意力,看看在每个解码的时间步中关注输入句子的哪些部分: 下图,我们使用另一种方式来可视化注意力,看看在每个解码的时间步中关注输入句子的哪些部分:

View File

@ -11,7 +11,7 @@ Transformer 依赖于 Self Attention 的知识。Attention 是一种在深度学
2017 年Google 提出了 Transformer 模型,用 Self Attention 的结构,取代了以往 NLP 任务中的 RNN 网络结构,在 WMT 2014 Englishto-German 和 WMT 2014 English-to-French两个机器翻译任务上都取得了当时 SOTA 的效果。 2017 年Google 提出了 Transformer 模型,用 Self Attention 的结构,取代了以往 NLP 任务中的 RNN 网络结构,在 WMT 2014 Englishto-German 和 WMT 2014 English-to-French两个机器翻译任务上都取得了当时 SOTA 的效果。
这个模型的其中一个优点,就是使得模型训练过程能够并行计算。在 RNN 中,每一个 time step 的计算都依赖于上一个 time step 的输出,这就使得所有的 time step 必须串行化,无法并行计算,如下图所示。 这个模型的其中一个优点,就是使得模型训练过程能够并行计算。在 RNN 中,每一个 time step (时间步)的计算都依赖于上一个 time step 的输出,这就使得所有的 time step 必须串行化,无法并行计算,如下图所示。
![机器翻译示意图](./pictures/2-translation.png) ![机器翻译示意图](./pictures/2-translation.png)
图:机器翻译示意图 图:机器翻译示意图
@ -60,7 +60,7 @@ encoder由多层编码器组成每层编码器在结构上都是一样的
![decoder](./pictures/2-decoder.webp) ![decoder](./pictures/2-decoder.webp)
decoder decoder
以上便是在机器翻译任务里,宏观上的transformer啦。 以上便是在机器翻译任务里宏观上的transformer啦。
## 从细节来理解 Transformer ## 从细节来理解 Transformer
@ -177,7 +177,7 @@ Query 向量Key 向量Value 向量是什么含义呢?
Transformer 的论文通过增加多头注意力机制(一组注意力称为一个 attention head进一步完善了 Self Attention 层。这种机制从如下两个方面增强了 attention 层的能力: Transformer 的论文通过增加多头注意力机制(一组注意力称为一个 attention head进一步完善了 Self Attention 层。这种机制从如下两个方面增强了 attention 层的能力:
- 它扩展了模型关注不同位置的能力。在上面的例子中,第一个位置的输出 z1 包含了句子中其他每个位置的很小一部分信息,但 z1 可能主要是由第一个位置的信息决定的。当我们翻译句子:`The animal didnt cross the street because it was too tired`时我们想让机器知道其中的it指代的是什么。这时多头注意力机制会有帮助。 - 它扩展了模型关注不同位置的能力。在上面的例子中,第一个位置的输出 z1 包含了句子中其他每个位置的很小一部分信息,但 z1 可能主要是由第一个位置的信息决定的。当我们翻译句子:`The animal didnt cross the street because it was too tired`时我们想让机器知道其中的it指代的是什么。这时多头注意力机制会有帮助。
- 多头注意力机制赋予 attention 层多个“子表示空间”。下面我们会看到,多头注意力机制会有多组$W^Q, W^K W^V$ 的权重矩阵(在 Transformer 的论文中,使用了 8 组注意力attention heads。因此接下来我也是用 8 组注意力头 attention heads。每一组注意力的权重矩阵都是随机初始化的。经过训练之后,每一组注意力$W^Q, W^K W^V$ 可以看作是把输入的向量映射到一个”子表示空间“。 - 多头注意力机制赋予 attention 层多个“子表示空间”。下面我们会看到,多头注意力机制会有多组$W^Q, W^K W^V$ 的权重矩阵(在 Transformer 的论文中,使用了 8 组注意力attention heads。因此接下来我也是用 8 组注意力头 attention heads。每一组注意力的权重矩阵都是随机初始化的。经过训练之后每一组注意力$W^Q, W^K W^V$ 可以看作是把输入的向量映射到一个”子表示空间“。
![多头注意力机制](./pictures/2-multi-head.png) ![多头注意力机制](./pictures/2-multi-head.png)
图:多头注意力机制 图:多头注意力机制
@ -285,7 +285,7 @@ key = torch.rand(10,64,300)
# batch_size 为 64有 10 个词,每个词的 Value 向量是 300 维 # batch_size 为 64有 10 个词,每个词的 Value 向量是 300 维
value= torch.rand(10,64,300) value= torch.rand(10,64,300)
embed_dim = 299 embed_dim = 300
num_heads = 1 num_heads = 1
# 输出是 (attn_output, attn_output_weights) # 输出是 (attn_output, attn_output_weights)
multihead_attn = nn.MultiheadAttention(embed_dim, num_heads) multihead_attn = nn.MultiheadAttention(embed_dim, num_heads)
@ -468,9 +468,9 @@ x = x.view(bsz, -1, self.n_heads * (self.hid_dim // self.n_heads))
上面说了,编码器一般有多层,第一个编码器的输入是一个序列,最后一个编码器输出是一组注意力向量 K 和 V。这些注意力向量将会输入到每个解码器的Encoder-Decoder Attention层这有助于解码器把注意力集中中输入序列的合适位置。 上面说了,编码器一般有多层,第一个编码器的输入是一个序列,最后一个编码器输出是一组注意力向量 K 和 V。这些注意力向量将会输入到每个解码器的Encoder-Decoder Attention层这有助于解码器把注意力集中中输入序列的合适位置。
在完成了编码encoding阶段之后我们开始解码decoding阶段。解码decoding )阶段的每一个时间步都输出一个翻译后的单词(这里的例子是英语翻译)。 在完成了编码encoding阶段之后我们开始解码decoding阶段。解码decoding )阶段的每一个时间步都输出一个翻译后的单词(这里的例子是英语翻译),解码器当前时间步的输出又重新输入和编码器的输出共同作为下一个时间步解码器的输入
接下来会重复这个过程直到输出一个结束符Transformer 就完成了所有的输出。每一步的输出都会在下一个时间步输入到下面的第一个解码器。Decoder 就像 Encoder 那样,从下往上一层一层地输出结果。正对如编码器的输入所做的处理,我们把解码器的输入向量,也加上位置编码向量,来指示每个词的位置。 接下来会重复这个过程直到输出一个结束符Transformer 就完成了所有的输出。Decoder 就像 Encoder 那样,从下往上一层一层地输出结果。正对如编码器的输入所做的处理,我们把解码器的输入向量,也加上位置编码向量,来指示每个词的位置。
![decoder动态图](./pictures/2-decoder.gif) ![decoder动态图](./pictures/2-decoder.gif)
动态图decoder动态图 动态图decoder动态图
@ -522,7 +522,7 @@ Decoder 最终的输出是一个向量,其中每个元素是浮点数。我们
![概率分布](./pictures/2-loss.webp) ![概率分布](./pictures/2-loss.webp)
图:概率分布 图:概率分布
由于模型的参数都是随机初始化的。模型在每个词输出的概率都是随机的。我们可以把这个概率和正确的输出概率做对比,然后使用反向传播来调整模型的权重,使得输出的概率分布更加接近数输出。 由于模型的参数都是随机初始化的。模型在每个词输出的概率都是随机的。我们可以把这个概率和正确的输出概率做对比,然后使用反向传播来调整模型的权重,使得输出的概率分布更加接近数输出。
那我们要怎么比较两个概率分布呢?我们可以简单地用一个概率分布减去另一个概率分布。关于更多细节,你可以查看交叉熵(cross-entropy)]和KL 散度(KullbackLeibler divergence)的相关概念。 那我们要怎么比较两个概率分布呢?我们可以简单地用一个概率分布减去另一个概率分布。关于更多细节,你可以查看交叉熵(cross-entropy)]和KL 散度(KullbackLeibler divergence)的相关概念。