Softmax函数
在数学,尤其是概率论和相关领域中,Softmax函数,或称归一化指数函数[1]:198,是逻辑斯谛函数的一种推广。它能将一个含任意实数的K维向量 <math>\mathbf{z}</math> “压缩”到另一个K维实向量 <math>\sigma(\mathbf{z})</math> 中,使得每一个元素的范围都在<math>(0, 1)</math>之间,并且所有元素的和为1(也可视为一个 (k-1)维的hyperplane或subspace)。该函数的形式通常按下面的式子给出:
- <math>\sigma(\mathbf{z})_j = \frac{e^{z_j}}{\sum_{k=1}^K e^{z_k}}</math> for j = 1, …, K.
Softmax函数实际上是有限项离散概率分布的梯度对数归一化。因此,Softmax函数在包括 多项逻辑回归[1]:206–209 ,多项线性判别分析,朴素贝叶斯分类器和人工神经网络等的多种基于概率的多分类问题方法中都有着广泛应用。[2] 特别地,在多项逻辑回归和线性判别分析中,函数的输入是从K个不同的线性函数得到的结果,而样本向量 x 属于第 j 个分类的概率为:
- <math>P(y=j|\mathbf{x}) = \frac{e^{\mathbf{x}^\mathsf{T}\mathbf{w}_j}}{\sum_{k=1}^K e^{\mathbf{x}^\mathsf{T}\mathbf{w}_k}}</math>
这可以被视作K个线性函数<math>\mathbf{x} \mapsto \mathbf{x}^\mathsf{T}\mathbf{w}_1, \ldots, \mathbf{x} \mapsto \mathbf{x}^\mathsf{T}\mathbf{w}_K</math>Softmax函数的复合(<math>\mathbf{x}^\mathsf{T}\mathbf{w}</math><math>\mathbf{x}</math><math>\mathbf{w}</math>)。
实际实现的时候,为了防止溢出,会先把每个元素减去原先的最大值<math>m</math>。
- <math>\sigma(\mathbf{z})_i = \frac{e^{x_i}}{\sum_j e^{x_j}} = \frac{e^{-m}}{e^{-m}}\frac{e^{x_i}}{\sum_j e^{x_j}}= \frac{e^{x_i-m}}{\sum_j e^{x_j-m}}</math>
例子[编辑]
输入向量<math>[1,2,3,4,1,2,3]</math>对应的Softmax函数的值为<math>[0.024, 0.064, 0.175, 0.475, 0.024, 0.064, 0.175]</math>。输出向量中拥有最大权重的项对应着输入向量中的最大值“4”。这也显示了这个函数通常的意义:对向量进行归一化,凸显其中最大的值并抑制远低于最大值的其他分量。
下面是使用Python进行函数计算的示例代码:
import math
z = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0]
z_exp = [math.exp(i) for i in z]
print(z_exp) # Result: [2.72, 7.39, 20.09, 54.6, 2.72, 7.39, 20.09]
sum_z_exp = sum(z_exp)
print(sum_z_exp) # Result: 114.98
softmax = [round(i / sum_z_exp, 3) for i in z_exp]
print(softmax) # Result: [0.024, 0.064, 0.175, 0.475, 0.024, 0.064, 0.175]
Python使用numpy计算的示例代码:
import numpy as np
z = np.array([1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0])
print(np.exp(z)/sum(np.exp(z)))
Julia 的示例:
julia> A = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0]
7-element Array{Float64,1}:
1.0
2.0
3.0
4.0
1.0
2.0
3.0
julia> exp.(A) ./ sum(exp.(A))
7-element Array{Float64,1}:
0.0236405
0.0642617
0.174681
0.474833
0.0236405
0.0642617
0.174681