简简单单了解一下softmax与交叉熵

Posted 非晚非晚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简简单单了解一下softmax与交叉熵相关的知识,希望对你有一定的参考价值。


也看了不少softmax和交叉熵的文章了,不少文章对它们的来龙去脉做了比较清晰地梳理,有些文章讲得过于复杂,从信息量、相对熵(KL散度)讲到交叉熵,对于想要实际应用的同学来说,其实没有必要掌握它的来龙去脉,于是在此,对softmax和交叉熵的概念和公式进行简要说明,辅助以实际例子对它们具体说明。

1. softmax

softmax用于多分类过程中,它将多个神经元的输出,映射到 ( 0 , 1 ) (0,1) (0,1) 区间内,可以看成概率来理解,从而来进行多分类!假设我们有一个数组, V i V_i Vi 表示 V V V 中的第 i i i 个元素,那么这个元素的 softmax 值就是

S i = e V i ∑ j e V j S_i = \\frace^V_i\\sum_j e^V_j Si=jeVjeVi

举个例子,假设有现在有3个数据,它们为[3,1,-3],经过softmax层之后,处理结果如下:

S 0 = e 3 e 3 + e 1 + e 3 = 0.87887824 S_0 = \\frace^3e^3+e^1+e^3=0.87887824 S0=e3+e1+e3e3=0.87887824
S 1 = e 1 e 3 + e 1 + e − 3 = 0.11894324 S_1= \\frace^1e^3+e^1+e^-3=0.11894324 S1=e3+e1+e3e1=0.11894324
S 2 = e − 3 e 3 + e 1 + e − 3 = 0.00217852 S_2= \\frace^-3e^3+e^1+e^-3=0.00217852 S2=e3+e1+e3e3=0.00217852
实际应用中,使用softmax需要注意数值溢出的问题。因为有指数运算,如果V数值很大,经过指数运算后的数值往往可能有溢出的可能。所以,需要对 V 进行一些数值处理:即V中的每个元素减去V中的最大值。公式如下所示:
D = m a x ( V ) D = max(V) D=max(V)

S i = e V i − D ∑ j e V j − D S_i = \\frace^V_i - D\\sum_j e^V_j - D Si=jeVjDeViD

softmax实现代码如下所示:

import numpy as np

scores = np.array([3, 1, -3])

#原始函数操作
p = np.exp(scores) / np.sum(np.exp(scores))
print(p)

# 防止溢出操作
scores -= np.max(scores) 
print(scores)
p = np.exp(scores) / np.sum(np.exp(scores))
print(p)

输出:

[0.87887824 0.11894324 0.00217852]
[ 0 -2 -6]
[0.87887824 0.11894324 0.00217852]

为了便于理解,再放一张softmax的计算流程:

2. 交叉熵

交叉熵(cross entropy)是深度学习中常用的一个概念,一般用来求目标与预测值之间的差距

2.1 线性回归中的损失函数MSN

在线性回归问题中,常常使用MSE(Mean Squared Error)作为loss函数,比如:

这里的m表示m个样本的,loss为m个样本的loss均值。MSE在线性回归问题中比较好用,那么在逻辑分类问题中还是如此么

  • 为什么线性回归任务中不用MSN方法呢?
  • 答:主要原因是在分类问题中,使用sigmoid/softmx得到概率,配合MSE损失函数时,采用梯度下降法进行学习时,会出现模型一开始训练时(这时候的概率往往很低),学习速率非常慢的情况
  • 因为回归问题要求拟合实际的值,通过MSE衡量预测值和实际值之间的误差,可以通过梯度下降的方法来优化。而不像分类问题,需要一系列的激活函数(sigmoid、softmax)来将预测值映射到0-1之间。
  • 如果分类任务使用sigmoid,当输出是0或1的值时,梯度接近于0,也出现了梯度消失现象

2.2 交叉熵

交叉熵在单分类问题上基本是标配的方法,如下式所示,其中n表示n种类别。

  • 二分类

在二分类的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们的预测得到的概率为 p p p 1 − p 1-p 1p,此时表达式为:


其中:

  • y i y_i yi:表示样本 i i i的label,正类为1,负类为0。
  • p i p_i pi:表示样本 i i i预测为正类的概率。
  • 多分类

多分类的情况实际上就是对二分类的扩展:

其中:

  • M M M: 类别的数量
  • y i c y_ic yic:符号函数0或1,如果样本 i i i的真实类别等于 c c c取1,否则取0。
  • p i c p_ic pic:观测样本 i i i属于类别 c c c的预测概率

现在我们利用这个表达式计算下面例子中的损失函数值:

预测真实是否正确
0.3 0.3 0.40 0 1 (猪)正确
0.3 0.4 0.30 1 0 (狗)正确
0.1 0.2 0.71 0 0 (猫)错误

对所有样本的loss求平均:

预测真实是否正确
0.1 0.2 0.70 0 1 (猪)正确
0.1 0.7 0.20 1 0 (狗)正确
0.3 0.4 0.31 0 0 (猫)错误


对所有样本的loss求平均:

可以发现,虽然上面两个模型的预测值一样,但是交叉熵差别还挺大,所以我们通常使用交叉熵来计算多分类任务。


参考:https://zhuanlan.zhihu.com/p/35709485

以上是关于简简单单了解一下softmax与交叉熵的主要内容,如果未能解决你的问题,请参考以下文章

神经网络学习中的SoftMax与交叉熵

Softmax函数与交叉熵

Softmax 的交叉熵是不是适用于多标签分类?

softmax函数与交叉熵函数详解

具有对数损失的 TensorFlow 单 sigmoid 输出与具有稀疏 softmax 交叉熵损失的两个线性输出,用于二进制分类

Tensorflow四种交叉熵函数计算公式