在PyTorch中进行多个嵌入的更快方法?

时间:2019-06-24 02:15:37

标签: deep-learning pytorch torch embedding autoencoder

我正在研究torch-based library,用于使用表格数据集构建自动编码器。

一大特色是学习分类特性的嵌入。

但是,实际上,同时训练许多嵌入层会降低速度。我正在使用for循环来执行此操作,并且在每次迭代中运行for循环都是(我认为)是导致速度下降的原因。

在构建模型时,我将嵌入层与用户数据集中的每个分类特征相关联:

        for ft in self.categorical_fts:
            feature = self.categorical_fts[ft]
            n_cats = len(feature['cats']) + 1
            embed_dim = compute_embedding_size(n_cats)
            embed_layer = torch.nn.Embedding(n_cats, embed_dim)
            feature['embedding'] = embed_layer

然后,调用.forward():

        embeddings = []
        for i, ft in enumerate(self.categorical_fts):
            feature = self.categorical_fts[ft]
            emb = feature['embedding'](codes[i])
            embeddings.append(emb)

        #num and bin are numeric and binary features
        x = torch.cat(num + bin + embeddings, dim=1)

然后x进入密集层。

这可以完成工作,但是在每次前向通过期间运行此for循环确实会减慢训练速度,尤其是在数据集包含数十个或数百个分类列的情况下。

有人知道这样的矢量化方法吗?谢谢!

更新: 为了更加清晰,我草绘了如何将分类特征馈入网络。您可以看到每个分类列都有其自己的嵌入矩阵,而数字特征则在传递到前馈网络之前直接连接到其输出。

diagram

我们可以这样做而无需遍历每个嵌入矩阵吗?

2 个答案:

答案 0 :(得分:1)

除非我对您的问题不太了解,

如果是分类功能,这是您从嵌入层中学到的东西,那么为什么不对您感兴趣的所有类别都使用更大的嵌入层呢?

我没有使用您提到的库,但是例如,

div.item[data-selected] {
  border: 2px solid #333;
}

我可以增加最小批量大小,这样我就可以了解更多类别。 嵌入不过是具有一个热编码向量的矩阵乘法。

答案 1 :(得分:0)

此外,请检出新的torchtext部分,请参见https://pytorch.org/text/index.html。例如,它提供了预训练的单词嵌入。由于您专门询问过GloVe:这也是torchtext的一部分:https://pytorch.org/text/vocab.html#glove

要使用torchtext加载GloVe嵌入,只需使用:

emb = torchtext.vocab.GloVe(filepath)

生成的emb对象可以直接用作pytorch模块的一部分。