前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Softmax与Sigmoid你还不知道存在这些联系?

Softmax与Sigmoid你还不知道存在这些联系?

作者头像
灿视学长
发布2021-05-28 11:44:35
8090
发布2021-05-28 11:44:35
举报
文章被收录于专栏:灿视学长

持续更新《百面计算机视觉第三版》面试题!欢迎私我微信!


Softmax与Sigmoid函数有哪些区别与联系?

1. Sigmoid函数

Sigmoid

函数也叫

Logistic

函数,将输入值压缩到

(0,1)

区间之中,其函数表达式为:

Sigmoid(x) =\frac{1}{1+e^{-x}}

函数图像如图所示:

其求导之后的表达式为:

\operatorname{Sigmoid}^{\prime}(x)=\operatorname{Sigmoid}(x) \cdot(1-\operatorname{Sigmoid}(x))

其梯度的导数图像如:

对于

Sigmoid

函数,其优点为:

Sigmoid

函数的输出在

(0,1)

之间,我们通常把它拿来作为一个二分类的方案。其输出范围有限,可以用作输出层,优化稳定。

Sigmoid

函数是一个连续函数,方便后续求导。

其缺点为:

  • 从函数的导函数可以得到,其值范围为(0, 0.25),存在梯度消失的问题。
Sigmoid

函数不是一个零均值的函数,导致后一层的神经元将得到上一层非

0

均值的信号作为输入,从而会对梯度产生影响。

Sigmoid

函数是一个指数函数的激活函数,我们把每次基本运算当作一次

FLOPs

(Floating Point Operations Per Second),则

Sigmod

函数包括求负号,指数运算,加法与除法等4

FLOPs

的运算量,预算量较大。而如

Relu(x)=max(0, x)

,为

1FLOPs

对于非互斥的多标签分类任务,且我们需要输出多个类别。如一张图我们需要输出是否是男人,是否戴了眼镜,我们可以采用Sigmoid函数来输出最后的结果。 如最后

Sigmoid

的输出为[0.01, 0.02, 0.41, 0.62, 0.3, 0.18, 0.5, 0.42, 0.06, 0.81],我们通过设置一个概率阈值,比如

0.3

,如果概率值大于

0.3

,则判定类别符合,那么该输入样本则会被判定为类别

3

、类别

4

、类别

5

、类别

7

及类别

8

,即一个样本具有多个标签。

2. Softmax函数

Softmax

函数又称归一化指数函数,函数表达式为:

y_{i}=\operatorname{Softmax}(x_{i})=\frac{e^{x_{i}}}{\sum_{j=1}^{n} e^{x_{j}}}

其中,

i \in [1, n]

\sum_{i} y_{i}=1

。如网络输出为

[-20, 10, 30]

,则经过

Softmax

层之后,输出为

[1.9287e-22, 2.0612e-09, 1.0000e+00]

对于

Softmax

,往往我们会在面试的时候,需要手写

Softmax

函数,这里给出一个参考版本。

代码语言:javascript
复制
import numpy as np
def softmax(f):
    # 为了防止数值溢出,我们将数值进行下处理
    # f: 输入值
    f -= np.max(f) # f becomes [-666, -333, 0]
    return np.exp(f) / np.sum(np.exp(f))  

针对

Softmax

函数的反向传播,这里给出手撕反传的推导过程,主要是分两种情况:

(1)当

i=j

