Softmax简介

 
 
 
 
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达

Softmax是一种数学函数,通常用于将一组任意实数转换为表示概率分布的实数。其本质上是一种归一化函数,可以将一组任意的实数值转化为在[0, 1]之间的概率值,因为softmax将它们转换为0到1之间的值,所以它们可以被解释为概率。如果其中一个输入很小或为负,softmax将其变为小概率,如果输入很大,则将其变为大概率,但它将始终保持在0到1之间。

Softmax是逻辑回归的一种推广,可以用于多分类任务,其公式与逻辑回归的sigmoid函数非常相似。只有当分类是互斥的,才可以在分类器中使用softmax函数,也就是说只能是多元分类(即数据只有一个标签),而不能是多标签分类(即一条数据可能有多个标签)。

许多多层神经网络输出层的最后一层是一个全连接层,输出是一个实数向量,这个向量通常代表了每个类别的得分或置信度。为了将这些得分转换为概率分布,通常会使用softmax函数。因为它将分数转换为规范化的概率分布,可以显示给用户或用作其他系统的输入。所以通常附加一个softmax函数在神经网络的最后一层之后。

Softmax函数的公式

0c9f41ed3bfdaca6ed32a3b475d603c9.png

softmax函数的输入是一个包含K个元素的向量,其中不带箭头的z表示向量的一个元素:

a2dad26229b7b4c14d061d322370c11c.png

下面是一个例子:

86ae420406cd80db8350123ded3959b4.png

其中分子的函数可视化如下:

8458f8633ea8740bed1ba67c5bbd6a78.png

Softmax的分子将指数函数应用于向量的每个元素,对于最高的输入值返回最高的输出值。因为它的范围是(0,∞),所以任何负数也变成正数。这可以从上面的图和下面的的区间中看出。

13d06665244cf9f5866e8cb28061efd3.png

Softmax分母中的求和是通过确保函数的和为1来标准化每个元素,创建一个概率分布。所有的指数元素加在一起,所以当每个指数元素除以这个和时,它将是它的一个百分比。[5,7,10]的指数元素之和如下:

9eb3c17acff50efd585488bbbfdbde1f.png

下面这个例子将使用一个3元素向量[5,7,10]来演示softmax。

2df92a4e82ff46a54d4a05f700fbd265.png

i表示向量的每个元素单独传入,这样会创建一个包含K个元素的向量作为输出。由于K = 3,函数将被计算三次:

c69e5935b11e30eac91247597e91b9e8.png

输出为[0.006,0.047,0.946],总和约为1。

我们可以使用框架中已经实现的softmax函数可以用来自动计算,例如PyTorch中:

import torch
 
 # set the vector to a tensor
 z = torch.Tensor([5, 7, 10])
 
 # apply softmax
 softmax = torch.exp(z) / torch.sum(torch.exp(z))
 
 #tensor([0.0064, 0.0471, 0.9465])

对于矩阵来说,也是一样的,我们下面先手动计算矩阵的softmax

ff7eab77603821ba2b47f18f4c892ec8.png

softmax = torch.exp(x) / torch.sum(torch.exp(x), axis=1, keepdims=True)

得到了结果:

tensor([[0.0900, 0.2447, 0.6652],
         [0.0900, 0.2447, 0.6652],
         [0.0900, 0.2447, 0.6652]])

每个向量加起来大约是1。但是这里有一个问题:输入向量不同但是结果是相同的。为什么会这样?

因为只要指数值之间的距离相同,结果就是是相同的,看看下面的计算:

7ac7db515b5287d1bcdc8d7411ef1e36.png

为了验证我们的计算,可以使用框架内置的函数,比如torch的nn.Softmax

import torch.nn as nn
 
 x = torch.Tensor([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])
 
 # sum each row
 softmax_layer = nn.Softmax(dim=1)
 
 output = softmax_layer(x)

结果是一样的

tensor([[0.0900, 0.2447, 0.6652],
         [0.0900, 0.2447, 0.6652],
         [0.0900, 0.2447, 0.6652]])

说明我们的实现是没有问题的,但是还要说明一点,尽量使用框架提供的计算,因为这样会经过优化,速度会比我们手动实现快很多。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值