从二次损失函数开始

回想线性回归的损失函数,使用的是二次损失函数quadratic loss function
损失函数(cost function):

J(θ0,θ1,,θm)=12mi=1m(hθ(x(i))y(i))2

对应的梯度下降公式(Gradient Descent):
(x0i=1)
θj:=θjα1mi=1m(hθ(x(i))y(i))xj(i)

那么问题来了,为什么我们在逻辑回归中却使用这样的损失函数(log)【本文中Log都是指ln即以e为底的指数函数】
J(θ)=1mi=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]

原因:我们在逻辑回归中使用了sigmoid(θx)的函数

sigmoid的函数及导数特性

Machine Learning|番外篇-1 交叉熵代价函数(Cost Function)
Machine Learning|番外篇-1 交叉熵代价函数(Cost Function)
上图:sigmoid函数图像,下图:其导数的图像
从上图可以看出sigmoid在[,5][5,+]区间上函数基本趋于水平,也就是在这个区间它的导数趋近于0。sigmoid(θx)>0
如果逻辑回归代价函数还是采用二次损失函数会怎样?J(θ)=12mi=1m(sigmoid(θx))y(i))2
进一步可以计算出J(θ)的偏导数:Jθ=sigmoid(θx)sigmoid(θx)

使用二次损失函数的逻辑回归将‘学习缓慢’

那么如果偏差较大的情况(>5 or <-5)在梯度下降的过程中,偏导数几乎为零。难以下降。
Machine Learning|番外篇-1 交叉熵代价函数(Cost Function)
上图(4)部分的学习曲线可以看出来,使用二次损失函数的逻辑回归在前150个epoch左右的训练中Cost基本没有下降,出现‘‘学习缓慢’’的现象,后期偏差缩小后又快速下降。

引入交叉熵cross-entropy

J(θ)=1mi=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]

先看看它的关于权重的偏导数:
Jθ=(sigmoid(θx)y)x

直观上可以看到 sigmoid(θx)不见了,梯度下降的速度受(sigmoid(θx)y)的影响,误差越大,梯度下降的越快。
再看看这样形式的代价函数具备的优点:
- 它是非负的(这样才能不断下降)
- 当实际输出接近目标值,那么交叉熵接近0,反之,接近1。
- 刚刚求导得出得结论:误差越大,学习速度也越快
交叉熵有以上三个优点,使其成为逻辑回归的代价函数。

交叉熵的定义

查查都能找到的定义:交叉熵,源至信息论,是“不确定性”的一种度量。如果输出我们期望的结果,不确定性小一些,反之,不确定性大一些。

逻辑回归是怎么勾搭上交叉熵的?

a=sigmoid(z);z=θx;sigmoid(z)=sigmoid(z)(1sigmoid(z))=a(1a)
如果我们希望代价函数的偏导是Jθ=(ay)x(这个公式具备很好的特性)那么有:

Jθ=Jasigmoid(z)===>Jθ=aya(1a)

对a进行积分可以得到:
J=[ylog(a)+(1y)log(1a)]+constant

constant是积分常量。至此反向推出了逻辑回归的交叉熵cost函数。这个交叉熵不是凭空产生的,而是推导出来的。

民谣与辟谣

民谣部分:
Square Loss那就是个最小二乘法
Hinge Loss那是帮你找最大间距(SVM)
exp Loss那就是很牛逼的boosting算法
log Loss那就是逻辑回归
辟谣
“奥卡姆剃刀原则”是经验主义,不是科学结论。即你不能拿着“奥卡姆剃刀原则”来证明你的公式是正确的。证明还是得拿数据说话,拿推导过程说话。


参考:【《Neural Networks and Deep Learning》By Michael Nielsen

相关文章: