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

jas*_*son 4 embedding layer deep-learning pytorch

我最近读了一篇关于嵌入的论文

在方程式中。(3),f是一个4096X1向量。作者尝试使用嵌入矩阵将向量压缩为theta(一个20X1向量)E

方程很简单 theta = E*f

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

剩下的怎么完成?非常感谢。

演示代码如下:

import torch
from torch import nn

f = torch.randn(4096,1)
Run Code Online (Sandbox Code Playgroud)

Uma*_*pta 5

假设您的输入向量是使用“嵌入层”的单热层,您可以直接使用来自 Torch 的嵌入层以及更多其他功能。nn.Embeddings将 one-hot 向量的非零索引作为长张量的输入。例如:如果特征向量是

f = [[0,0,1], [1,0,0]]
Run Code Online (Sandbox Code Playgroud)

然后输入到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)
Run Code Online (Sandbox Code Playgroud)

如果您仔细观察,这与没有偏差且初始化略有不同的线性层相同。因此,您可以通过使用如下所示的线性层来实现相同的效果。

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) 
Run Code Online (Sandbox Code Playgroud)