微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

注意神经机器翻译中的嵌入层

如何解决注意神经机器翻译中的嵌入层

我正在试着从website的角度来了解如何实现seq-to-seq模型。

我的问题:nn.embedding是否仅为每个单词返回一些ID,所以在整个训练过程中每个单词的嵌入都相同吗?还是在培训过程中改变了他们?

我的第二个问题是因为我感到困惑,训练后,nn.embedding的输出是否是诸如word2vec词嵌入之类的东西。

预先感谢

解决方法

根据PyTorch docs

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

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

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

作为一个虚拟示例,让我们创建一个嵌入层,将总共10个词汇表作为输入(即,输入数据总共仅包含10个唯一标记),并返回生活在5维空间中的嵌入词向量。换句话说,每个单词都表示为5维向量。虚拟数据是由3个单词组成的序列,其顺序为索引1、2和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,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的词汇表,嵌入层将简单地在其权重矩阵中“查找”第n行,并返回该行向量。因此是查找表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。