softmax激活函数的两种表示方式
softmax函数的定义:
\[softmax(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{k} e^{x_j}}
\]
其中,\(x_i\)表示输入向量中的第\(i\)个元素,\(k\)是向量的长度。上式中的指数函数\(e^{x_i}\)计算了\(x_i\)的指数值,而分母\(\sum_{j=1}^{k} e^{x_j}\)计算了所有指数值的和。因此,softmax输出的概率值取决于输入向量中每个元素的指数值。
例如,在以下示例中:
x = np.array([1000, 2000, 3000])
y = np.exp(x) / np.sum(np.exp(x))
print(y) # Output: [0. 0. 1.]
可以看到,softmax输出的概率分布仅给出了一个非零值,即第三个元素,而其他元素的值接近于0,这表明数值不稳定。在没有减去最大值的情况下,某些输入向量的元素的指数值非常大,则这些元素的softmax输出概率将会非常接近1,而其他元素的输出概率则会非常接近0,这会导致数值不稳定。
但是,如果我们减去最大值,即:
x_minus_max = x - np.max(x)
y = np.exp(x_minus_max) / np.sum(np.exp(x_minus_max))
print(y)
# Output: [0. 0. 1.]
可以看到,在减去最大值后,softmax输出的概率分布与上面的示例相同,但是结果更为稳定。
等价的原因是,上下同时乘以x_max皆可以消去指数上的幂数。