提交 8ccc6e24 编写于 作者: W wizardforcel

2021-01-18 15:30:10

上级 012c1aa4
......@@ -51,7 +51,7 @@ I will be traveling to Paris, the capital city of France, on the 2nd of March. M
我们可以在网络中通过实现的两种注意形式与非常相似,但存在细微的关键区别。 我们将从关注本地开始。
**局部注意力**中,我们的模型仅查看编码器的一些隐藏状态。 例如,如果我们正在执行句子翻译任务,并且我们正在计算翻译中的第二个单词,则模型可能希望仅查看与输入中第二个单词相关的编码器的隐藏状态 句子。 这意味着我们的模型需要查看编码器的第二个隐藏状态(`h`2),但也可能需要查看它之前的隐藏状态(`h`1)。
**局部注意力**中,我们的模型仅查看编码器的一些隐藏状态。 例如,如果我们正在执行句子翻译任务,并且我们正在计算翻译中的第二个单词,则模型可能希望仅查看与输入中第二个单词相关的编码器的隐藏状态 句子。 这意味着我们的模型需要查看编码器的第二个隐藏状态(`h2`),但也可能需要查看它之前的隐藏状态(`h1`)。
在下图中,我们可以在实践中看到这一点:
......@@ -59,11 +59,11 @@ I will be traveling to Paris, the capital city of France, on the 2nd of March. M
图 8.2 –本地注意力模型
我们首先从最终隐藏状态`h`n 计算对齐位置`p`t。 这告诉我们需要进行观察才能发现哪些隐藏状态。 然后,我们计算局部权重并将其应用于隐藏状态,以确定上下文向量。 这些权重可能告诉我们,更多地关注最相关的隐藏状态(`h`2),而较少关注先前的隐藏状态(`h`1)。
我们首先从最终隐藏状态`h[n]`计算对齐位置`p[t]`。 这告诉我们需要进行观察才能发现哪些隐藏状态。 然后,我们计算局部权重并将其应用于隐藏状态,以确定上下文向量。 这些权重可能告诉我们,更多地关注最相关的隐藏状态(`h2`),而较少关注先前的隐藏状态(`h1`)。
然后,我们获取上下文向量,并将其转发给解码器以进行预测。 在我们基于非注意力的序列到序列模型中,我们只会向前传递最终的隐藏状态`h`n,但在这里我们看到的是,我们仅考虑了我们的相关隐藏状态 模型认为做出预测是必要的。
然后,我们获取上下文向量,并将其转发给解码器以进行预测。 在我们基于非注意力的序列到序列模型中,我们只会向前传递最终的隐藏状态`h[n]`,但在这里我们看到的是,我们仅考虑了我们的相关隐藏状态 模型认为做出预测是必要的。
**全局注意力**模型的运作方式与非常相似。 但是,我们不仅要查看所有隐藏状态,还希望查看模型的所有隐藏状态,因此命名为 global。 我们可以在此处看到全局注意力层的图形化图示:
**全局注意力**模型的运作方式与非常相似。 但是,我们不仅要查看所有隐藏状态,还希望查看模型的所有隐藏状态,因此命名为全局。 我们可以在此处看到全局注意力层的图形化图示:
![Figure 8.3 – Global attention model ](img/B12365_08_3.jpg)
......@@ -376,7 +376,7 @@ for line in lines[:3]:
    return padTensor, lengths
```
4. 在我们的网络中,我们的 padded tokens 一般应该被忽略。我们不想在这些填充的标记上训练我们的模型,所以我们创建一个布尔掩码来忽略这些标记。为此,我们使用`getMask`函数,将其应用到我们的输出张量上。如果输出由一个词组成,则返回`1`,如果由一个填充标记组成,则返回`0`
4. 在我们的网络中,我们的填充标记一般应该被忽略。我们不想在这些填充的标记上训练我们的模型,所以我们创建一个布尔掩码来忽略这些标记。为此,我们使用`getMask`函数,将其应用到我们的输出张量上。如果输出由一个词组成,则返回`1`,如果由一个填充标记组成,则返回`0`
```py
def getMask(l, value=PAD_token):
......@@ -528,14 +528,14 @@ for line in lines[:3]:
        self.hidden_size = hidden_size
```
2. 然后,在这个类中创建`dot_score`函数。这个函数简单地计算我们的编码器输出与我们的编码器输出的隐藏状态的点积。虽然还有其他的方法可以将这两个 tensors 转化为单一的表示方式,但使用点积是最简单的方法之一。
2. 然后,在这个类中创建`dot_score`函数。这个函数简单地计算我们的编码器输出与我们的编码器输出的隐藏状态的点积。虽然还有其他的方法可以将这两个张量转化为单一的表示方式,但使用点积是最简单的方法之一。
```py
def dot_score(self, hidden, encoder_output):
    return torch.sum(hidden * encoder_output, dim=2)
```
3. 然后,我们在前传内使用这个函数。首先,根据`dot_score`方法计算注意力权重/能量,然后对结果进行转置,并返回max 变换后的概率分数。
3. 然后,我们在前传内使用这个函数。首先,根据`dot_score`方法计算注意力权重/能量,然后对结果进行转置,并返回 softmax 变换后的概率分数。
```py
def forward(self, hidden, encoder_outputs):
......@@ -1096,7 +1096,7 @@ print('Response:', ' '.join(output_words))
很明显,我们已经创建了一个聊天机器人,能够进行简单的来回对话。 但是,我们的聊天机器人要通过图灵测试并说服我们我们实际上正在与人类交谈,我们还有很长的路要走。 但是,考虑到我们训练模型所涉及的数据量相对较小,在序列到序列模型中使用注意已显示出相当不错的结果,证明了这些架构的通用性。
虽然最好的聊天机器人是在数十亿个数据点的庞大数据集上进行训练的,但事实证明,相对较小的聊天机器人,该模型是相当有效的。 但是,基本注意力网络已不再是最新技术,在下一章中,我们将讨论 NL P 学习的一些最新发展,这些发展已使聊天机器人更加逼真。
虽然最好的聊天机器人是在数十亿个数据点的庞大数据集上进行训练的,但事实证明,相对较小的聊天机器人,该模型是相当有效的。 但是,基本注意力网络已不再是最新技术,在下一章中,我们将讨论 NLP 学习的一些最新发展,这些发展已使聊天机器人更加逼真。
# 总结
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册