从 Udacity 的深度学习类 中,y_i 的 softmax 就是简单的指数除以整个 Y 向量的指数之和:
其中 S(y_i)
是—的softmax函数, y_i
e
是指数, j
输入向量 Y 中的列数。
我尝试了以下方法:
import numpy as np
def softmax(x):
"""Compute softmax values for each sets of scores in x."""
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum()
scores = [3.0, 1.0, 0.2]
print(softmax(scores))
返回:
[ 0.8360188 0.11314284 0.05083836]
但建议的解决方案是:
def softmax(x):
"""Compute softmax values for each sets of scores in x."""
return np.exp(x) / np.sum(np.exp(x), axis=0)
它产生 与第一个实现相同的输出,即使第一个实现显式地获取每列和最大值的差异,然后除以总和。
有人可以在数学上显示为什么吗?一个是对的,一个是错的吗?
实现在代码和时间复杂度方面是否相似?哪个更有效率?
原文由 alvas 发布,翻译遵循 CC BY-SA 4.0 许可协议
它们都是正确的,但从数值稳定性的角度来看,您更喜欢您的。
你从
通过使用 a^(b - c) = (a^b)/(a^c) 的事实,我们有
这是另一个答案所说的。您可以将 max(x) 替换为任何变量,它会取消。