Sigmoid和Softmax的区别和联系

目录

  • 1、公式
    • 1.1 Softmax
    • 1.2 Sigmoid
  • 2、区别
  • 3、以二分类为例
  • 4、代码验证
    • 4.1 二分类
    • 4.2 多分类(以十分类为例)
  • 5、总结

1、公式

1.1 Softmax

   S o f t m a x Softmax Softmax函数的取值范围为 [ 0 , 1 ] [0,1] [0,1],每个输出值都可当成概率来理解。

S o f t m a x ( x i ) = e x i ∑ j = 1 N e x j Softmax(x_{i})=\frac{e^{x_{i}}}{\sum_{j=1}^{N}e^{x_{j}}} Softmax(xi)=j=1Nexjexi

1.2 Sigmoid

   S i g m o i d Sigmoid Sigmoid函数也叫 L o g i s t i c Logistic Logistic函数,输出范围为 [ 0 , 1 ] [0,1] [0,1]

S i g m o i d ( x ) = 1 1 + e − x Sigmoid(x)=\frac{1}{1+e^{-x}} Sigmoid(x)=1+ex1

2、区别

  对于分类任务来说,假设有 N N N个类别,则:

  • S o f t m a x Softmax Softmax函数的输出值有 N N N个,且这 N N N输出值之和为1

  • S i g m o i d Sigmoid Sigmoid函数的输出值有 N N N个,但这 N N N输出值之和不为1

3、以二分类为例

  此时 N = 2 N=2 N=2,理论上,二者没有区别:

S i g m o i d ( x 1 ) = 1 1 + e − x 1 Sigmoid(x_{1})=\frac{1}{1+e^{-x_{1}}} Sigmoid(x1)=1+ex11

S o f t m a x ( x 1 ) = e x 1 e x 0 + e x 1 = 1 e − ( x 1 − x 0 ) Softmax(x_{1})=\frac{e^{x_{1}}}{e^{x_{0}}+e^{x_{1}}}=\frac{1}{e^{-(x_{1}-x_{0})}} Softmax(x1)=ex0+ex1ex1=e(x1x0)1

  在 S o f t m a x Softmax Softmax公式中, e x 0 e^{x_{0}} ex0代表背景类, e x 1 e^{x_{1}} ex1代表目标类,令 z = x 1 − x 0 z=x_{1}-x_{0} z=x1x0,则与 S i g m o i d Sigmoid Sigmoid公式完全相同。

  但二者在实际应用中存在区别,即 S o f t m a x Softmax Softmax函数对应最后一层全连接层的神经元个数是 2 2 2,而 S i g m o i d Sigmoid Sigmoid函数对应最后一层全连接层的神经元个数是 1 1 1。因为 S o f t m a x Softmax Softmax函数将目标分为两类,而 S i g m o i d Sigmoid Sigmoid函数将目标分为一类。

4、代码验证

4.1 二分类

import torch
import matplotlib.pyplot as plt

