嵌入层在神经机器翻译中的应用值得关注



我正在努力了解如何通过这个网站来实现seq-to-seq模型。

我的问题是:nn.embedding只是为每个单词返回一些ID,所以在整个训练过程中每个单词的嵌入都是一样的吗?还是在训练过程中发生了变化?

我的第二个问题是,我很困惑在训练后,nn.embedding的输出是否是word2vec单词嵌入之类的东西。

提前感谢

根据PyTorch文档:

一个简单的查找表,用于存储固定字典和大小的嵌入。

该模块通常用于存储单词嵌入并使用索引检索它们。模块的输入是索引列表,输出是相应的单词嵌入。

简而言之,nn.Embedding将一系列词汇索引嵌入到一个新的嵌入空间中。您确实可以大致将其理解为word2vec风格的机制。

作为一个伪示例,让我们创建一个嵌入层,该嵌入层将总共10个词汇表作为输入(即,输入数据仅包含总共10个唯一令牌(,并返回生活在5维空间中的嵌入单词向量。换句话说,每个单词都表示为5维向量。伪数据是索引为1、2和3的3个字的序列。

>>> embedding = nn.Embedding(10, 5)
>>> embedding(torch.tensor([1, 2, 3]))
tensor([[-0.7077, -1.0708, -0.9729,  0.5726,  1.0309],
[ 0.2056, -1.3278,  0.6368, -1.9261,  1.0972],
[ 0.8409, -0.5524, -0.1357,  0.6838,  3.0991]],
grad_fn=<EmbeddingBackward>)

您可以看到,这三个单词中的每一个现在都表示为5维向量。我们还看到有一个grad_fn函数,这意味着该层的权重将通过反向投影进行调整。这回答了嵌入层是否可训练的问题:答案是肯定的。事实上,这就是嵌入的全部意义:我们希望嵌入层学习有意义的表示,king - man = queen的著名例子是这些嵌入层可以学习的经典例子。


编辑

正如文档所述,嵌入层是一个来自矩阵的简单查找表。你可以通过看到这一点

>>> embedding.weight
Parameter containing:
tensor([[-1.1728, -0.1023,  0.2489, -1.6098,  1.0426],
[-0.7077, -1.0708, -0.9729,  0.5726,  1.0309],
[ 0.2056, -1.3278,  0.6368, -1.9261,  1.0972],
[ 0.8409, -0.5524, -0.1357,  0.6838,  3.0991],
[-0.4569, -1.9014, -0.0758, -0.6069, -1.2985],
[ 0.4545,  0.3246, -0.7277,  0.7236, -0.8096],
[ 1.2569,  1.2437, -1.0229, -0.2101, -0.2963],
[-0.3394, -0.8099,  1.4016, -0.8018,  0.0156],
[ 0.3253, -0.1863,  0.5746, -0.0672,  0.7865],
[ 0.0176,  0.7090, -0.7630, -0.6564,  1.5690]], requires_grad=True)

您将看到这个矩阵的第一行、第二行和第三行对应于上面示例中返回的结果。换句话说,对于索引为n的词汇表,嵌入层将简单地";查找";其权重矩阵中的第CCD_ 5行并返回该行向量;从而形成查找表。

相关内容

  • 没有找到相关文章

最新更新