今天在训练word vec的时候,用的是nce_loss. 官方sample和我写的可视化示例里面,都用的这个 nce_loss。
今天找了一下解释,找到这个页面:
https://www.zhihu.com/question/50043438/answer/254300443
说实话,没怎么看懂,先摘抄下来:
Tensorflow实现了两种常用与word2vec的loss,sampled softmax和NCE,这两种loss本身可以用于任意分类问题。
之前一直不太懂这两种方法,感觉高深莫测,正好最近搞懂了,借tensorflow的代码和大家一起分享一下我的理解,也记录一下思路。
这两个方法跟绝大多数deep learning的方法一样,相当粗暴。
目的
两个方法的目标是在分类的数量太大时,简化softmax计算,采取估算的方法得到softmax的值。
Intuitive explanation
NCE loss的直观想法:把多分类问题转化成二分类。
之前计算softmax的时候class数量太大,NCE索性就把分类缩减为二分类问题。
之前的问题是计算某个类的归一化概率是多少,二分类的问题是input和label正确匹配的概率是多少。
二分类问题群众喜闻乐见,直接上logistic regression估算一下概率。
(这算不算是通俗易懂回答了答主的问题)
Sampled softmax则是只抽取一部分样本计算softmax。这个想法也很好理解,训练的时候我不需要特别精准的softmax归一化概率,我只需要一个粗略值做back propoagation就好了。当然这么粗糙的计算会不会出什么问题,从我个人的理解上看,不会。
大部分优化器很可能比这粗糙的多,deep learning就是门乱拳打死老师傅的学科。