\begin{aligned} \frac{\partial y_{i}}{\partial x_{j}} &=\frac{\partial y_{i}}{\partial x_{i}} \\ &=\frac{\partial}{\partial x_{i}}\left(\frac{e^{x_{i}}}{\sum_{k} e^{x_{k}}}\right) \\ &=\frac{\left(e^{x_{i}}\right)^{\prime}\left(\sum_{k} e^{x_{k}}\right)-e^{x_{i}}\left(\sum_{k} e^{x_{k}}\right)^{\prime}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \\ &=\frac{e^{x_{i}} \cdot\left(\sum_{k} e^{x_{k}}\right)-e^{x_{i}} \cdot e^{x_{i}}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \\ &=\frac{e^{x_{i}} \cdot\left(\sum_{k} e^{x_{k}}\right)}{\left(\sum_{k} e^{x_{k}}\right)^{2}}-\frac{e^{x_{i}} \cdot e^{x_{i}}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \\ &=\frac{e^{x_{i}}}{\sum_{k} e^{x_{k}}}-\frac{e^{x_{i}}}{\sum_{k} e^{x_{k}}} \cdot \frac{e^{x_{i}}}{\sum_{k} e^{x_{k}}} \\ &=y_{i}-y_{i} \cdot y_{i} \\ &=y_{i}\left(1-y_{i}\right) \end{aligned}

(2)当

i \neq j

\begin{aligned} \frac{\partial y_{i}}{\partial x_{j}} &=\frac{\partial}{\partial x_{j}}\left(\frac{e^{x_{i}}}{\sum_{k} e^{x_{k}}}\right) \\ &=\frac{\left(e^{x_{i}}\right)^{\prime}\left(\sum_{k} e^{x_{k}}\right)-e^{x_{i}}\left(\sum_{k} e^{x_{k}}\right)^{\prime}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \\ &=\frac{0 \cdot\left(\sum_{k} e^{x_{k}}\right)-e^{x_{i}} \cdot e^{x_{j}}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \\ &=\frac{-e^{x_{i}} \cdot e^{x_{j}}}{\left(\sum_{k} e^{x_{k}}\right)^{2}} \\ &=-\frac{e^{x_{i}}}{\sum_{k} e^{x_{k}}} \cdot \frac{e^{x_{j}}}{\sum_{k} e^{x_{k}}} \\ &=-y_{i} \cdot y_{j} \end{aligned}

综上所述:

\quad \frac{\partial y_{i}}{\partial x_{j}}=\left\{\begin{array}{l}=y_{i}-y_{i} y_{i}, \text { 当 } i=j \\ =0-y_{i} \cdot y_{j}, \quad \text { 当 } i \neq j\end{array}\right.

因此,不失一般性,扩展成矩阵形式则为:

\frac{\partial Y}{\partial X}=\operatorname{diag}(Y)-Y^{T} \cdot Y(

当Y的shape为

(1, \mathrm{n})

时)。后面在下一题中,我们会将

Softmax

Cross
Entropy
Loss

进行结合,再来推导前向与反向。

因此,当我们的任务是一个互斥的多类别分类任务(如imagenet分类),网络只能输出一个正确答案,我们可以用

Softmax

函数处理各个原始的输出值。从公式中,我们可以看到

Softmax

函数的分母是综合到了所有类别的信息。通常我们也会把

Softmax

函数的输出,这主要是由于

Softmax

函数先拉大了输入向量元素之间的差异(通过指数函数),然后才归一化为一个概率分布,在应用到分类问题时,它使得各个类别的概率差异比较显著,最大值产生的概率更接近

1

,这样输出分布的形式更接近真实分布,从而当作网络的置信度

对于

Softmax

函数而言,我们可以从不同的角度来理解它:

Argmax

是一个暴力的找最大值的过程,最后的输出是以一个

One-hot

形式,将最大值的位置设置为

1

,其余为

0

。这样的话,则在网络训练中,是不可导的,我们采用

Softmax

看作是

Argmax

的平滑近似,从而可以使得网络可导。

Softmax

将输入向量归一化映射到一个类别概率分布,即

n

个类别上的概率分布,因此我们常将

Softmax

放到

MLP

的最后一层。

  • 从概率图角度,
Softmax

可以理解为一个概率无向图上的联合概率。

3. 联系

对于二分类任务而言,二者都可以达到目标,在理论上,没有什么区别。

举个栗子,如现在是二分类(

x_{1},x_{2}

), 经过

Sigmoid

函数之后:

\operatorname{Sigmoid}\left(x_{1}\right)=\frac{1}{1+e^{-x_{1}}}

对于

Softmax

函数,则为:

\operatorname{Softmax}\left(x_{1}\right)=\frac{e^{x_{1}}}{e^{x_{1}}+e^{x_{2}}}=\frac{1}{1+e^{-\left(x_{1}-x_{2}\right)}}

对于

x_{1} - x_{2}

,我们可以使用一个

z_{1}

来进行替换,则替换成了:

\operatorname{Softmax}\left(x_{1}\right)=\frac{1}{1+e^{-z_{1}}}

该表达式与

Sigmoid(x_{1})

相同,理论上是相同的。

4. 区别

在我们进行二分类任务时,当我们使用

Sigmoid

函数,最后一层全连接层的神经元个数是

1

,神经网络的输出经过它的转换,可以将数值压缩到

(0,1)

之间,得到的结果可以理解成分类成目标类别的概率

P

,而不分类到该类别的概率是

(1 - P)

,这也是典型的两点分布的形式。

而使用

Softmax

函数则需要是两个神经元,一个是表示前景类的分类概率,另一个是背景类。此时,

Softmax

函数也就退化成了二项分布。

更简单一点理解,

Softmax

函数是对两个类别进行建模,其两个类别的概率之和是

1

。而

Sigmoid

函数是对于一个类别的建模,另一个类别可以通过1来相减得到。

Sigmoid

得到的结果是“分到正确类别的概率和未分到正确类别的概率”,

Softmax

得到的是“分到正确类别的概率和分到错误类别的概率”。

5. 引用

  1. https://blog.csdn.net/uncle_ll/article/details/82778750
  2. https://zhuanlan.zhihu.com/p/356976844
  3. https://zhuanlan.zhihu.com/p/37740860
  4. https://blog.csdn.net/wujunlei1595848/article/details/90741963
  5. https://blog.csdn.net/wujunlei1595848/article/details/90741963

- END -

往期干货!!!!


大家好,我是灿视。目前是位算法工程师 + 创业者 + 奶爸的时间管理者!

我曾在19,20年联合了各大厂面试官,连续推出两版《百面计算机视觉》,受到了广泛好评,帮助了数百位同学们斩获了BAT等大小厂算法Offer。现在,我们继续出发,持续更新最强算法面经。

我曾经花了4个月,跨专业从双非上岸华五软工硕士,也从不会编程到进入到百度与腾讯实习。欢迎各位与我交流!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灿视学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Softmax与Sigmoid函数有哪些区别与联系?
    • 1. Sigmoid函数
      • 2. Softmax函数
        • 3. 联系
          • 4. 区别
            • 5. 引用
              • 往期干货!!!!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档