一些概念的回顾,
logits:softmax的目的是把logits映射到0,1之间,因此logits可以理解为原生概率; logits vector(即未经归一化的概率分布)。
nce(noise-contrastive estimation) 噪声对比估计。
Tensorflow实现了两种用于word2vec的loss,sampled softmax和NCE,这两种loss本身可以用于任意分类问题。那么,nce loss 与 sampled softmax loss 到底有什么区别?怎么选择?
- 在x2vec中为什么倾向于nce呢?比如item2vec,阿里的EGES、YouTube Recommendation中的Matching阶段等都是采用nce;
- 目前看到采用sampled softmax的有:(1)DSSM(2)腾讯lookalike 的user embedding阶段 [Real-time Attention Based Look-alike Model for Recommender System] 。
- 负采样的应用很多,nce_loss和sampled softmax loss选择哪个?根据场景?还是有理论支持?
首先总结一下:
- NCE loss的直观想法:把多分类问题转化成二分类。之前计算softmax的时候class数量太大,NCE索性就把分类缩减为二分类问题。之前的问题是计算某个类的归一化概率是多少,二分类的问题是input和label正确匹配的概率是多少。
- Sampled softmax则是只抽取一部分样本计算softmax。训练的时候我不需要特别精准的softmax归一化概率,我只需要一个粗略值做back propoagation就好了。
NCE和negative sampling是两回事。你在题目中提及到的那几个使用都是用的negative sampling的目标函数而不是NCE。
NCE本质上是一种估计目标分布的方法,目的通过规避softmax中分母求和的部分来减少计算量。NCE可以通过数学证明等价于(严格来说是这个estimator依概率收敛到真正的分布)极大似然估计。
而negative sampling则是word2vec中提出来的对NCE的一个简化,是无法真正和softmax等价的。
nce_loss 与 sampled_softmax_loss如何选择
nce_loss用的是logisticLoss,sampled_softmax_loss 用的是softmax,可以从下面loss的形式看出,对于每一个样品i,logisticloss可以有多个标签,就是同时训练多个二分类器。而softmax只有一个正标签。
补充:softmax loss简单来说,就是将神经网络的logit用softmax包裹起来,再丢到交叉熵里面去。看到知乎上很多人说什么softmax loss是不严谨的说法。实际上,我看了很多顶会论文,大佬们都是用 softmax loss作为softmax function+cross entropy loss 的简称。
Tensorflow的采样方法:candidate sampling
这个博主看法,对于多标签多类别的分类任务使用Logistic比较好,对于多标签单类别的分类任务使用softmax比较好,采样中,采用tf.nn.sampled_softmax_loss训练cbow模型比较好,而 tf.nn.nce_loss训练skip-gram比较好。
Candidate Sampling 及TensorFlow中的实现
这个博主认为NCE loss的直观想法:把多分类问题转化成二分类。之前计算softmax的时候class数量太大,NCE索性就把分类缩减为二分类问题。之前的问题是计算某个类的归一化概率是多少,二分类的问题是input和label正确匹配的概率是多少。二分类问题群众喜闻乐见,直接上logistic regression估算一下概率。Sampled softmax则是只抽取一部分样本计算softmax。这个想法也很好理解,训练的时候我不需要特别精准的softmax归一化概率,我只需要一个粗略值做back propoagation就好了
ruder的博客里也提到了什么时候用nce_loss Approximating the Softmax for Learning Word Embeddings 对于词向量用nceloss,语言模型还是用softmax好。