深度学习中与分类相关的问题都会涉及到softmax的计算。当目标类别较少时,直接用标准的softmax公式进行计算没问题,当目标类别特别多时,则需采用估算近似的方法简化softmax中归一化的计算。
有很多讲解近似softmax 的文章,但都有一些细节上或者公式上的问题。今天这篇文章集百家所长,讲讲近似softmax的前世今生。
01 前提知识
1. logistic regression
逻辑回归的模型(函数/假设)为:
其中g为sigmoid函数,x为模型输入,θ为模型参数,hθ(x) 为模型预测正样本(类别为1)的概率。其对应的损失函数如下:
上述损失函数称为交叉熵损失,也叫log损失。通过优化算法(SGD/Adam)极小化该损失函数,可确定模型参数。
2. softmax loss
softmax回归的模型(函数/假设)为:
hθ表示第ii个样本输入x(i)x(i)属于各个类别的概率,且所有概率和为1。其对应的损失函数如下:
常将softmax + cross entropy loss称为softmax loss,softmax只是一个激活函数, 交叉熵才是损失函数, softmax loss其实是使用了softmax的交叉熵损失函数。
由上述softmax的假设函数可知,在学习阶段,每进行一个样本的类别估计都需要计算其属于各个类别的得分并归一化为概率值。当类别数特别大时,如语言模型中从海量词表中预测下一个词(词表中词即这里的类别),用标准的softmax进行预测就会出现分母计算量过大。
Approximate Softmax所解决的就是Softmax中分母的计算量太大的问题。怎么近似,又有如下的NCE和Sampled Softmax两种方法。
02 NCE
简单的讲,NCE的思想是将extreme large softmax转化为若干个二分类问题。
NCE 的核心思想就是通过学习数据分布样本和噪声分布样本之间的区别,从而发现数据中的一些特性,因为这个方法需要依靠与噪声数据进行对比,所以称为“噪声对比估计(Noise Contrastive Estimation)”。更具体来说,NCE 将问题转换成了一个二分类问题,分类器能够对数据样本和噪声样本进行二分类,通过最大化同一个目标函数来估计模型参数 。
以语言模型为例,利用NCE可将从词表中预测某个词的多分类问题,转为从噪音词中区分出目标词的二分类问题。具体如图所示:
下面从数学角度看看具体如何构造转化后的目标函数(损失函数)。
记词wi的上下文为ci,
为从某种噪音分布Q中生成的K个噪音词(从词表中采样生成)。则(ci,wi)构成了正样本,
构成了负样本。
类比推荐领域,c 就是user, w 是target item , y 是label。
由于NCE会将一句话拆成若干二分类,所以共有k+1个样本。可看成从两种不