1. 距离度量惩罚力度太小
用距离度量,比如最小二乘法,定义损失函数,会出现梯度“消失”的问题。例如,下面的模型
z(x,w)=σ(x+w)=1+ex+w1(1)
假设模型初始状态
w=10,训练样本为:
x1=−1,x2=1,y1=0;y2=1;(2)
计算一下,可以得到
z(−1,w)≃1z(1,w)≃1(3)
很容易看出,
z(−1,w)≃1,这个计算结果与训练样本矛盾的,因此需要在损失函数中对其惩罚。但是,因为神经网络的输出结果在[0,1]区间,无论参数
w 与最优解之间差距多大,最大的惩罚力度也不会超过1。这就非常悲剧了,这会严重影响训练效率。因此,我们需要采取措施,加大处罚力度。
2. 巧用对数函数,无限放大惩罚力度
对于正样本而言,模型应该输出数值1。因此,定义惩罚函数:
p(x,w)=−ln(z(x,w)),(y=1)(4)
这个函数很有意思,我期望你输出1,如果你听话,惩罚就是0;如果输出结果 0 这一端靠近,惩罚就趋向无穷大。参见下图,
对于负样本而言,模型应该输出数值0。因此,定义惩罚函数:
n(x,w)=−ln(1−z(x,w)),(y=0)(5)
这个函数同样有意思,我期望你输出0,如果你听话,惩罚就是0;如果输出结果 向1 这一端靠近,惩罚就趋向无穷大。参见下图,
于是我们得到了下面的惩罚函数,其中
y=0 和
y=1是指训练样本中
y 的值
L(w)={−ln(z(x,w)),−ln(1−z(x,w)),(y=1)(y=0)(6)
采用个小技巧,合并在一起,
L(w)=−yln(z(x,w))−(1−y)ln(1−z(x,w))(7)
公式看上去高大上很多,但这只是雕虫小技而已,你可以分别令
y=1,y=0 带入验证一下,应该和(6)效果一样。
3. 交叉熵损失函数
如果有 N 个训练样本
(xi,yi),i=1,2,...,N。损失函数可定义为
L(w)=i=1∑N{−yiln[z(xi,w)]−(1−yi)ln[1−z(xi,w)]}(8)
这个函数就是我们逻辑回归(logistics regression)的损失函数,我们叫它交叉熵损失函数。
4.小结
说一千道一万,交叉熵损失函数有什么价值?答,可以无限增加“分类失误”的惩罚力度,加快模型训练速度。