提取CBOW模型嵌入权重的正确方法



我目前正试图在上实现CBOW模型,以便进行训练和测试,但对于最终从模型中提取权重用作单词嵌入的"正确"方法,我面临着一些困惑。

型号

class CBOW(nn.Module):
def __init__(self, config, vocab):
self.config = config # Basic config file to hold arguments.
self.vocab = vocab
self.vocab_size = len(self.vocab.token2idx)
self.window_size = self.config.window_size
self.embed = nn.Embedding(num_embeddings=self.vocab_size, embedding_dim=self.config.embed_dim)
self.linear = nn.Linear(in_features=self.config.embed_dim, out_features=self.vocab_size)
def forward(self, x):
x = self.embed(x)
x = torch.mean(x, dim=0) # Average out the embedding values.
x = self.linear(x)
return x

主要工艺

在我用训练和测试数据通过解算器运行我的模型之后,我基本上告诉traintest函数也返回所使用的模型。然后,我将嵌入权重分配给一个单独的变量,并将其用作单词嵌入。

使用交叉熵损失进行训练和测试,每个训练和测试样本的形式为([context words], target word)

def run(solver, config, vocabulary):
for epoch in range(config.num_epochs):
loss_train, model_train = solver.train()
loss_test, model_test = solver.test()
embeddings = model_train.embed.weight

我不确定这是否是提取和使用嵌入的正确方式。通常有其他方法可以做到这一点吗?提前谢谢。

是的,model_train.embed.weight将为您提供一个存储嵌入权重的torch张量。然而,请注意,这个张量也包含最新的梯度。如果你不想要/不需要它们,model_train.embed.weight.data只会给你权重。

一个更通用的选项是调用model_train.embed.parameters()。这将给你一个所有层的权重张量的生成器。通常,一个层中有多个权重张量,weight只会给出其中一个。Embedding恰好只有一个,所以在这里使用哪个选项并不重要。

相关内容

最新更新