神经网络中的预训练 (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?
回答
通常,可以通过模型和目标的加权成本来处理空条目。
然而,在处理单词和顺序数据时,事情可能有点棘手,有几件事可以考虑。让我们做一些假设并使用它。
假设
- 我们从预训练的 word2vec 模型开始。
- 我们有不同长度的序列,最多
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 论文。
如果我必须在神经网络(例如 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?
回答
通常,可以通过模型和目标的加权成本来处理空条目。 然而,在处理单词和顺序数据时,事情可能有点棘手,有几件事可以考虑。让我们做一些假设并使用它。
假设
- 我们从预训练的 word2vec 模型开始。
- 我们有不同长度的序列,最多
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
vsN
的话,N
大)。在复杂性中,它是可以稍后合并到初始标记化函数中的东西。预测和模型的复杂性是一个更大的问题,也是系统更重要的要求。 - 有很多方法可以解决不同的长度(LSTM、RNN,现在我们尝试使用 CNN 和成本技巧)。阅读有关该问题的最新文献,我相信有很多工作要做。例如,参见 A Convolutional Neural Network for Modelling Sentences 论文。