这两天看了下libFM的代码,对于分类问题,libFM使用的损失函数是logloss,跟常见的LR的损失函数的形式略有不同。于是整理了下两种形式的LR的异同。
在二分类问题中,样本的label一般有两种形式: y=±1或者y=0,1。
如果y=0,1,那么有:
P(y=1|z)=σ(z)=11+e−zP(y=0|z)=1−σ(z)=11+ez上面的等式可以表示成:
P(y|z)=σ(z)y(1−σ(z))1−y对应的对数损失为:
l(z)=−log(m∏iP(yi|zi))=−m∑ilog(P(yi|zi))=m∑i−yizi+log(1+ezi)最后一步展开如下:
log(P(y|z))=log(σ(z)y(1−σ(z))1−y)=ylog(σ(z))+(1−y)log(1−σ(z))=ylog(11+e−z)+(1−y)log(11+ez)=y(log(11+e−z)−log(11+ez))+log(11+ez)=y(log(1+ez1+e−z))−log(1+ez)=y(log(ez(1+ez)1+ez))−log(1+ez)=yz−log(1+ez)而如果我们选择y=±1,则y的概率为
P(y|z)=σ(yz)=11+e−yz将y=±1 分开表示则有:
P(y=1|z)=σ(z)=11+e−zP(y=−1|z)=σ(−z)=11+ez可以看出,跟y=0,1其实是一样的。
从这里也可以看到,P(y=0|z)和P(y=−1|z)的表达式是相同的, 也就是有如下等式成立:
σ(−z)=1−σ(z)和上面的推导一样:
L(z)=−log(m∏jP(yj|zj))=−m∑jlog(P(yj|zj))=m∑jlog(1+e−yjzj)也就是下面两种表达式是等价的:
−yizi+log(1+ezi)≡log(1+e−yizi)但是两种形式还是有些不同的。
第一种形式其实是从y服从伯努利分布推导出来的。想想伯努利分布的定义:
P(Y=y | p)=L(p;y)=py (1−p)1−y={1−py=0py=1和第一种损失的表示形式是一样的。
这种形式其实也是广义线性模型的一种。
第二种形式的好处是和hinge loss,0-1 loss 比较起来比较方便,因为都是定义在y=±1上的。
下面补充下sigmoid函数的梯度。
σ′(z)=−1(1+e−z)2∗e−z∗(−1)=e−z(1+e−z)2=1+e−z−1(1+e−z)2=11+e−z−1(1+e−z)2=11+e−z(1−11+e−z)=σ(z)(1−σ(z))即,sigmoid函数的梯度有如下关系成立:
σ′(z)=σ(z)(1−σ(z))似然函数关于z的梯度:
第一种形式: ∂logP(y|z)∂z=∂ylog(σ(z))+(1−y)log(1−σ(z))∂z=y1σ(z)∂σ(z)∂z+(1−y)1σ(−z)∗(−1)∗∂σ(−z)∂z=y1σ(z)σ(z)(1−σ(z))+(1−y)1σ(−z)∗(−1)∗σ(−z)(1−σ(−z))=y(1−σ(z))+(y−1)∗(1−σ(−z))=y(1−σ(z))+(y−1)∗(1−(1−σ(z)))=y(1−σ(z))+(y−1)∗σ(z)=y−σ(z)
最终梯度形式就是label和预估值之间的残差。 而似然函数和损失函数之间差了一个负号,所以损失函数关于z的梯度形式应该是σ(z)−y。
推导时用到了σ(−z)=1−σ(z) 和 σ(z)的梯度表达式
第二种形式:
∂logP(y|z)∂z=∂logσ(yz)∂z=1σ(yz)∂σ(yz)∂z=1σ(yz)σ(yz)(1−σ(yz))∗y=y(1−σ(yz))梯度为y(1−σ(yz))。 和第一种形式一样,这里也是使用的似然函数,如果是损失函数则需要再加一个负号。
y = 1时就是1−σ(z),y = -1 时是σ(−z)−1=1−σ(z)−1=−σ(z),
和第一种形式的梯度是一样的。
参考:
1.https://stats.stackexchange.com/questions/250937/which-loss-function-is-correct-for-logistic-regression
2.https://stats.stackexchange.com/questions/229645/why-there-are-two-different-logistic-loss-formulation-notations?noredirect=1&lq=1