在词嵌入中,start_tokens _PAD、_UNKNOWN、_GO、_EOS 的良好向量表示应该是什么?
问问题
5586 次
2 回答
7
如果您也在更新词嵌入向量,Spettekaka 的答案也有效。
不过,有时您会想要使用无法更新的预训练词向量。在这种情况下,您可以为要添加的每个标记为您的词向量添加一个新维度,并将每个标记的向量在新维度中设置为 1,对于每个其他维度设置为 0。这样,您就不会遇到例如“EOS”更接近“start”的向量嵌入而不是“end”的向量嵌入的情况。
澄清示例:
# 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 个新的标记维度,并且您的所有词都已更新。
于 2018-07-24T17:59:43.597 回答
2
据我了解,您可以用任何向量表示这些标记。
原因如下:
将一系列单词输入到模型中,首先将每个单词转换为一个 ID,然后在嵌入矩阵中查找与该 ID 对应的向量。使用该向量,您可以训练模型。但是嵌入矩阵也只包含可训练的权重,这些权重将在训练期间进行调整。来自预训练向量的向量表示只是开始产生良好结果的好点。
因此,一开始你的特殊标记用什么表示并不重要,因为它们的表示会在训练期间发生变化。
于 2017-11-16T13:15:27.450 回答