softmax with candidate sampling

Problem:使用softmax时,目标类太多(数万级以上,典型NLP环境),训练时logits的计算量太大,导致使用极大似然估计的时间代价令人难以忍受;下面探讨如何有效解决这个问题(下文中特征向量有时简称样本)。


总体思路:当一个训练样本由(x_{i},T_{i})构成时,其中x_{i}是特征向量(上下文),T_{i}是类(词汇)集合L的某子类。我们想学习一个兼容函数F(x,y),它表示给定一个特征向量(上下文)x与类(中心词)y的兼容性(类y的概率)。“全面”的训练方法如softmax和logistic回归要求对每个样本x的每个类y \in L计算F(x,y)。当\vert L \vert很大时,其运算代价将高到难以进行。“候选采样”训练方法涉及构造一个训练任务,其每个训练样本为(x_{i},T_{i}),我们仅需要对小的候选类集C_{i} \subset L计算F(x,y)。典型地,候选集C_{i} 是目标类T_{i} 与随机选择样本的(其它)类S_{i} \subset L 的并集:C_{i}=T_{i} \cup S_{i}。随机选择的S_{i} 也许会或也许不会依赖于x_{i}和(或)T_{i}。训练算法以神经网络的形式进行,表示F(x,y)的层通过从损失函数后向传播误差训练。

几种候选采样方法:计算\tiny Q(y|x)时,如果是采样出的目标类\small y是多集(重复),则累加相同的每个目标类条件概率\tiny Q(y|x)

\large{Sampled \ Softmax: }

假定我们有一个单label问题,每个训练样本(x_{i},\{t_{i}\})由特征向量(上下文)x_{i}和目标类(中心词)t_{i}构成;p(y|x)表示给定特征向量x,目标类是y的概率;我们想训练函数F(x,y)产生softmax logits,也就是给定特征x时类y相对对数概率F(x,y)F(x,y) \leftarrow  log(P(y|x)) + K(x)  \\,其中 K(x)是不依赖于y的任意函数,相对对数概率说明sampled \ softmaxfull \ softmax方式训练时得到logits并不相同,相差一个样本x的函数,但这并不影响最终的最大后验概率预测;

\small\color{red}{在full softmax训练中,对每个训练样本(x_{i},\{t_{i}\}),我们将需要对每个y \in L计算F(x_{i},y)},如果L非常大,那么这个代价是非常昂贵的。在sampled softmax训练中,对每个训练样本(x_{i},\{t_{i}\}),我们按照选择的采样函数Q(y|x)采样类得到一个小集合S_{i} \subset L,每个类y \in L以概率Q(y|x_{i})独立地包含在S_{i}中。

P(S_{i}=S|x_{i})=\prod_{y \in S}Q(y|x_{i}) \prod_{y \in (L-S)}(1-Q(y|x_{i}))  \tag{1}

我们创建候选集合C_{i},它包含目标类和采样类:C_{i}=\{ t_{i} \} \cup S_{i},训练的任务是确定给定集合C_{i},其中的哪个类是目标类。对于C_{i}中的每个类,我们想计算后验概率,给定x_{i}C_{i},目标类y的概率,称之为P(t_{i}=y|x,C_{i}),应用贝叶斯公式

P(t_{i}=y|x_{i},C_{i})=P(t_{i}=y,C_{i}|x_{i})/P(C_{i}|x_{i})\\ = P(t_{i}=y|x_{i})P(C_{i}|t_{i}=y,x_{i})/P(C_{i}|x_{i})\\ = P(y|x_{i})P(C_{i}|t_{i}=y,x_{i})/P(C_{i}|x_{i})    \tag{2}

现在计算P(C_{i}|t_{i}=y,x_{i}),注意到为了使其发生,S_{i}(也许会也许不会包含y)必须包含C_{i}的所有其他元素且一定不能包含任何不在C_{i}中任何类,因此

P(t_{i}=y|x_{i},C_{i})=P(y|x_{i}) \prod_{y^{+} \in C_{i} - \left\{ y \right\} }Q(y^{+}|x_{i})\prod_{y^{-} \in (L-C_{i})}(1-q(y^{-}|x_{i})) \ \ / P(C_{i}|x_{i})  \\ =\frac{P(y|x_{i})}{Q(y|x_{i})}\prod_{y^{+} \in C_{i} }Q(y^{+}|x_{i})\prod_{y^{-} \in (L-C_{i})}(1-q(y^{-}|x_{i}))  \ \ / P(C_{i}|x_{i})  \\ =\frac{P(y|x_{i})}{Q(y|x_{i})} \ \ /K(x_{i}, C_{i}) \tag{3}

这里K(x_{i}, C_{i}) 是一个并不依赖于y的函数。因此

log(P(t_{i}=y|x_{i},C_{i}))=log(P(y|x_{i}))-log(Q(y|x_{i})) + K^{\prime}(x_{i},C_{i})  \tag{4}

这是相对logits, 应该feed到\small{\color{red}{softmax 分类器预测C_{i}中的哪个候选者是正确的}},因为我们试着训练F(x,y)来近似log(P(y|x)),我们采用神经网络输出F(x,y)减去log(Q(y|x)),然后传递结果到softmax分类器(预测哪个候选是正确的),因此softmax分类器输入为

Training \ Softmax \ Input =G(x,y)=F(x,y)-log(Q(y|x))  \tag{5}

,后向传播此分类器的梯度训练F得到我们想要的。K^{\prime}(x_{i},C_{i}) 在计算softmax时可以消去,因此不必带入式中。

