fix typo
This commit is contained in:
parent
26d190a195
commit
463b18a221
|
@ -17,7 +17,7 @@
|
|||
## 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
|
||||
Language Understanding](https://arxiv.org/pdf/1810.04805.pdf)使用Transformer模型结构进行大规模语言模型(language model)预训练(Pre-train),再在多个NLP下游(downstream)任务中进行微调(Finetune),一举刷新了各大NLP任务的榜单最高分,轰动一时。2019年-2021年,研究人员将Transformer这种模型结构和预训练+微调这种训练方式相结合,提出了一系列Transformer模型结构、训练方式的改进(比如transformer-xl,XLnet,Roberta等等)。如下图所示,各类Transformer的改进不断涌现。
|
||||
Language Understanding](https://arxiv.org/pdf/1810.04805.pdf)使用Transformer模型结构进行大规模语言模型(language model)预训练(Pre-train),再在多个NLP下游(downstream)任务中进行微调(Finetune),一举刷新了各大NLP任务的榜单最高分,轰动一时。2019年-2021年,研究人员将Transformer这种模型结构和预训练+微调这种训练方式相结合,提出了一系列Transformer模型结构、训练方式的改进(比如transformer-xl,XLnet,Roberta等等)。如下图所示,各类Transformer的改进不断涌现。
|
||||
|
||||
图:各类Transformer改进,来源:[A Survey of Transformers](https://arxiv.org/pdf/2106.04554.pdf)
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ seq2seq模型是由编码器(Encoder)和解码器(Decoder)组成的。
|
|||
解码器也持有 hidden state(隐藏层状态),而且也需要把 hidden state(隐藏层状态)从一个时间步传递到下一个时间步。我们没有在上图中可视化解码器的 hidden state,是因为这个过程和解码器是类似的,我们现在关注的是 RNN 的主要处理过程。
|
||||
现在让我们用另一种方式来可视化序列到序列(seq2seq)模型。下面的动画会让我们更加容易理解模型。这种方法称为展开视图。其中,我们不只是显示一个解码器,而是在时间上展开,每个时间步都显示一个解码器。通过这种方式,我们可以看到每个时间步的输入和输出。
|
||||
|
||||
 动态图:解决码器相关
|
||||
 动态图:解码器相关
|
||||
|
||||
## Attention 讲解
|
||||
事实证明,上下文context向量是这类模型的瓶颈。这使得模型在处理长文本时面临非常大的挑战。
|
||||
|
@ -86,8 +86,8 @@ seq2seq模型是由编码器(Encoder)和解码器(Decoder)组成的。
|
|||
3. 注意力的步骤:我们使用编码器的 hidden state(隐藏层状态)和 h4 向量来计算这个时间步的上下文向量(C4)。
|
||||
4. 我们把 h4 和 C4 拼接起来,得到一个向量。
|
||||
5. 我们把这个向量输入一个前馈神经网络(这个网络是和整个模型一起训练的)。
|
||||
6. 前馈神经网络的输出的输出表示这个时间步输出的单词。
|
||||
7. 在下一个时间步重复这个步骤。
|
||||
6. 前馈神经网络的输出表示这个时间步输出的单词。
|
||||
7. 在下一个时间步重复1-6步骤。
|
||||
 动态图:attention过程
|
||||
|
||||
下图,我们使用另一种方式来可视化注意力,看看在每个解码的时间步中关注输入句子的哪些部分:
|
||||
|
|
|
@ -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 的效果。
|
||||
|
||||
这个模型的其中一个优点,就是使得模型训练过程能够并行计算。在 RNN 中,每一个 time step 的计算都依赖于上一个 time step 的输出,这就使得所有的 time step 必须串行化,无法并行计算,如下图所示。
|
||||
这个模型的其中一个优点,就是使得模型训练过程能够并行计算。在 RNN 中,每一个 time step (时间步)的计算都依赖于上一个 time step 的输出,这就使得所有的 time step 必须串行化,无法并行计算,如下图所示。
|
||||
|
||||

|
||||
图:机器翻译示意图
|
||||
|
@ -60,7 +60,7 @@ encoder由多层编码器组成,每层编码器在结构上都是一样的,
|
|||

|
||||
|
||||
图:decoder
|
||||
以上便是在机器翻译任务里,宏观上的的transformer啦。
|
||||
以上便是在机器翻译任务里,宏观上的transformer啦。
|
||||
|
||||
## 从细节来理解 Transformer
|
||||
|
||||
|
@ -177,7 +177,7 @@ Query 向量,Key 向量,Value 向量是什么含义呢?
|
|||
Transformer 的论文通过增加多头注意力机制(一组注意力称为一个 attention head),进一步完善了 Self Attention 层。这种机制从如下两个方面增强了 attention 层的能力:
|
||||
|
||||
- 它扩展了模型关注不同位置的能力。在上面的例子中,第一个位置的输出 z1 包含了句子中其他每个位置的很小一部分信息,但 z1 可能主要是由第一个位置的信息决定的。当我们翻译句子:`The animal didn’t 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$ 可以看作是把输入的向量映射到一个”子表示空间“。
|
||||
|
||||

|
||||
图:多头注意力机制
|
||||
|
@ -285,7 +285,7 @@ key = torch.rand(10,64,300)
|
|||
# batch_size 为 64,有 10 个词,每个词的 Value 向量是 300 维
|
||||
value= torch.rand(10,64,300)
|
||||
|
||||
embed_dim = 299
|
||||
embed_dim = 300
|
||||
num_heads = 1
|
||||
# 输出是 (attn_output, attn_output_weights)
|
||||
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层,这有助于解码器把注意力集中中输入序列的合适位置。
|
||||
|
||||
在完成了编码(encoding)阶段之后,我们开始解码(decoding)阶段。解码(decoding )阶段的每一个时间步都输出一个翻译后的单词(这里的例子是英语翻译)。
|
||||
在完成了编码(encoding)阶段之后,我们开始解码(decoding)阶段。解码(decoding )阶段的每一个时间步都输出一个翻译后的单词(这里的例子是英语翻译),解码器当前时间步的输出又重新输入和编码器的输出共同作为下一个时间步解码器的输入。
|
||||
|
||||
接下来会重复这个过程,直到输出一个结束符,Transformer 就完成了所有的输出。每一步的输出都会在下一个时间步输入到下面的第一个解码器。Decoder 就像 Encoder 那样,从下往上一层一层地输出结果。正对如编码器的输入所做的处理,我们把解码器的输入向量,也加上位置编码向量,来指示每个词的位置。
|
||||
接下来会重复这个过程,直到输出一个结束符,Transformer 就完成了所有的输出。Decoder 就像 Encoder 那样,从下往上一层一层地输出结果。正对如编码器的输入所做的处理,我们把解码器的输入向量,也加上位置编码向量,来指示每个词的位置。
|
||||
|
||||

|
||||
动态图:decoder动态图
|
||||
|
@ -522,7 +522,7 @@ Decoder 最终的输出是一个向量,其中每个元素是浮点数。我们
|
|||

|
||||
图:概率分布
|
||||
|
||||
由于模型的参数都是随机初始化的。模型在每个词输出的概率都是随机的。我们可以把这个概率和正确的输出概率做对比,然后使用反向传播来调整模型的权重,使得输出的概率分布更加接近震数输出。
|
||||
由于模型的参数都是随机初始化的。模型在每个词输出的概率都是随机的。我们可以把这个概率和正确的输出概率做对比,然后使用反向传播来调整模型的权重,使得输出的概率分布更加接近整数输出。
|
||||
|
||||
那我们要怎么比较两个概率分布呢?我们可以简单地用一个概率分布减去另一个概率分布。关于更多细节,你可以查看交叉熵(cross-entropy)]和KL 散度(Kullback–Leibler divergence)的相关概念。
|
||||
|
||||
|
|
Loading…
Reference in New Issue