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
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+e−x1
对于分类任务来说,假设有 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
此时 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+e−x11
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−(x1−x0)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=x1−x0,则与 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函数将目标分为一类。
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()
上例中,类别数 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]之间,这两个输出值分别表示“分到正确类别的概率和未分到正确类别的概率”。
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()
上例中,类别数 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]之间。
如果模型的输出为非互斥类别,可选用 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