当前位置:首页>python>【Python 小练习】从零实现深度学习核心函数:Softmax

【Python 小练习】从零实现深度学习核心函数:Softmax

  • 2026-10-10 03:11:54
【Python 小练习】从零实现深度学习核心函数:Softmax

在深度学习的分类任务中,Softmax 函数是当之无愧的 “核心选手”—— 它能将一组任意实数转换为 0 到 1 之间的概率分布,让模型输出的结果具备概率解释性。本文将从数学公式出发,手把手教你用 Python 实现 Softmax 函数,理解其背后的计算逻辑。

一、Softmax 函数的数学原理

1. 公式定义

对于一个长度为n的向量 V=[v1,v2,...,vn],其中任意元素vi经过 Softmax 变换后的结果为:

编辑

2. 核心作用

  • 非负化
    :通过指数函数ex将所有输入值转换为非负数;
  • 归一化
    :除以所有项的指数和,使最终结果之和为 1(满足概率分布的基本要求);
  • 缓解 “绝对优势” 问题
    :不会让数值大的元素完全 “压制” 小元素,而是以概率形式体现优先级(比如输入 [1,3],Softmax 后不是 [0,1],而是 [0.1192, 0.8808],小值仍有被选中的可能)。

二、Python 实现 Softmax 函数

1. 完整代码实现

结合 NumPy(科学计算必备库),我们将公式直接转化为可运行的代码,同时修复原代码片段中的语法错误(如赋值符号、缩进、模块导入等):

python

运行

import numpy as npimport mathdef softmax(inMatrix):    """    计算Softmax函数    参数:        inMatrix: numpy矩阵/数组,形状为 (1, n) 的行向量    返回:        outMatrix: 经过Softmax归一化后的概率分布矩阵    """    # 获取输入矩阵的形状(m行n列)    m, n = np.shape(inMatrix)    # 初始化输出矩阵,形状与输入一致,初始值为0    outMatrix = np.mat(np.zeros((m, n)))    # 存储所有指数值的和(用于归一化)    soft_sum = 0    # 第一步:计算每个元素的指数值,并累加求和    for idx in range(n):        outMatrix[0, idx] = math.exp(inMatrix[0, idx])  # 对每个元素取e的指数        soft_sum += outMatrix[0, idx]                   # 累加所有指数值    # 第二步:归一化,每个指数值除以总和,得到概率    for idx in range(n):        outMatrix[0, idx] = outMatrix[0, idx] / soft_sum    return outMatrix# 测试代码if __name__ == "__main__":    # 定义输入数组(对应题目中的 [1,2,1,2,1,1,3])    a = np.array([[1, 2, 1, 2, 1, 1, 3]])    # 计算Softmax    result = softmax(a)    # 输出结果    print("输入向量:", a)    print("Softmax结果:\n", result)    print("结果求和验证(应为1):", np.sum(result))

2. 代码关键解析

  • np.shape(inMatrix)
    :获取输入矩阵的维度(这里输入是 1 行 7 列,所以 m=1,n=7);
  • math.exp()
    :计算自然指数ex,实现 “非负化”;
  • 第一个循环:先计算所有元素的指数值,并累加得到总和soft_sum;
  • 第二个循环:将每个指数值除以总和,完成 “归一化”,得到概率分布;
  • np.mat()
    :将数组转换为矩阵,方便按位置赋值(也可直接用数组实现)。

三、运行结果与分析

 结果解读

  • 输入中最大的数是 3,对应的 Softmax 概率最高(0.2303),但并没有 “独占” 所有概率;
  • 数值 2 对应的概率是 0.1924,数值 1 对应的概率是 0.0712;
  • 所有概率之和为 1,符合概率分布的定义;
  • 即使是较小的数值(如 1),也有一定的概率被选中,这正是 Softmax 解决 “绝对优势” 问题的体现。

四、进阶优化:向量化实现(可选)

上述循环实现虽然易懂,但效率较低。在实际项目中,我们通常用 NumPy 的向量化操作替代循环,代码更简洁、运行更快:

python

运行

def softmax_vectorized(inMatrix):    """向量化实现Softmax,效率更高"""    exp_vals = np.exp(inMatrix)  # 对整个矩阵逐元素取指数    soft_sum = np.sum(exp_vals)  # 计算指数和    return exp_vals / soft_sum   # 归一化# 测试向量化版本a = np.array([[1, 2, 1, 2, 1, 1, 3]])result_vec = softmax_vectorized(a)print("向量化实现结果:\n", result_vec)

输出结果与循环版本完全一致,但代码行数更少,且处理大规模数据时效率提升显著。

总结

  1. Softmax 函数的核心是指数化 + 归一化,能将任意实数向量转换为和为 1 的概率分布;
  2. Python 实现 Softmax 的关键是:先计算每个元素的自然指数,再除以所有指数的总和;
  3. 实际应用中优先使用 NumPy 向量化操作,替代循环以提升效率,同时保证结果的准确性。

最新文章

随机文章