如何在pytorch中实现低维嵌入层
How to implement low-dimensional embedding layer in pytorch
我最近阅读了一篇关于嵌入的 paper。
在等式中。 (3)、f
是一个4096X1
向量。作者尝试使用嵌入矩阵 E
将向量压缩为 theta
(一个 20X1
向量)。
等式很简单theta = E*f
我想知道是否可以使用pytorch
来实现这个目标,然后在训练中,可以自动学习E
。
剩下的如何完成?非常感谢。
演示代码如下:
import torch
from torch import nn
f = torch.randn(4096,1)
假设您的输入向量是单热的,也就是使用 "embedding layers" 的地方,您可以直接使用 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)
我最近阅读了一篇关于嵌入的 paper。
在等式中。 (3)、f
是一个4096X1
向量。作者尝试使用嵌入矩阵 E
将向量压缩为 theta
(一个 20X1
向量)。
等式很简单theta = E*f
我想知道是否可以使用pytorch
来实现这个目标,然后在训练中,可以自动学习E
。
剩下的如何完成?非常感谢。
演示代码如下:
import torch
from torch import nn
f = torch.randn(4096,1)
假设您的输入向量是单热的,也就是使用 "embedding layers" 的地方,您可以直接使用 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)