激活函数篇(3):Softmax
Softmax是一种常用在多分类问题中的激活函数,主要作用是将一个实数向量“压缩”映射为一个概率分布,使得输出各项都是(0,1)之间的小数,且所有输出加起来为1。
假设有一个长度为n的向量z=[z1,z2,...,zn],softmax的第i个输出为:
e是自然对数的底数;
每个分量zi先取指数,再归一化,保证输出和为1。
为什么要使用指数运算?
最大的zi经过指数运算后,其值会远大于其他项,因此最终概率最大。
归一化
所有分量加起来为1,可以直接解释为概率。常用在最后一层,用于神经网络的多分类任务。
代码实现
import numpy as npdef softmax(z):z = np.array(z) # 将输入参数 z 转换为 NumPy 数组z = z - np.max(z) # 对 z 的每个元素都减去 z 的最大值,目的是防止后面指数运算时溢出(提升数值稳定性)exp_z = np.exp(z) # 计算 z 每个元素的指数值return exp_z / np.sum(exp_z)logits = softmax([2.0,1.0,0.1])
print(logits)
为什么要减去z中的最大值再做指数运算?
如果zi比较大,exp(zi)也会非常大,计算机的浮点数表示有其最大值限制。当
exp(z_i)
超过这个限制时,就会发生溢出,导致结果变为inf
(无穷大)。通过减去
z
中的最大值,将所有的输入值平移到一个新的范围(最大值为0,其他值小于0),从而确保在后续的指数运算中,exp(z)
的结果不会因为数值过大而溢出,同时又不会改变 Softmax 函数的最终输出结果。