神经网络中的预训练 (Word2Vec) 嵌入

Pretrained (Word2Vec) embedding in Neural Networks

如果我必须在神经网络(例如 CNN)中使用预训练词向量作为嵌入层,我该如何处理索引 0?

详情:

我们通常从创建零 numpy 二维数组开始。稍后我们从词汇表中填写单词索引。 问题是,0 已经是我们词汇表中另一个词的索引(比如,'i' 是 0 处的索引)。因此,我们基本上是用 'i' 而不是空词来初始化整个矩阵。那么,我们如何处理填充所有等长的句子?

一个简单的弹出窗口是我们可以使用另一个数字=numberOfWordsInVocab+1 来填充。但这不会需要更大的尺寸吗? [帮帮我!]

One easy pop-up in mind is we can use the another digit=numberOfWordsInVocab+1 to pad. But wouldn't that take more size?

不!那是一样的大小。

a=np.full((5000,5000), 7)
a.nbytes
200000000

b=np.zeros((5000,5000))
b.nbytes
200000000

编辑:打字错误

If I have to use pretrained word vectors as embedding layer in Neural Networks (eg. say CNN), How do I deal with index 0?

回答

通常,可以通过模型和目标的加权成本来处理空条目。 然而,在处理单词和顺序数据时,事情可能有点棘手,有几件事可以考虑。让我们做一些假设并使用它。

假设

  1. 我们从预训练的 word2vec 模型开始。
  2. 我们有不同长度的序列,最多 max_lenght 个单词。

详情

  • Word2Vec 是一种学习从离散变量(词标记 = 词唯一 ID)到连续向量的映射(嵌入)的模型 space。
  • 向量 space 中的表示使得成本函数(CBOW,Skip-gram,本质上它是以双向方式从上下文预测单词)在语料库上最小化。
  • 阅读基础教程(例如Google's word2vec tutorial on Tensorflow tutorials) reveals some details on the algorithm, including negative sampling
  • 实现是查找table。它比另一种 one-hot 编码技术更快,因为 one-hot 编码矩阵的维度很大(比如 10,000 列代表 10,000 个单词,n 行代表 n 个连续单词)。所以查找(哈希)table 明显更快,它从嵌入矩阵中选择行(对于行向量)。

任务

  • 添加缺失的条目(无词)并在模型中使用它。

建议

  • 如果缺失数据的成本有一些用途,例如使用该条目的预测并且该条目有标签,您可以按照建议添加新值(可以是 0 索引,但所有索引必须移动 i=i+1 并且嵌入矩阵应该在位置 0 处有新行)。
  • 按照第一个建议,您需要训练添加的行。您可以对 NaN class 与全部使用负采样。 我不建议用它来处理缺失值。处理 "Unknown word" class.
  • 是个好技巧
  • 对于每个短于 max_length 的样本,您可以通过常数 0 对这些条目的成本进行加权。也就是说,如果我们有一个单词标记序列[0,5,6,2,178,24,0,NaN,NaN],对应的权重向量是[1,1,1,1,1,1,1,0,0]
  • 您应该担心重新索引单词及其成本。在记忆中,几乎没有区别(1 vs N的话,N大)。在复杂性中,它是可以稍后合并到初始标记化函数中的东西。预测和模型的复杂性是一个更大的问题,也是系统更重要的要求。
  • 有很多方法可以解决不同的长度(LSTM、RNN,现在我们尝试使用 CNN 和成本技巧)。阅读有关该问题的最新文献,我相信有很多工作要做。例如,参见 A Convolutional Neural Network for Modelling Sentences 论文。