Softmax和Cross-entropy是什么关系?
共 4046字,需浏览 9分钟
·
2022-07-22 10:39
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
1. 什么是 Softmax?
所有的值都是 [0, 1] 之间的(因为概率必须是 [0, 1])
所有的值加起来等于 1
2. 文档里面跟 Softmax 有关的坑
logits
就是 全连接层(经过或者不经过 activation都可以)的输出, probability
就是 softmax 的输出结果。这里 logits
有些地方还称之为 unscaled log probabilities
。这个就很意思了,unscaled probability可以理解,那又为什么 全连接层直接出来结果会和 log 有关系呢?原因有两个:
因为 全连接层 出来的结果,其实是无界的(有正有负),这个跟概率的定义不一致,但是你如果他看成 概率的 log,就可以理解了。
softmax 的作用,我们都知道是 normalize probability。在 softmax 里面,输入 都是在指数上的 ,所有把 想成 log of probability 也就顺理成章了。
3. Softmax 就是 Soft 版本的 ArgMax
举个栗子,假如 softmax 的输入是:
softmax 的结果是:
我们稍微改变一下输入,把 3 改大一点,变成 5,输入是
softmax 的结果是:
这种 soft 版本的 max 在很多地方有用的上。因为 hard 版本的 max 好是好,但是有很严重的梯度问题,求最大值这个函数本身的梯度是非常非常稀疏的(比如神经网络中的 max pooling),经过hardmax之后,只有被选中的那个变量上面才有梯度,其他都是没有梯度。这对于一些任务(比如文本生成等)来说几乎是不可接受的。所以要么用 hard max 的变种,比如Gumbel,
,要么就直接 softmax。
4. Softmax 的实现以及数值稳定性
softmax 的代码实现看似是比较简单的,直接套上面的公式就好
def softmax(x):
"""Compute the softmax of vector x."""
exps = np.exp(x)
return exps / np.sum(exps)
def stablesoftmax(x):
"""Compute the softmax of vector x in a numerically stable way."""
shiftx = x - np.max(x)
exps = np.exp(shiftx)
return exps / np.sum(exps)
这样一种实现数值稳定性已经好了很多,但是仍然会有数值稳定性的问题。比如输入的值差别过大的时候,比如
NaN
的错误。但是这个就是数学本身的问题了,大家使用的时候稍微注意下。LogSoftmax
(然后再求 exp
),数值稳定性比 softmax 好一些。,LogSoftmax
省了一个指数计算,省了一个除法,数值上相对稳定一些。另外,其实 Softmax_Cross_Entropy
里面也是这么实现的 5. Softmax 的梯度
6. Softmax 和 Cross-Entropy 的关系
那么我们知道了,cross entropy 是用来衡量两个概率分布之间的距离的,softmax能把一切转换成概率分布,那么自然二者经常在一起使用。但是你只需要简单推导一下,就会发现,softmax + cross entropy 就好像
我们为什么不直接
LogSoftmax
。这玩意算起来比 softmax 好算,数值稳定还好一点,为啥不直接算他呢?好消息!
小白学视觉知识星球
开始面向外开放啦👇👇👇
下载1:OpenCV-Contrib扩展模块中文版教程 在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。 下载2:Python视觉实战项目52讲 在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。 下载3:OpenCV实战项目20讲 在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。 交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~