softmax实现

本文详细介绍了Softmax函数的原理及其在计算机科学领域的应用。主要内容包括Softmax函数如何将实数向量转换为概率分布,其数学特性,以及如何在Python中实现数值稳定的Softmax计算。此外还提供了一个改进的实现方法,确保了即使输入非常大的数值也能得到正确的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:https://segmentfault.com/a/1190000010039529

Softmax

softmax函数将任意n维的实值向量转换为取值范围在(0,1)之间的n维实值向量,并且总和为1。
例如:向量softmax([1.0, 2.0, 3.0]) ------> [0.09003057, 0.24472847, 0.66524096]

性质:

  1. 因为softmax是单调递增函数,因此不改变原始数据的大小顺序。
  2. 将原始输入映射到(0,1)区间,并且总和为1,常用于表征概率。
  3. softmax(x) = softmax(x+c), 这个性质用于保证数值的稳定性。

softmax的实现及数值稳定性

一个最简单的计算给定向量的softmax的实现如下:

import numpy as np
def softmax(x):
"""Compute the softmax of vector x."""
    exp_x = np.exp(x)
    softmax_x = exp_x / np.sum(exp_x)
    return softmax_x 

让我们来测试一下上面的代码:

softmax([1, 2, 3])
array([0.09003057, 0.24472847, 0.66524096])

但是,当我们尝试输入一个比较大的数值向量时,就会出错:

softmax([1000, 2000, 3000])
array([nan, nan, nan])

这是由numpy中的浮点型数值范围限制所导致的。当输入一个较大的数值时,sofmax函数将会超出限制,导致出错。
为了解决这一问题,这时我们就能用到sofmax的第三个性质,即:softmax(x) = softmax(x+c),
一般在实际运用中,通常设定c = - max(x)。
接下来,我们重新定义softmax函数:

import numpy as np
def softmax(x):
"""Compute the softmax in a numerically stable way."""
    x = x - np.max(x)
    exp_x = np.exp(x)
    softmax_x = exp_x / np.sum(exp_x)
    return softmax_x

然后再次测试一下:

softmax([1000, 2000, 3000])
array([ 0.,  0.,  1.])

Done!

以上都是基于向量上的softmax实现,下面提供了基于向量以及矩阵的softmax实现,代码如下:

import numpy as np
def softmax(x):
    """
    Compute the softmax function for each row of the input x.

    Arguments:
    x -- A N dimensional vector or M x N dimensional numpy matrix.

    Return:
    x -- You are allowed to modify x in-place
    """
    orig_shape = x.shape

    if len(x.shape) > 1:
        # Matrix
        exp_minmax = lambda x: np.exp(x - np.max(x))
        denom = lambda x: 1.0 / np.sum(x)
        x = np.apply_along_axis(exp_minmax,1,x)
        denominator = np.apply_along_axis(denom,1,x) 
        
        if len(denominator.shape) == 1:
            denominator = denominator.reshape((denominator.shape[0],1))
        
        x = x * denominator
    else:
        # Vector
        x_max = np.max(x)
        x = x - x_max
        numerator = np.exp(x)
        denominator =  1.0 / np.sum(numerator)
        x = numerator.dot(denominator)
    
    assert x.shape == orig_shape
    return x

### Softmax函数的实现 Softmax函数是一种常用的激活函数,在深度学习领域主要用于多分类问题中的概率分布转换。其核心思想是对输入向量进行指数变换并归一化,使得输出值落在0到1之间且总和为1。 #### Python实现Softmax函数 以下是基于Python语言使用NumPy库实现Softmax函数的方法: ```python import numpy as np def softmax(x): """ 计算Softmax函数的输出。 参数: x (numpy.ndarray): 输入数组 返回: numpy.ndarray: 转换后的Softmax结果 """ exp_x = np.exp(x - np.max(x)) # 减去最大值以防止数值溢出[^2] sum_exp_x = np.sum(exp_x, axis=-1, keepdims=True) # 对每行求和 y = exp_x / sum_exp_x # 归一化处理 return y ``` 上述代码中,`np.exp(x)` 进行了逐元素的指数运算,而 `np.sum()` 则实现了对每一行数据的加权求和操作。为了提高数值稳定性,通常会减去输入张量的最大值后再执行指数运算。 #### 数学原理说明 Softmax函数的核心公式如下所示: \[ y_i = \frac{e^{z_i}}{\sum_{j=1}^{N}{e^{z_j}}} \] 其中 \( z_i \) 表示输入向量中的第i个元素,\( N \) 是输入向量的长度。该公式的目的是将任意实数范围内的输入映射至(0,1),从而形成有效的概率分布[^1]。 #### 实现细节分析 在实际应用过程中需要注意以下几点: - **数值稳定性的优化**:为了避免因大数值引起的浮点溢出问题,建议预先从原始输入中扣除当前最大的那个值再做进一步计算[^3]。 - **维度匹配问题**:当面对高维矩阵作为输入参数时,应特别留意沿哪个轴方向完成累加动作以及保持原有形状不变的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值