【问题标题】:How to implement low-dimensional embedding layer in pytorch如何在pytorch中实现低维嵌入层
【发布时间】:2019-08-20 23:34:36
【问题描述】:

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

在等式中。 (3)、f 是一个4096X1 向量。作者尝试使用嵌入矩阵E 将向量压缩为theta20X1 向量)。

方程式很简单theta = E*f

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

如何完成剩下的?非常感谢。

演示代码如下:

import torch
from torch import nn

f = torch.randn(4096,1)

【问题讨论】:

    标签: deep-learning pytorch layer embedding


    【解决方案1】:

    假设您的输入向量是 one-hot 即使用“嵌入层”的地方,您可以直接使用来自 torch 的embedding layer,它可以执行上述操作以及更多操作。 nn.Embeddings 将 one-hot 向量的非零索引作为长张量的输入。例如:如果特征向量是

    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) 
    

    【讨论】:

    • 谢谢,您的代码适用于任何特征向量吗?似乎f 是一个4096X1 向量,它可以包含任何数量的向量元素。
    • 此代码适用于任何实值特征向量,因为它只是一个矩阵乘法。尽管nn.Embedding 期望一个热特性,并且如果我没记错的话,期望您将非零索引作为长张量传递。我不确定你是否对此感到困惑,如果是这样,我可以在我的回答中详细说明
    • 如果使用 Adam 梯度,self.param 会自动更新吗?谢谢
    • 嗨@jason,我已经更新了我的答案以反映您的大部分问题
    猜你喜欢
    • 2019-11-23
    • 2018-05-31
    • 2019-02-08
    • 2019-08-09
    • 2020-04-19
    • 2020-11-14
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    相关资源
    最近更新 更多