在发送到RNN之前,令牌<pad>,<unknown>,<go>,<eos>的单词vector应该是什么?

时间:2017-01-26 19:40:25

标签: nlp deep-learning word2vec word-embedding

在单词嵌入中,start_tokens _PAD,_UNKNOWN,_GO,_EOS应该是一个好的矢量表示?

2 个答案:

答案 0 :(得分:1)

据我了解,您可以通过任何向量表示这些令牌。

这就是原因:

在模型中输入一系列单词,首先将每个单词转换为ID,然后在嵌入矩阵中查找哪个向量对应于该ID。使用该矢量,您可以训练模型。但是嵌入矩阵只包含可训练的权重,这些权重将在训练期间进行调整。来自预训练矢量的矢量表示只是开始产生良好结果的好点。

因此,在开始中表示你的特殊标记的重要性并不重要,因为它们的表示在训练期间会发生变化。

答案 1 :(得分:1)

如果同时更新单词嵌入向量,Spettekaka的答案也会起作用。

有时候,您可能希望使用无法更新的预训练词向量。在这种情况下,您可以为要添加的每个标记的单词向量添加新维度,并将每个标记的向量在新维度中设置为1,在其他维度中设置为0。这样一来,您就不会遇到例如“ EOS”比“ end”的向量嵌入更接近“ start”的向量嵌入。

示例说明:

# assume_vector embeddings is a dictionary and word embeddings are 3-d before adding tokens
# e.g. vector_embedding['NLP'] = np.array([0.2, 0.3, 0.4]) 

vector_embedding['<EOS>'] = np.array([0,0,0,1])
vector_embedding['<PAD>'] = np.array([0,0,0,0,1])
new_vector_length = vector_embedding['<pad>'].shape[0] # length of longest vector
for key, word_vector in vector_embedding.items():
    zero_append_length = new_vector_length - word_vector.shape[0]
    vector_embedding[key] = np.append(word_vector, np.zeros(zero_append_length))

现在您的词嵌入词典包含2个用于标记的新维度,并且所有词都已更新。