Softmax函数

数学,尤其是概率论和相关领域中,Softmax函数,或称归一化指数函数[1]:198,是逻辑斯谛函数的一种推广。它能将一个含任意实数的K维向量  z {\displaystyle \mathbf {z} }  “压缩”到另一个K维实向量  σ ( z ) {\displaystyle \sigma (\mathbf {z} )}  中,使得每一个元素的范围都在 ( 0 , 1 ) {\displaystyle (0,1)} 之间,并且所有元素的和为1(也可視為一個 (k-1)維的hyperplane或subspace)。该函数的形式通常按下面的式子给出:

σ ( z ) j = e z j k = 1 K e z k {\displaystyle \sigma (\mathbf {z} )_{j}={\frac {e^{z_{j}}}{\sum _{k=1}^{K}e^{z_{k}}}}}    for j = 1, …, K.

Softmax函数实际上是有限项离散概率分布的梯度对数归一化。因此,Softmax函数在包括 多项逻辑回归[1]:206–209 ,多项线性判别分析朴素贝叶斯分类器人工神经网络等的多种基于機率的多分类问题方法中都有着广泛应用。[2] 特别地,在多项逻辑回归和线性判别分析中,函数的输入是从K个不同的線性函數得到的结果,而样本向量 x 属于第 j 个分类的機率为:

P ( y = j | x ) = e x T w j k = 1 K e x T w k {\displaystyle 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}}}}}

这可以被视作K个线性函数 x x T w 1 , , x x T w K {\displaystyle \mathbf {x} \mapsto \mathbf {x} ^{\mathsf {T}}\mathbf {w} _{1},\ldots ,\mathbf {x} \mapsto \mathbf {x} ^{\mathsf {T}}\mathbf {w} _{K}} Softmax函数的复合 x T w {\displaystyle \mathbf {x} ^{\mathsf {T}}\mathbf {w} } x {\displaystyle \mathbf {x} } w {\displaystyle \mathbf {w} } )。

实际实现的时候,为了防止溢出,会先把每个元素减去原先的最大值 m {\displaystyle m}

σ ( z ) i = e x i j e x j = e m e m e x i j e x j = e x i m j e x j m {\displaystyle \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}}}}

例子

输入向量 [ 1 , 2 , 3 , 4 , 1 , 2 , 3 ] {\displaystyle [1,2,3,4,1,2,3]} 对应的Softmax函数的值为 [ 0.024 , 0.064 , 0.175 , 0.475 , 0.024 , 0.064 , 0.175 ] {\displaystyle [0.024,0.064,0.175,0.475,0.024,0.064,0.175]} 。输出向量中拥有最大权重的项对应着输入向量中的最大值“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

參考資料

  1. ^ 1.0 1.1 Bishop, Christopher M. (2006).
  2. ^ ai-faq What is a softmax activation function? (页面存档备份,存于互联网档案馆
可微分计算
概论
概念
应用
硬件
  • TPU
  • VPU
  • IPU英语Graphcore
  • 憶阻器
  • SpiNNaker英语SpiNNaker
软件库
实现
视觉·语音
自然语言
决策
人物
组织
架构
  • 主题 主题
    • 计算机编程
    • 技术
  • 分类 分类
    • 人工神经网络
    • 机器学习