实现负频率_吴恩达深度学习笔记(125) | NLP | 负采样(Negative Sampling)

负采样(Negative Sampling)

在上个笔记中,你见到了Skip-Gram模型如何帮助你构造一个监督学习任务,把上下文映射到了目标词上,它如何让你学到一个实用的词嵌入。但是它的缺点就在于softmax计算起来很慢

在本笔记中,你会看到一个改善过的学习问题叫做负采样,它能做到与你刚才看到的Skip-Gram模型相似的事情,但是用了一个更加有效的学习算法,让我们来看看这是怎么做到的。

大多数的想法源于Tomas Mikolov,Ilya Sutskever,Kai Chen,Greg Corrado 和 Jeff Dean。

(Mikolov T, Sutskever I, Chen K, et al. Distributed Representations of Words and Phrases and their Compositionality[J]. 2013, 26:3111-3119.)

我们在这个算法中要做的是构造一个新的监督学习问题,那么问题就是给定一对单词,比如orange和juice,我们要去预测这是否是一对上下文词-目标词(context-target)

在这个例子中orange和juice就是个正样本,那么orange和king就是个负样本,我们把它标为0。我们要做的就是采样得到一个上下文词和一个目标词,在这个例子中就是orange 和juice,我们用1作为标记,我把中间这列(下图编号1所示)叫做词(word)

这样生成一个正样本,正样本跟上个笔记生成的方式一模一样,先抽取一个上下文词,在一定词距内比如说正负10个词距内选一个目标词,这就是生成这个表的第一行,即orange– juice -1的过程。

然后为了生成一个负样本,你将用相同的上下文词,再在字典中随机选一个词,在这里我随机选了单词king,标记为0。然后我们再拿orange,再随机从词汇表中选一个词,因为我们设想,如果随机选一个词,它很可能跟orange没关联,于是orange–book–0。我们再选点别的,orange可能正好选到the,然后是0。还是orange,再可能正好选到of这个词,再把这个标记为0,注意of被标记为0,即使of的确出现在orange词的前面。

7e675aeb7dab9ac476d597b2822dd899.png

总结一下,生成这些数据的方式是我们选择一个上下文词(上图编号2所示),再选一个目标词(上图编号3所示),这(上图编号4所示)就是表的第一行,它给了一个正样本,上下文,目标词,并给定标签为1。然后我们要做的是给定几次,比如K次(上图编号5所示),我们将用相同的上下文词,再从字典中选取随机的词,king、book、the、of等,从词典中任意选取的词,并标记0,这些就会成为负样本(上图编号6所示)。出现以下情况也没关系,就是如果我们从字典中随机选到的词,正好出现在了词距内,比如说在上下文词orange正负10个词之内。

接下来我们将构造一个监督学习问题,其中学习算法输入x,输入这对词(上图编号7所示),要去预测目标的标签(上图编号8所示),即预测输出y。

因此问题就是给定一对词,像orange和juice,你觉得它们会一起出现么?你觉得这两个词是通过对靠近的两个词采样获得的吗?或者你觉得我是分别在文本和字典中随机选取得到的?这个算法就是要分辨这两种不同的采样方式,这就是如何生成训练集的方法。

那么如何选取K?Mikolov等人推荐小数据集的话,K从5到20比较好。如果你的数据集很大,K就选的小一点。对于更大的数据集K就等于2到5,数据集越小K就越大。那么在这个例子中,我们就用K=4。

785fe59afb9e7cab2b2d3d2636813b03.png

下面我们讲讲学习从x映射到y的监督学习模型,这(上图编号1所示):

9ef9926dfa1b1756ebaa609205caa8d6.png

的softmax模型。这是我们从上张幻灯片中得到的训练集,这个(上图编号2所示)将是新的输入x,这个(上图编号3所示)将是你要预测的值y。为了定义模型,我们将使用记号c表示上下文词,记号t表示可能的目标词,我再用y表示0和1,表示是否是一对上下文-目标词。我们要做的就是定义一个逻辑回归模型,给定输入的c,t对的条件下,y=1的概率,即:

