在做数据拟合时,如果我们在线性函数中加入高斯噪声,通过极大似然的方法我们可以推导出均方误差(mean squared error,MSE)损失函数。从直观上来看,MSE通过最小化所有点到直线距离平方的加和来确定参数。
在做数据分类时,如果我们也希望用距离的平方和来作为损失函数,那就不是特别好,毕竟距离分割超平面越远,应该损失越小才是。
对于分类问题,最经典的模型就是支持向量机(support vector machine,SVM),它的分割超平面由支撑向量所决定,非支撑向量的微小振动并不会改变最终模型。
今天我们通过概率的角度,介绍另一种分类准则。
分类问题中使用交叉熵损失函数的两种合理解释
我们设训练集 T = { ( x i , y i ) } i = 1 , . . . , n \mathcal T=\{(x_i,y_i)\}_{i=1,...,n} T={(xi,yi)}i=1,...,n,其中 x i ∈ R n x_i\in\mathbb R^n xi∈Rn , y i y_i yi 是one-hot标签,设共有m个类别(因此 y i ∈ R m y_i\in\mathbb R^m yi∈Rm),我们期望学习到一个函数 P P P 来使得 P ( x i ) ∈ R m P(x_i)\in\mathbb R^m P(xi)∈Rm 是 x i x_i xi 属于每一类的概率。
如何学习?(我们假设函数 P P P 已经经过处理使得各分量加和为1)
第一种方法,我们可以使用极大似然:
P = arg max ∏ i = 1 n P ( x i ) ⋅ y i P=\arg\max\prod\limits_{i=1}^n P(x_i)\cdot y_i P=argmaxi=1∏nP(xi)⋅yi
(注意这里 y i y_i yi 是one-hot编码,因此内积 P ( x i ) ⋅ y i P(x_i)\cdot y_i P(xi)⋅yi 其实只有一小项相乘,在数值上等于 $P(x_i) $ 的第 j j j 项, j j j 是 x i x_i xi 所在的类)
极大似然等价于极小化负对数似然:
P = arg min [ − ∑ i = 1 n y i ⋅ log P ( x i ) ] P=\arg\min[-\sum\limits_{i=1}^n y_i\cdot\log P(x_i)] P=argmin[−i=1∑nyi⋅logP(xi)]
(因为是one-hot,所以我们可以把 y i y_i yi 从内积中提出来,这里对向量 P ( x i ) P(x_i) P(xi) 求对数等于对每一项求对数)
第二种方法,由于向量 P ( x i ) P(x_i) P(xi) 和 y i y_i yi 都满足各分量的加和为1,因此可以看成是一种分布,在信息论中衡量分布的损失经常用交叉熵损失函数:
l ( P ( x i ) , y i ) = − ∑ j = 1 m y i ( j ) log P ( x i ) ( j ) = − y i ⋅ log P ( x i ) l(P(x_i),y_i)=-\sum\limits_{j=1}^m y_i^{(j)}\log P(x_i)^{(j)}=-y_i\cdot\log P(x_i) l(P(xi),yi)=−j=1∑myi(j)logP(xi)(j)=−yi⋅logP(xi)
我们发现这和极大似然得到了 相同的结果,我们一般称这个损失函数为交叉熵损失函数。
函数 P P P 的预处理
一般我们神经网络某层的输出并不总是满足各分量的和为1,目前使用最多的处理方法是使用softmax的方法。
我浏览了很多讲解softmax的合理性的文章,其中这篇文章 https://intellipaat.com/community/2015/why-is-the-cross-entropy-method-preferred-over-mean-squared-error-in-what-cases-does-this-doesnt-hold-up 提到的softmax函数的二维形式与sigmoid很类似让我很受启发(我刚看了一下百度百科也有类似的介绍):
s
o
f
t
m
a
x
:
e
x
i
∑
j
e
x
j
s
i
g
m
o
i
d
:
1
1
+
e
−
x
=
e
a
e
a
+
e
a
−
x
softmax: \dfrac{e^{x_i}}{\sum_j e^{x_j}}\\ sigmoid:\dfrac{1}{1+e^{-x}}=\dfrac{e^a}{e^a+e^{a-x}}
softmax:∑jexjexisigmoid:1+e−x1=ea+ea−xea
其实这两个函数的导数非常好表示:
我们对交叉熵损失函数求导:(假设 P ( x i ) = s o f t m a x ( o i ) P(x_i)=softmax(o_i) P(xi)=softmax(oi) )
∂ ∂ o i ( j ) [ − y i ⋅ log s o f t m a x ( o i ) ] = ∂ ∂ o i ( j ) [ − ∑ j = 1 m y i ( j ) ∗ log e x p ( o i ( j ) ) ∑ k = 1 m e x p ( o i ( k ) ) ] = ∂ ∂ o i ( j ) [ ∑ j = 1 m y i ( j ) ∗ log ∑ k = 1 m e x p ( o i ( k ) ) − ∑ j = 1 m y i ( j ) ∗ o i ( j ) ] = ∂ ∂ o i ( j ) [ log ∑ k = 1 m e x p ( o i ( k ) ) − ∑ j = 1 m y i ( j ) ∗ o i ( j ) ] = s o f t m a x ( o i ( j ) ) − y i ( j ) \dfrac{\partial}{\partial o_i^{(j)}}[- y_i\cdot\log softmax(o_i)] =\dfrac{\partial}{\partial o_i^{(j)}}[-\sum\limits_{j=1}^m y_i^{(j)}*\log \dfrac{exp(o_i^{(j)})}{\sum_{k=1}^m exp(o_i^{(k)})}]\\ =\dfrac{\partial}{\partial o_i^{(j)}}[\sum\limits_{j=1}^m y_i^{(j)}*\log \sum_{k=1}^m exp(o_i^{(k)})-\sum\limits_{j=1}^m y_i^{(j)}*o_i^{(j)}]\\ =\dfrac{\partial}{\partial o_i^{(j)}}[\log \sum_{k=1}^m exp(o_i^{(k)})-\sum\limits_{j=1}^m y_i^{(j)}*o_i^{(j)}]\\ =softmax(o_i^{(j)})-y_i^{(j)} ∂oi(j)∂[−yi⋅logsoftmax(oi)]=∂oi(j)∂[−j=1∑myi(j)∗log∑k=1mexp(oi(k))exp(oi(j))]=∂oi(j)∂[j=1∑myi(j)∗logk=1∑mexp(oi(k))−j=1∑myi(j)∗oi(j)]=∂oi(j)∂[logk=1∑mexp(oi(k))−j=1∑myi(j)∗oi(j)]=softmax(oi(j))−yi(j)
我们下面对sigmoid函数求导:(这个推导网上很多,就不重复了)
∂
∂
x
1
1
+
e
−
x
=
1
1
+
e
−
x
(
1
−
1
1
+
e
−
x
)
\dfrac{\partial }{\partial x}\dfrac{1}{1+e^{-x}}=\dfrac{1}{1+e^{-x}}(1-\dfrac{1}{1+e^{-x}})
∂x∂1+e−x1=1+e−x1(1−1+e−x1)
我们发现这两个函数对原变量求导,得到导数值在计算过程中都不必知道原变量值的大小,只需要知道自身的值(交叉熵损失函数需要知道外部标签)即可,这在实现误差的反向传播(BP)算法的时候十分方便。
对于sigmoid函数,我们有它的改进版tanh和softsign ,可以参考https://baike.baidu.com/item/Sigmoid%E5%87%BD%E6%95%B0/7981407#%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0
对于Softmax来说,就目前的需求来说,它完全满足,因此目前来看它是合理的。我们可以等将来我们有更多的需求的时候再来构造新的传播函数。