找到最大值:
z 中找到最大值 max(z),以提升计算的数值稳定性。这是因为在计算指数时,较大的值可能导致溢出,因此需要进行归一化处理。计算指数:
这样可以确保所有的指数值均为非负且在稳定范围内。
计算指数和:
计算概率:
返回结果:
z 中每个元素对应的概率值。import math
from typing import List
class Solution:
def softmax(self, z: List[float]) -> List[float]:
"""
计算Softmax函数输出的概率分布向量
:param z: 输入向量
:return: 概率分布向量
"""
# 1. 找到输入向量的最大值
max_z = max(z)
# 2. 计算指数,使用最大值以提高数值稳定性
exp_values = [math.exp(x - max_z) for x in z]
# 3. 计算指数和
sum_exp = sum(exp_values)
# 4. 计算Softmax输出
return [x / sum_exp for x in exp_values]
给定输入向量:
z=[z1,z2,…,zn]⊤Softmax 的计算公式为:
$$\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}}$$为提升数值稳定性,通常使用如下等价形式:
$$\text{Softmax}(z_i)=\frac{e^{z_i - \max(z)}}{\sum_{j=1}^{n} e^{z_j - \max(z)}}$$Softmax 输出为概率分布向量:
p=[p1,p2,…,pn]⊤并满足:
i=1∑npi=1z:长度为 n 的输入向量p:长度为 n 的 Softmax 概率输出向量输入:
z = [1.0, 2.0, 0.0]
输出:
p = [0.2447, 0.6652, 0.0901]
输入范围: −100≤zi≤100
输出概率范围: 0≤pi≤1
Softmax 总和: ∑i=1npi=1
向量长度要求: n≥1