lstm 序列的词嵌入
word embedding of a lstm sequence
假设,我有一个 Seq2Seq 模型。我想在这个模型中有嵌入层。
根据我的研究,我可以通过三种方式做到这一点:
在我的数据集上单独训练一个词嵌入或下载一个预训练的词嵌入,然后使用这些嵌入的权重作为我数据集中词的权重。所以这里我根本不需要嵌入层,我只是将已经训练好的单词的权重加载到我数据集中的单词中。
我创建了一个嵌入层并将可训练设置为真,所以不仅我有一个嵌入,而且该嵌入将根据我的任务进行训练
我创建了一个 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 vectors
和 three items
。
embedding是gensim中的word2vec,
如果有人阐明我迷路的地方,我将不胜感激?
谢谢~
您对设置嵌入层的三种变体的解释与我的理解完全正确。
有两种主要的迁移学习技术。
使用 pre-learned 模型作为 feature-vector。在您的情况下,word2vec 模型将用作 pre-process/convert 标记到 ids 然后嵌入向量的查找服务。当您训练自己的模型时,这些嵌入向量将成为实际特征。 (这是你的#1)
使用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
假设,我有一个 Seq2Seq 模型。我想在这个模型中有嵌入层。
根据我的研究,我可以通过三种方式做到这一点:
在我的数据集上单独训练一个词嵌入或下载一个预训练的词嵌入,然后使用这些嵌入的权重作为我数据集中词的权重。所以这里我根本不需要嵌入层,我只是将已经训练好的单词的权重加载到我数据集中的单词中。
我创建了一个嵌入层并将可训练设置为真,所以不仅我有一个嵌入,而且该嵌入将根据我的任务进行训练
我创建了一个 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 vectors
和 three items
。
embedding是gensim中的word2vec,
如果有人阐明我迷路的地方,我将不胜感激?
谢谢~
您对设置嵌入层的三种变体的解释与我的理解完全正确。
有两种主要的迁移学习技术。
使用 pre-learned 模型作为 feature-vector。在您的情况下,word2vec 模型将用作 pre-process/convert 标记到 ids 然后嵌入向量的查找服务。当您训练自己的模型时,这些嵌入向量将成为实际特征。 (这是你的#1)
使用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