if __name__ == "__main__":
    print("Start ...")
    x = torch.arange(0, 1, 0.5) 			# x = [0.0000, 0.5000]
    sigmod = torch.sigmoid(x) 				# sigmod = [0.5000, 0.6225]
    softmax = torch.softmax(x, dim=0)		# softmax = [0.3775, 0.6225]
    plt.figure(3, figsize=(12, 10)
    plt.subplot(3, 1, 1)
    plt.plot(x, label="x")
    plt.legend()
    plt.subplot(3, 1, 2)
    plt.plot(sigmod, 'g', label="Sigmod")
    plt.legend()
    plt.subplot(3, 1, 3)
    plt.plot(softmax, 'r', label="Softmax")
    plt.legend()
    plt.show()

Sigmoid和Softmax的区别和联系_第1张图片

  上例中,类别数 N = 2 N=2 N=2,输入值为 x = [ 0.0000 , 0.5000 ] x=[0.0000, 0.5000] x=[0.0000,0.5000] S i g m o i d Sigmoid Sigmoid函数的输出值为 s i g m o d = [ 0.5000 , 0.6225 ] sigmod = [0.5000, 0.6225] sigmod=[0.5000,0.6225] S o f t m a x Softmax Softmax函数的输出值为 s o f t m a x = [ 0.3775 , 0.6225 ] softmax = [0.3775, 0.6225] softmax=[0.3775,0.6225]

  可以看出, S o f t m a x Softmax Softmax函数的两个输出值之和为 1 1 1,这两个输出值分别表示“分到正确类别的概率和分到错误类别的概率”; S i g m o i d Sigmoid Sigmoid函数的两个输出值之和不为 1 1 1,且都在 [ 0 , 1 ] [0,1] [0,1]之间,这两个输出值分别表示“分到正确类别的概率和未分到正确类别的概率”。

4.2 多分类(以十分类为例)

import torch
import matplotlib.pyplot as plt

if __name__ == "__main__":
    print("Start ...")
    x = torch.arange(0, 1, 0.1) 		# x = [0.0000, 0.1000, 0.2000, 0.3000, 0.4000, 0.5000, 0.6000, 0.7000, 0.8000, 0.9000]
    sigmod = torch.sigmoid(x)			# sigmoid = [0.5000, 0.5250, 0.5498, 0.5744, 0.5987, 0.6225, 0.6457, 0.6682, 0.6900,0.7109]
    softmax = torch.softmax(x, dim=0)	# softmax = [0.0612, 0.0676, 0.0748, 0.0826, 0.0913, 0.1009, 0.1115, 0.1233, 0.1362,0.1505]
    plt.figure(3, figsize=(12, 10))
    plt.subplot(3, 1, 1)
    plt.plot(x, label="x")
    plt.legend()
    plt.subplot(3, 1, 2)
    plt.plot(sigmod, 'g', label="Sigmod")
    plt.legend()
    plt.subplot(3, 1, 3)
    plt.plot(softmax, 'r', label="Softmax")
    plt.legend()
    plt.show()

Sigmoid和Softmax的区别和联系_第2张图片

  上例中,类别数 N = 10 N=10 N=10,输入值为 x = [ 0.0000 , 0.1000 , 0.2000 , 0.3000 , 0.4000 , 0.5000 , 0.6000 , 0.7000 , 0.8000 , 0.9000 ] x=[0.0000, 0.1000, 0.2000, 0.3000, 0.4000, 0.5000, 0.6000, 0.7000, 0.8000, 0.9000] x=[0.0000,0.1000,0.2000,0.3000,0.4000,0.5000,0.6000,0.7000,0.8000,0.9000] S i g m o i d Sigmoid Sigmoid函数的输出值为 s i g m o d = [ 0.5000 , 0.5250 , 0.5498 , 0.5744 , 0.5987 , 0.6225 , 0.6457 , 0.6682 , 0.6900 , 0.7109 ] sigmod = [0.5000, 0.5250, 0.5498, 0.5744, 0.5987, 0.6225, 0.6457, 0.6682, 0.6900,0.7109] sigmod=[0.5000,0.5250,0.5498,0.5744,0.5987,0.6225,0.6457,0.6682,0.6900,0.7109] S o f t m a x Softmax Softmax函数的输出值为 s o f t m a x = [ 0.0612 , 0.0676 , 0.0748 , 0.0826 , 0.0913 , 0.1009 , 0.1115 , 0.1233 , 0.1362 , 0.1505 ] softmax = [0.0612, 0.0676, 0.0748, 0.0826, 0.0913, 0.1009, 0.1115, 0.1233, 0.1362,0.1505] softmax=[0.0612,0.0676,0.0748,0.0826,0.0913,0.1009,0.1115,0.1233,0.1362,0.1505]

  可以看出, S o f t m a x Softmax Softmax函数的10个输出值之和为 1 1 1 S i g m o i d Sigmoid Sigmoid函数的10个输出值之和不为 1 1 1,且都在 [ 0 , 1 ] [0,1] [0,1]之间。

5、总结

  • 如果模型的输出为非互斥类别,可选用 S i g m o i d Sigmoid Sigmoid函数计算该网络的输出

  • 如果模型的输出为互斥类别,则选用 S o f t m a x Softmax Softmax函数计算该网络的输出

  • 对于某个分类场景,如果能使用 S o f t m a x Softmax Softmax的话,则一定能使用 S i g m o i d Sigmoid Sigmoid

你可能感兴趣的:(python,机器学习,开发语言)