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

时间:2019-11-18 06:44:06

标签: deep-learning nlp pytorch

我目前正试图在设法获得培训和测试的情况下实施CBOW模型,但对于最终从模型中提取权重以用作词嵌入的“正确”方法面临一些困惑。 / p>

型号

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

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

1 个答案:

答案 0 :(得分:1)

是的,model_train.embed.weight将为您提供一个存储嵌入权重的火炬张量。但是请注意,该张量还包含最新的渐变。如果您不需要/不需要它们,model_train.embed.weight.data将只为您提供权重。

更通用的选择是调用model_train.embed.parameters()。这将为您提供该层所有权重张量的生成器。通常,一层中有多个权重张量,weight仅会给您一个。 Embedding恰好只有一个,因此这里使用哪个选项都没有关系。