P(y=1|c,t)=σ(θ_t^T e_c)

79f48a22118c3ee32f01caa2c52fc9c8.png

这个模型基于逻辑回归模型,但不同的是我们将一个sigmoid函数作用于θ_t^T e_c,参数和之前一样,你对每一个可能的目标词有一个参数向量θ_t和另一个参数向量e_c,即每一个可能上下文词的的嵌入向量,我们将用这个公式估计y=1的概率。如果你有K个样本,你可以把这个看作1/K的正负样本比例,即每一个正样本你都有K个对应的负样本来训练一个类似逻辑回归的模型。

我们把这个画成一个神经网络,如果输入词是orange,即词6257,你要做的就是输入one-hot向量,再传递给E,通过两者相乘获得嵌入向量e_6257,你就得到了10,000个可能的逻辑回归分类问题,其中一个(上图编号4所示)将会是用来判断目标词是否是juice的分类器,还有其他的词,比如说可能下面的某个分类器(上图编号5所示)是用来预测king是否是目标词,诸如此类,预测词汇表中这些可能的单词。

把这些看作10,000个二分类逻辑回归分类器,但并不是每次迭代都训练全部10,000个,我们只训练其中的5个,我们要训练对应真正目标词那一个分类器,再训练4个随机选取的负样本,这就是K=4的情况。

所以不使用一个巨大的10,000维度的softmax,因为计算成本很高,而是把它转变为10,000个二分类问题,每个都很容易计算,每次迭代我们要做的只是训练它们其中的5个,一般而言就是K+1个,其中K个负样本和1个正样本。

这也是为什么这个算法计算成本更低,因为只需更新K+1个逻辑单元,K+1个二分类问题,相对而言每次迭代的成本比更新10,000维的softmax分类器成本低。

因为你做的是,你有一个正样本词orange和juice,然后你会特意生成一系列负样本,这些(上图编号6所示)是负样本,所以叫负采样,即用这4个负样本训练,4个额外的二分类器,在每次迭代中你选择4个不同的随机的负样本词去训练你的算法。

fcac17dddf113544cc453a8c2309ee74.png

这个算法有一个重要的细节就是如何选取负样本,即在选取了上下文词orange之后,你如何对这些词进行采样生成负样本?一个办法是对中间的这些词进行采样,即候选的目标词,你可以根据其在语料中的经验频率进行采样,就是通过词出现的频率对其进行采样。但问题是这会导致你在like、the、of、and诸如此类的词上有很高的频率。

另一个极端就是用1除以词汇表总词数,即1/|v| 均匀且随机地抽取负样本,这对于英文单词的分布是非常没有代表性的。所以论文的作者Mikolov等人根据经验,他们发现这个经验值的效果最好,它位于这两个极端的采样方法之间,既不用经验频率,也就是实际观察到的英文文本的分布,也不用均匀分布,他们采用以下方式:

e85e9bbcc5ac08b532d7f15b72845880.png

进行采样,所以如果f(w_i)是观测到的在语料库中的某个英文词的词频,通过3/4次方的计算,使其处于完全独立的分布和训练集的观测分布两个极端之间。我并不确定这是否有理论证明,但是很多研究者现在使用这个方法,似乎也效果不错。

总结一下,你已经知道了在softmax分类器中如何学到词向量,但是计算成本很高。

你见到了如何通过将其转化为一系列二分类问题使你可以非常有效的学习词向量。

如果你使用这个算法,你将可以学到相当好的词向量。当然和深度学习的其他领域一样,有很多开源的实现,当然也有预训练过的词向量,就是其他人训练过的然后授权许可发布在网上的,所以如果你想要在NLP问题上取得进展,去下载其他人的词向量是很好的方法,在此基础上改进。

Skip-Gram模型就介绍到这里,在下个笔记中,我会跟你分享另一个版本的词嵌入学习算法GloVe,而且这可能比你之前看到的都要简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值