如何在Python中实现Softmax函数
问题内容:
从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)
即使第一个实现显式地获取每列和最大值的差,然后除以总和,它会产生 与第一个实现相同的输出 。
有人可以从数学上说明为什么吗? 一个是正确的,另一个是错误的吗?
在代码和时间复杂度方面实现是否相似? 哪个更有效?
问题答案:
它们都是正确的,但是从数值稳定性的角度来看,您是首选。
你开始
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)替换为任何变量,它将被抵消。