文本训练中的负采样
1. 什么是负采样
从名字上看,负采样就是从一堆负样本中采样出一部分样本用于模型的训练。
首先引入概念,什么是负样本?
根据百度百科定义:
自然语言处理领域中:
判断两个单词是不是一对上下文词(context)与目标词(target),如果是一对,则是正样本;否则是负样本。
即:
上下文词与目标词是正样本;
上下文词与字典中随机选择一个单词(即负样本),这个过程也就是负采样;
【注】训练需要正样本和负样本同时存在。
所以,负采样的意思就是从不是一对上下文词的词语中随机选择多个负样本进行权重更新。在skip-gram中,一个词的正样本在输出向量中一般只有一个位置为1,而其余的9999个位置都是0。负采样的目的就是在 negative word 中,找出一部分节点进行权重的更新,而不需要全部都更新。
2. 负采样的作用
- 加速了模型计算,每个训练样本只会更新一小部分模型权重,从而降低计算负担;
- 保证了模型训练的效果,其一模型每次只需要更新采样的词的权重,不用更新所有的权重,那样会很慢,其二中心词其实只跟它周围的词有关系,位置离着很远的词没有关系,也没必要同时训练更新;
3. 负采样的本质
每次让一个训练样本只更新部分权重,其他权重全部固定;减少计算量;(一定程度上还可以增加随机性)
举个例子:
假设我们在训练数据中只能取出10000个不重复的单词作为词汇表,那么我们对每个单词编码都是的向量。
eg: 廖大佬今天又看了37篇TPCM的论文。
当我们用训练样本(input word:"看", output word:"论文")
来训练我们的神经网络时,“看”
和“论文”
都是经过one-hot编码的。如果我们的vocabulary
大小为10000时,在输出层,我们希望“论文”
单词那个位置输出1,其余都是0。这些其余我们期望输出0的位置所对应的单词我们成为负样本
。
当使用负采样时,我们将随机选择一小部分的负样本(比如选5个负样本)来更新对应的权重。我们也会对我们的正样本进行权重更新(上面的例子指的是"论文"
)。
4. word2vec中的负采样
任何采样算法都应该保证频次越高的样本越容易被采样出来。基本的思路是对于长度为1的线段,根据词语的词频将其公平地分配给每个词语:
其中就是的词频。
接下来直接采用“查表”的方式来进行。
就是统计频率,然后计算词w的位置。然后做一个对应长度的映射,最终“查表”即可。
评论区