如何在pytorch中实现低维嵌入层

时间:2019-03-30 01:42:27

标签: deep-learning pytorch layer embedding

我最近阅读了关于嵌入的paper

在等式中(3),f4096X1向量。作者尝试通过使用嵌入矩阵theta将向量压缩为20X1E向量)。

等式很简单theta = E*f

我想知道它是否可以使用pytorch来实现此目标,然后在训练中可以自动学习E

如何完成其​​余部分?非常感谢。

演示代码如下:

import torch
from torch import nn

f = torch.randn(4096,1)

1 个答案:

答案 0 :(得分:1)

假设您的输入矢量是“热点”,即使用“嵌入层”的地方,那么您可以直接使用炬管中的embedding layer来完成上述工作以及其他一些事情。 nn.Embeddings将一热向量的非零索引作为长张量输入。例如:如果特征向量是

f = [[0,0,1], [1,0,0]]

然后输入到nn.Embeddings

输入= [2,0]

但是,OP提出的问题是通过矩阵乘法获取嵌入,下面我将解决这个问题。您可以定义一个模块来执行以下操作。由于param是nn.Parameter的实例,因此它将被注册为参数,并在您调用Adam或任何其他优化程序时进行优化。

class Embedding(nn.Module):
    def __init__(self, input_dim, embedding_dim):
        super().__init__()
        self.param = torch.nn.Parameter(torch.randn(input_dim, embedding_dim))

    def forward(self, x):
        return torch.mm(x, self.param)

如果您仔细注意,这与没有偏压且初始化稍有不同的线性层相同。因此,您可以通过使用以下线性层来实现相同的目的。

self.embedding = nn.Linear(4096, 20, bias=False)
# change initial weights to normal[0,1] or whatever is required
embedding.weight.data = torch.randn_like(embedding.weight)