Softmax函数原理及Python实现过程解析

许南星
许南星
发布时间:2026-10-13 | 2人浏览过
原创

本文深入解析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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表