Softmax函数原理及Python实现过程解析
本文深入解析Softmax函数的数学原理及其在分类任务中的作用,重点阐述如何通过平移不变性优化Python实现以解决数值溢出问题。文章提供完整的代码示例与测试用例,帮助开发者理解从理论到工程落地的关键细节。
Softmax函数原理
Softmax原理
Softmax函数的主要功能是将分类模型的原始输出归一化,转化为一个有效的概率分布。其作用机制与二分类问题中常用的Sigmoid函数类似,但适用于多分类场景。
假设输入为一个k维向量z,我们的目标是将其映射为包含k个类别的概率分布p(z)。Softmax函数正是实现这一转换的核心工具,其具体计算公式如下:

对于k维向量z,其中每个元素zi属于实数集R。通过指数函数变换,可以将任意实数值映射到正无穷区间(0, +∞)。随后,将所有元素的指数值求和并进行归一化处理,即可得到总和为1的概率分布。
需要注意的是,常见的其他归一化方法(如Max-Min归一化或Z-Score标准化)无法保证所有元素均为正数,也无法确保所有元素之和严格等于1,因此不适用于直接构建概率分布。
Softmax函数的关键性质
Softmax性质
Softmax函数具有平移不变性:当输入向量x加上任意常数c后,计算得到的Softmax结果保持不变。数学表达如下:

我们可以通过分析Softmax(x)第i个元素的计算过程来证明这一性质:

Python代码实现与测试
函数实现
由于指数函数具有极强的放大效应,如果直接按照原始公式实现Softmax,极易导致数值上溢(Overflow)。因此,在实际代码实现中,我们需要利用其平移不变性对输入数据进行预处理,然后再代入公式计算。具体步骤如下:

1. 找出输入向量x中的最大值c;
- 2. 将向量x的每个元素减去最大值c,得到新向量y = x - c;
- 3. 利用公式进行计算,即softmax(x) = softmax(x - c) = softmax(y)。
- 具体Python实现代码如下:
import numpy as np def softmax(x): """ softmax函数实现 参数: x --- 一个二维矩阵, m * n,其中m表示向量个数,n表示向量维度 返回: softmax计算结果 """ assert(len(X.shape) == 2) row_max = np.max(X, axis=axis).reshape(-1, 1) X -= row_max X_exp = np.exp(X) s = X_exp / np.sum(X_exp, axis=axis, keepdims=True) return s
import numpy as np
def softmax(x):
"""
softmax函数实现
参数:
x --- 一个二维矩阵, m * n,其中m表示向量个数,n表示向量维度
返回:
softmax计算结果
"""
assert(len(X.shape) == 2)
row_max = np.max(X, axis=axis).reshape(-1, 1)
X -= row_max
X_exp = np.exp(X)
s = X_exp / np.sum(X_exp, axis=axis, keepdims=True)
return s
接下来进行功能测试:
a = [[1,2,3],[-1,-2,-3]] b = [[1,2,3]] c = [1,2,3] a = np.array(a) b = np.array(b) c = np.array(c)
print(softmax(a)) print(softmax(b)) print(softmax(c)) # error
运行上述代码,输出结果如下:
[[ 0.09003057 0.24472847 0.66524096] [ 0.66524096 0.24472847 0.09003057]] [[ 0.09003057 0.24472847 0.66524096]] Traceback (most recent call last): assert(len(X.shape) == 2) AssertionError
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