训练时,对于每个样本(x_{i}, \left\{ t_{i} \right\}),按照Q(y|x_{i})采样目标类构成C_{i},只需计算这些类别对应的logits,即\big\{G(x_{i},y)\big\}_{y \in C_{i}} ,然后以为目标类构造one-hot向量其长度为\vert C_{i} \vert,通过softmax和交叉熵计算得到损失函数-log \frac{exp(G(x_{i},t_{i}))}{\sum_{y \in C_{i}}{exp(G(x_{i},y))}}=-G(x_{i},t_{i})+log(\sum_{y \in C_{i}}{exp(G(x_{i},y))})  \\;预测时,则对所有类计算F(x,y)并使用softmax;


\large{Noise \ Contrastive \ Estimation \ (NCE)}

每个训练样本(x_{i},T_{i})由一个特征向量x_{i}(上下文)和一个小的Multiset目标类(中心词)T_{i}构成,实践中T_{i}或许是一个集合甚至是一个单类,但为了更一般化,这里使用multiset。P(y|x):=E(T(y)|x)表示给定样本x的所有目标类中每个类y的期望数,我们想训练函数F(x,y)近似对数期望数:

F(x,y) \leftarrow log(P(y|x)) \tag{1}

对于每个样本(x_{i},T_{i}),我们采样出目标类S_{i}构成multiset。实践上,挑选一个集合或许是有意义的,但这里使用multiset以更具一般性。我们的采样算法也许会也许不会依赖x_{i},但不需要依赖T_{i}。我们构造一个候选multiset,它包含目标类和采样的目标类的总和C_{i}=T_{i}+S_{i}。我们的训练任务是从采样的目标类中区分真正的目标类,对T_{i}的每个元素,我们有一个正的训练元样本,对S_{i}的每个元素,我们有一个负的训练元样本。

根据我们的采样算法,我们引入Q(y|x):= E(S(y)|x))表示采样的目标类集合中的一个特定类的期望数。如果S_{i}从不含有重复类,那么这是一个概率。那么给定xy来自TS的胜率对数(即logit)为:

logodds(y \ came from \ T \ vs \ S|x) = log\frac{P(y|x)}{Q(y|x)}=log(P(y|x))-log(Q(y|x)) \tag{2}

其中第一项log(P(y|x)),是我们想训练F(x,y)估计的;在模型中有一个层表示F(x,y),增加第二项-log(Q(y|x)) 到其中(解析地计算),然后将结果传给logistic回归损失函数(对于输入x_{i},如果y \in T_{i}则label为正,如果y \in S_{i}则label为负);因此logisitc回归的输入为

Logistic \ Regression \ Input=G(x,y)= F(x,y)-log(Q(y|x))  \tag{3}

这个logistic 回归的作用是对样本x而言,要求神经网络训练能够使得真实目标类与采样目标类完全分开。

训练时,对每个样本(x_{i}, T_{i}),按照采样函数Q(y|x)采样出目标类S_{i}构造负样本(x_{i}, S_{i});对每个样本需要计算\vert C_{i} \vert = \vert T_{i} \vert + \vert S_{i} \vert个交叉熵损失函数,即\vert T_{i} \vert个正损失得到-\sum_{y \in T_{i}}{log(1+exp(-G(x_{i},y)))} \vert S_{i} \vert个负损失得到-\sum_{y \in S_{i}}{log(1+exp(G(x_{i},y)))},总损失函数为-\big\{ \sum_{y \in T_{i}}{log(1+exp(-G(x_{i},y)))} + \sum_{y \in S_{i}}{log(1+exp(G(x_{i},y)))} \big\} \\;预测时,对所有类使用F(x,y)并归一化;


\large Negative\ Sampling

负采样是NCE的一个简单变种,在训练过程中并不从网络输出中减去log(Q(y|x)),即logit不是F(x,y)-log(Q(y|x))而是F(x,y)

Logistic\ Regression\ Input = G(x,y)=F(x,y)  \\

这样我们回归的目标是log(P(y|x))-log(Q(y|x))=log(\frac{P(y|x)}{Q(y|x)}),可以看出这并不是样本的对数似然,而是yx的点互信息PMI,因此负采样技术仅能应用与特定任务中,在该任务中训练的目标依赖于采样分布。典型的应用场景是词向量嵌入,此时Q(y|x)=Q(y)表示词汇的先验分布(实践中又采用了指数化并重新归一化分布),而log(\frac{P(y|x)}{Q(y|x)})表达了上下文给中心词带来的信息增量(因为有了你,我现在增量了多少),优化信息增量比优化信息量(因为你,我现在存量多少)log(P(y|x))更具有意义;负采样方法不用来预测,因为学习F(x,y)的参数不是原来的极大样本集似然目标下的参数;


\large Sampled\ Logistic

噪声对比估计、负采样方法是允许采样集S_{i}包含真实目标类的,但是如果采样的softmax方法一样,采样的logistic是不允许采样集中包含真实目标类的,其它一如与NCE相同;因此我们的输入logit仍然是不变的,

Logistic \ Regression \ Input=G(x,y)= F(x,y)-log(Q(y|x))  \\

但是回归的目标是判断y是来自T_{i}还是S_{i}-T_{i},那么F(x,y)就近似了log(\frac{P(y|x)}{1-P(y|x)})

log(P(y|x))=-log(1+exp(-F(x,y)))

注意这里学习的F(x,y)的参数,跟原始softmax学习得到的参数是不一样的,预测时需使用上式进行归一化;


以上方法中Q(y|x)若不依赖于x,则称之为环境无关的采样,但是需要指出环境依赖的采样(Hard negative)对于训练模型是非常有用的,当然采样的代价也是巨大的;环境无关的采样,使得我们可以对所有训练样本使用通用的采样类S_{i},在batch训练环境下,我们可以更细化为每个batch使用相同的采样类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容