[机器学习基础]为什么要使用 softmax 和 交叉熵 ?

在做数据拟合时,如果我们在线性函数中加入高斯噪声,通过极大似然的方法我们可以推导出均方误差(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 xiRn y i y_i yi 是one-hot标签,设共有m个类别(因此 y i ∈ R m y_i\in\mathbb R^m yiRm),我们期望学习到一个函数 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=1nP(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=1nyilogP(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=1myi(j)logP(xi)(j)=yilogP(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+ex1=ea+eaxea
其实这两个函数的导数非常好表示:

我们对交叉熵损失函数求导:(假设 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)[yilogsoftmax(oi)]=oi(j)[j=1myi(j)logk=1mexp(oi(k))exp(oi(j))]=oi(j)[j=1myi(j)logk=1mexp(oi(k))j=1myi(j)oi(j)]=oi(j)[logk=1mexp(oi(k))j=1myi(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}}) x1+ex1=1+ex1(11+ex1)
我们发现这两个函数对原变量求导,得到导数值在计算过程中都不必知道原变量值的大小,只需要知道自身的值(交叉熵损失函数需要知道外部标签)即可,这在实现误差的反向传播(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来说,就目前的需求来说,它完全满足,因此目前来看它是合理的。我们可以等将来我们有更多的需求的时候再来构造新的传播函数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值