python - nn.Embedding 模块如何直观地与一般嵌入的概念相关联?

标签 python deep-learning pytorch

所以,我很难理解 nn.Embedding .具体来说,我无法将我对嵌入作为概念的理解与此特定实现的作用联系起来。

我对嵌入的理解是,它是一些较大维度数据点的较小维度表示。所以它将数据映射到 N-d 中到 M-d潜在/嵌入空间使得 M < N .

据我了解,这种映射是通过学习过程实现的,就像在自动编码器中一样。编码器学习最佳嵌入,以便解码器可以重建原始输入。

所以我的问题是,这与 nn.Embedding 有什么关系?模块:

A simple lookup table that stores embeddings of a fixed dictionary and size. This module is often used to store word embeddings and retrieve them using indices. The input to the module is a list of indices, and the output is the corresponding word embeddings.

该层是否“学习”了更大输入空间的低维表示?还是完全不同?

我正在寻找的是将非常抽象的文档语言变成真实的东西:

假设我有一些输入 x .此输入可能是矢量化图像或一些序列日温度数据。无论如何,这个输入 x有 100 个元素(100 天的温度,或 10x10 的图像)。

您如何解释 nn.Embedding() 的用法?在这种情况下?

每个参数在现实世界中的含义是什么?

最佳答案

正如您所说,使用嵌入的目的是减少数据的维度。但是,它不会自己学习更大输入空间的低维表示。从随机初始化开始,您可以通过学习过程改进这种嵌入。我认为,这需要找到一个合适的任务来训练嵌入,以解决另一个问题。我认为这被称为“借口任务”,最终目标是获得准确的嵌入矩阵

您可以检查任何nn.Module 的参数与 .parameters() . 它将返回一个生成器

<< [x for x in nn.Embedding(10, 2).parameters()][0].shape
>> torch.Size([10, 2])

这里,有10*2参数(即 dimension_input*dimension_output 或 PyTorch 的命名 num_embeddings*embedding_dims )。然而,它是,仍然是一个查找表:给定一个索引,它将返回一个大小为 embedding_dims 的嵌入。 .但是你可以改变这些嵌入(这个矩阵的值)。

这里有一个小实验:

E = nn.Embedding(10, 2)
optim = optim.SGD(E.parameters(), lr=0.01)
X = torch.randint(0, 10, size=(100,))

loss_before = E(X).mean()
loss_before.backward()
optim.step()

loss_after = E(X).mean()

正如预期的那样,loss_beforeloss_after不同,显示nn.Embedding的参数是可学习的。


编辑:您的问题归结为“我如何编码我的数据?”。

对于您给出的那些例子:

Let's say I have some input x. This input might be a vectorized image or maybe some sequence daily temperature data. In any case, this input x has 100 elements (100 days of temperature, or a 10x10 image).

您不能使用 nn.Embedding 解决这些情况。嵌入层与缩减矩阵不同。后者可用于减少 维度为 d 的每个向量 进入维度n其中 n<<d .使用嵌入层的先决条件是具有可能元素的有限字典。例如,您可能想用大小为 n 的向量表示一个词那么您将使用 nb_possible_words x n 的嵌入.这样,对于字典中的任何给定单词,图层将生成相应的 n。 -大小向量。

正如我在下面的评论中所说,num_embeddings是您正在使用的唯一元素的数量,并且 embedding_dim是嵌入的大小,即输出向量的大小。

nn.Embedding通常用在网络的头部,将编码数据转换到较低维度的空间中。它不会通过神奇地缩小尺寸来解决您的问题。

如果您有一系列要分析的温度。您可以将每个温度编码为一个单热编码。但是这个向量表示可能非常大(取决于不同温度的数量)。使用嵌入层可以减少这些向量的大小。当目标是使用 RNN 分析数据时,这一点很重要,任何其他 MLP 都与此有关。由于您的输入大小越大,您拥有的参数就越多!

关于python - nn.Embedding 模块如何直观地与一般嵌入的概念相关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65169371/

相关文章:

python - 操作 tensorflow 代码来添加不同的层

dataset - 如何在 Pytorch 中创建类似 MNIST 的数据集?

python - 忘记声明变量

numpy - 将 PyTorch 变量复制到 Numpy 数组

java - 是否可以在StanfordNLP for Python 上训练模型并在基于Java 的CoreNLP 中使用它?

tensorflow - 如何加载图形检查点 (.ckpt) 并使用 SavedModelBuilder 将其保存为 protobuf,而不声明任何 tf.Variables?

c++ - 在 C++ 中加载 pytorch 模型,libtorch.dll 的问题

python-3.x - 错误 : symeig_cpu: the algorithm failed to converge: 6 off-diagonal elements of an intermediate tridiagonal form did not converge to zero

python - 从 python 而不是命令行运行 python behave

python - 闭包:什么是好的用例示例?为什么不是仿函数?它值得负面影响吗?