根据Udacity的深度学习课程,y_i
的Softmax函数只是指数除以整个Y向量的指数和:
其中S(y_i)
是y_i
的Softmax函数,e
是指数,j
是输入向量Y的列数。
我尝试了以下方法:
import numpy as npdef 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)
尽管第一个实现明确地取每个列与最大值的差,然后除以总和,但它产生了与第一个实现相同的输出。
能否有人从数学上解释为什么?一个是正确的,另一个是错误的吗?
这两个实现的代码和时间复杂度是否相似?哪个更有效?
回答:
它们都是正确的,但从数值稳定性的角度来看,你的实现更受欢迎。
你从以下开始:
e ^ (x - max(x)) / sum(e^(x - max(x))
利用a^(b – c) = (a^b)/(a^c)的事实,我们有
= e ^ x / (e ^ max(x) * sum(e ^ x / e ^ max(x)))= e ^ x / sum(e ^ x)
这正是另一个答案所说的。你可以用任何变量替换max(x),它都会抵消掉。