阅读了TensorFlow官方文档Candidate Sampling Algorithms Reference,写一下自己关于Sampled Softmax的理解
在多类别问题中,我们常常使用softmax输出各个类别的概率。当类别数量很大时,使用softmax计算量很大。例如,我们的问题是预测一句话中的一个词,那么类别数量就是vocabulary大小。
为此,这篇论文提出了Sampled Softmax的概念。其基本思想就是仅采样一部分类别来做softmax。
假设每个训练样本 ( x i , { t i } ) (x_i, \{t_i\}) (xi,{ ti})包含一个上下文 x x x和一个目标类别 t i t_i ti,所有类别的集合记为 L L L。对于每个训练样本,我们从 L L L 中选择一个小的集合 S i S_i Si。 S i S_i Si中的元素是根据一个采样函数 Q ( y ∣ x ) Q(y|x) Q(y∣x)选择的, Q ( y ∣ x ) Q(y|x) Q(y∣x)表示上下文是 x x x 的条件下选择类别 y y y 的概率 ,各类别被独立选择。
有了 S i S_i Si,定义候选集合为 C i C_i Ci:
C i = S i ∪ { t i } C_i = S_i\cup\{t_i\} Ci=Si∪{ ti}
如果用前面说的softmax(也就是Full softmax),针对每个 y ∈ L y\in L y∈L,要计算 P ( y ∣ x ) P(y|x) P(y∣x),即给定上下文 x x x,目标类别是 y y y的概率。
而在Sampled Softmax中,仅针对 y ∈ C i y\in C_i y∈Ci,计算这样的概率。但要注意,这里计算的是 P ( t i = y ∣ x , C i ) P(t_i = y|x,C_i) P(ti=y∣x,Ci),条件概率的条件多了一个,即给定上下文 x x x以及候选集合 C i C_i Ci的条件下,目标类别是 y y y的概率。
通过贝叶斯法则:
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 ) 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) P(ti=y∣xi,Ci)=P(ti=y,Ci∣xi)/P(Ci∣xi)=P(ti=y∣xi)P(Ci∣ti=y,xi)/P(Ci∣xi)=P(y∣xi)P(Ci∣ti=y,xi)/P(Ci∣xi)
其中, P ( C i ∣ t i = y , x i ) = ∏ y ′ ∈ C i − { y } Q ( y ′ ∣ x i ) ∏ y ′ ∈ L − C i ( 1 − Q ( y ′ ∣ x i ) ) P(C_i|t_i = y, x_i) = \prod_{y'\in C_i−\{y\}} Q(y' |x_i ) \prod_{y'\in L-C_i}(1- Q(y' |x_i )) P(Ci∣ti=y,xi)=y′∈Ci−{ y}∏Q(y′∣xi)y′∈L−Ci∏(1−Q(y′∣xi))
从而:
P ( t i = y ∣ x i , C i ) = P ( y ∣ x i ) ∏ y ′ ∈ C i − { y } Q ( y ′ ∣ x i ) ∏ y ′ ∈ L − C i ( 1 − Q ( y ′ ∣ x i ) ) / P ( C i ∣ x i ) = P ( y ∣ x i ) Q ( y ∣ x i ) ∏ y ′ ∈ C i Q ( y ′ ∣ x i ) ∏ y ′ ∈ L − C i ( 1 − Q ( y ′ ∣ x i ) ) / P ( C i ∣ x i ) = P ( y ∣ x i ) Q ( y ∣ x i ) / K ( x i , C i ) P(t_i = y|x_i,C_i) =P(y|x_i) \prod_{y'\in C_i−\{y\}} 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 ) P(ti=y∣xi,Ci)=P(y∣xi)y′∈Ci−{ y}∏Q(y′∣xi)y′∈L−Ci∏(1−Q(y′∣xi))/P(Ci∣xi)=Q(y∣xi)P(y∣xi)y′∈Ci∏Q(y′∣xi)y′∈L−Ci∏(1−Q(y′∣xi))/P(Ci∣xi)=Q(y∣xi)P(y∣xi)/K(xi,Ci)
其中, K ( x i , C i ) K(x_i, C_i ) K(xi,Ci)是与 y y y无关的函数。取对数:
l o g ( P ( t i = y ∣ x i , C i ) ) = l o g ( P ( y ∣ x i ) ) − l o g ( Q ( y ∣ x i ) ) + K ′ ( x i , C i ) log(P(t_i = y|x_i,C_i)) = log(P(y|x_i)) − log(Q(y|x_i)) + K'(x_i,C_i) log(P(ti=y∣xi,Ci))=log(P(y∣xi))−log(Q(y∣xi))+K′(xi,Ci)
这个式子就是要送入softmax的(所谓logits)。
我们希望神经网络的最后一层输出 F ( x , y ) F(x, y) F(x,y)代表 F ( x , y ) = l o g ( P ( y ∣ x ) ) + K ( x ) F(x, y) = log(P(y|x)) + K(x) F(x,y)=log(P(y∣x))+K(x),因此,训练的时候,手动计算 l o g ( Q ( y ∣ x ) ) log(Q(y|x)) log(Q(y∣x)),然后相减,得到下式送入softmax:
T r a i n i n g S o f t m a x I n p u t = F ( x , y ) − l o g ( Q ( y ∣ x ) ) Training Softmax Input = F(x, y) − log(Q(y|x)) TrainingSoftmaxInput=F(x,y)−log(Q(y∣x))
如果让 F ( x , y ) F(x, y) F(x,y)直接表示 l o g ( P ( y ∣ x ) ) − l o g ( Q ( y ∣ x ) ) + K ( x ) log(P(y|x)) − log(Q(y|x)) + K(x) log(P(y∣x))−log(Q(y∣x))+K(x),结果就会高度依赖于采样分布。