如何在Python中实现Softmax函数


问题内容

Udacity的深度学习类中,y_i的softmax只是指数除以整个Y向量的指数和:

在此处输入图片说明

其中S(y_i)的softmax函数为y_ie为指数,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)替换为任何变量,它将被抵消。