lstm 序列的词嵌入

word embedding of a lstm sequence

假设,我有一个 Seq2Seq 模型。我想在这个模型中有嵌入层。

根据我的研究,我可以通过三种方式做到这一点:

  1. 在我的数据集上单独训练一个词嵌入或下载一个预训练的词嵌入,然后使用这些嵌入的权重作为我数据集中词的权重。所以这里我根本不需要嵌入层,我只是将已经训练好的单词的权重加载到我数据集中的单词中。

  2. 我创建了一个嵌入层并将可训练设置为真,所以不仅我有一个嵌入,而且该嵌入将根据我的任务进行训练

  3. 我创建了一个 Embedding 层,加载已经训练好的权重,并将 trainable 设置为 False。在这种情况下,权重将不会更新。

(如有错误请指正)

我用过first approach。我想知道这段代码输出的解释是什么:

model_wv = Word2Vec.load("word2vec_50d_7w")
embeddings = np.zeros((len(model_wv.wv.vocab), emb_dim))
for i in range(len(model_wv.wv.vocab)):
    # print(i)
    embedding_vector = model_wv.wv[model_wv.wv.index2word[i]]
    if embedding_vector is not None:
        embeddings[i] = embedding_vector

print(embeddings[[1,2,3],[3,4,1]])

这是输出:

[-0.01566689 -1.36469996  0.59684211]

将此 [1,2,3],[3,4,1] 视为带有 length=3 的两个序列。

我在想我们在 lstm 中使用词嵌入将序列中的每个词转换为嵌入。我希望在每个向量中看到 two vectorsthree items

embedding是gensim中的word2vec,

如果有人阐明我迷路的地方,我将不胜感激?

谢谢~

您对设置嵌入层的三种变体的解释与我的理解完全正确。

有两种主要的迁移学习技术。

  1. 使用 pre-learned 模型作为 feature-vector。在您的情况下,word2vec 模型将用作 pre-process/convert 标记到 ids 然后嵌入向量的查找服务。当您训练自己的模型时,这些嵌入向量将成为实际特征。 (这是你的#1)

  2. 使用fine-tuning方法。在这里您可以选择继续训练 pre-learned 模型(设置 trainable=True)或修复预学习模型(设置 trainable=False)。两种方法都有好处。 (这是你的#2 和#3)

(#1 and #3) 根据我的经验,在质量方面产生了相似的结果。 如果您拥有相当数量的训练数据,根据我的经验,fine-tuning with trainable=True (#2) 将是最好的方法。

你这里的问题是一个 numpy 问题。你可能应该说,

print(embeddings[[1,2,3]], embeddings[[3,4,1]])

否则 indexing 将无法正常工作。

embeddings[[1,2,3],[3,4,1]]

这实际上是查找索引为 1、2、3 的行,并分别获取索引为 3、4、1 的列。换句话说,它拾取

column 3 for row 1
column 4 for row 2
column 1 for row 3