【发布时间】:2016-04-27 22:32:56
【问题描述】:
在回顾神经网络中使用的 Sigmoid 函数时,我们从https://en.wikipedia.org/wiki/Softmax_function#Softmax_Normalization 中找到了这个方程:
不同于标准的 sigmoid 方程:
上面的第一个方程以某种方式涉及平均值和标准偏差(我希望我没有读错符号),而第二个方程概括了负均值并除以标准偏差作为常数,因为它在所有术语中都是相同的在向量/矩阵/张量内。
所以在实施方程式时,我会得到不同的结果。
使用第二个方程(标准 sigmoid 函数):
def sigmoid(x):
return 1. / (1 + np.exp(-x))
我得到这些输出:
>>> x = np.array([1,2,3])
>>> print sigmoid(x)
[ 0.73105858 0.88079708 0.95257413]
我希望第一个函数是相似的,但是第一个和第二个元素之间的差距扩大了很多(尽管元素的排名保持不变:
def get_statistics(x):
n = float(len(x))
m = x.sum() / n
s2 = sum((x - m)**2) / (n-1.)
s = s2**0.5
return m, s2, s
m, s, s2 = get_statistics(x)
sigmoid_x1 = 1 / (1 + np.exp(-(x[0] - m) / s2))
sigmoid_x2 = 1 / (1 + np.exp(-(x[1] - m) / s2))
sigmoid_x3 = 1 / (1 + np.exp(-(x[2] - m) / s2))
sigmoid_x1, sigmoid_x2, sigmoid_x3
[出]:
(0.2689414213699951, 0.5, 0.7310585786300049)
这可能与第一个方程包含某种 softmax 归一化这一事实有关,但如果它是通用的 softmax,那么元素需要这样求和:
def softmax(x):
exp_x = np.exp(x)
return exp_x / exp_x.sum()
[出]:
>>> x = np.array([1,2,3])
>>> print softmax(x)
[ 0.09003057 0.24472847 0.66524096]
但第一个方程的输出总和不等于 1,并且与标准 sigmoid 方程不相似/相同。所以问题是:
- 我是否错误地实现了方程 1 的函数?
- 维基百科页面上的公式 1 是否错误?还是它指的是其他东西,而不是真正的 sigmoid/logistic 函数?
- 为什么第一个和第二个等式有区别?
【问题讨论】:
-
编辑了我的答案,希望这个例子有所帮助。
-
为什么要加赏金?你缺少什么来接受我或 Marcins 的回答?
-
是为了从不同的角度得到更多的答案或解释。不要担心你的答案应该是赢得复选标记和/或赏金。除非有人想出一个更出色的答案;P
标签: python math neural-network logistic-regression softmax