roc*_*ves 5 python deep-learning pytorch
所以,我很难理解nn.Embedding。具体来说,我无法将我所理解的嵌入作为一个概念与这个特定实现正在执行的操作之间的点联系起来。
我对嵌入的理解是,它是一些较大维度数据点的较小维度表示。因此它将数据映射N-d到M-d潜在/嵌入空间,使得M < N.
据我了解,这种映射是通过学习过程实现的,就像自动编码器一样。编码器学习最佳嵌入,以便解码器可以重建原始输入。
nn.Embedding所以我的问题是,这与模块有何关系:
一个简单的查找表,存储固定字典和大小的嵌入。该模块通常用于存储词嵌入并使用索引检索它们。模块的输入是索引列表,输出是相应的词嵌入。
该层是否“学习”较大输入空间的较低维度表示?或者完全是另外一回事?
我正在寻找的是将文档中非常抽象的语言转化为真实的东西:
假设我有一些意见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])
Run Code Online (Sandbox Code Playgroud)
这里,有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()
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,loss_before和loss_after是不同的,这表明nn.Embedding的参数是可以学习的。
编辑:您的问题归结为“我如何对数据进行编码?”。
对于这些例子,你准确地给出了:
假设我有一些输入 x。该输入可能是矢量化图像,也可能是某些序列的每日温度数据。无论如何,此输入 x 有 100 个元素(100 天的温度,或 10x10 图像)。
您不能使用 ann.Embedding来解决这些情况。嵌入层与约简矩阵不同。后者可用于将每个维度向量d减少为维度nwhere n<<d。使用嵌入层的先决条件是拥有可能元素的有限字典。例如,您可能想要用大小向量表示一个单词n,那么您将使用 的嵌入nb_possible_words x n。这样,对于字典中的任何给定单词,该层将生成相应的n-size 向量。
正如我在下面的评论中所说,num_embeddings是您正在使用的唯一元素的数量,embedding_dim是嵌入的大小,即输出向量的大小。
nn.Embedding通常在网络的头部使用,将编码数据投射到较低维度的空间中。它不会通过神奇地减小维度来解决你的问题。
如果您想要分析一系列温度。您可以将每个温度编码为 one-hot-encoding。但这个向量表示可能非常大(取决于不同温度的数量)。使用嵌入层可以减少这些向量的大小。当目标是使用 RNN 或任何其他 MLP 来分析数据时,这一点很重要。由于您的输入尺寸越大,您拥有的参数就越多!
| 归档时间: |
|
| 查看次数: |
1245 次 |
| 最近记录: |