【问题标题】:Different Sigmoid Equations and its implementation不同的Sigmoid方程及其实现
【发布时间】: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


【解决方案1】:

你已经正确地实现了方程。您的问题是您混淆了 softmax 和 sigmoid 函数的定义。

softmax 函数是一种通过使异常值“不那么有趣”来标准化数据的方法。此外,它会“挤压”您的输入向量,以确保向量的总和为 1。

你的例子:

> np.sum([ 0.09003057,  0.24472847,  0.66524096])
> 1.0

它只是一个逻辑函数的泛化,带有额外的“约束”,以获取区间 (0, 1) 中向量的每个元素及其总和为 1.0。

sigmoid 函数是逻辑函数的另一个特例。它只是一个钟形的实值可微函数。神经网络很有趣,因为它很容易计算,非线性并且有正负边界,所以你的激活不能发散,但如果它变得“太高”就会进入饱和。

但是,sigmoid 函数不能确保输入向量的总和为 1.0。

在神经网络中,sigmoid 函数经常用作单个神经元的激活函数,而在输出层则使用 sigmoid/softmax 归一化函数,以确保整个层加起来为 1。你只是混淆了sigmoid 函数(针对单个神经元)与 sigmoid/softmax 归一化函数(针对整个层)。

编辑:为了澄清这一点,我会给你一个带有异常值的简单示例,它为你演示了两个不同函数的行为。

让我们实现一个 sigmoid 函数:

import numpy as np

def s(x):
    return 1.0 / (1.0 + np.exp(-x))

还有标准化版本(小步骤,更容易阅读):

def sn(x):
    numerator = x - np.mean(x)
    denominator = np.std(x)
    fraction = numerator / denominator

    return 1.0 / (1.0 + np.exp(-fraction))

现在我们定义一些具有巨大异常值的测量值:

measure = np.array([0.01, 0.2, 0.5, 0.6, 0.7, 1.0, 2.5, 5.0, 50.0, 5000.0])

现在我们看看s (sigmoid) 和sn (normalized sigmoid) 给出的结果:

> s(measure)
> array([ 0.50249998,  0.549834  ,  0.62245933,  0.64565631,  0.66818777,
    0.73105858,  0.92414182,  0.99330715,  1.        ,  1.        ])

> sn(measure)
> array([ 0.41634425,  0.41637507,  0.41642373,  0.41643996,  0.41645618,
    0.41650485,  0.41674821,  0.41715391,  0.42447515,  0.9525677 ])

如您所见,s 仅通过逻辑函数“逐个”转换值,因此异常值完全饱和为 0.999、1.0、1.0。其他值之间的距离各不相同。

当我们查看sn 时,我们看到该函数实际上标准化了我们的值。现在一切都非常相同,除了 0.95 是 5000.0。

这有什么用或如何解释?

想想神经网络中的一个输出层:在一个输出层的一个类中激活 5000.0(与我们的其他小值相比)意味着网络确实确定这是您给定的“正确”类输入。如果您在此处使用 s,您最终会得到 0.99、1.0 和 1.0,并且能够区分哪个类是您输入的正确猜测。

【讨论】:

  • 谢谢,我明白 softmax 和 sigmoid 的区别,但是为什么 sigmoid 有两个不同的方程?
  • 只是为了和你核对一下你答案中的最后一句话,sigmoid函数和sigmoid归一化函数有什么不同?还是他们使用相同的标准 sigmoid 函数?
  • 是的,它们是不同的。 sigmoid 函数一次计算一个元素的 1/(1+e^(-x),而归一化计算 1/(1+e^(-((x_i ) - mean(x))/std(x)) . 因此,第一个计算向量中每个元素的“单个”操作,而后者总是考虑均值和标准差。
  • 感谢@ascentor,现在这个例子显示了明显的区别!
  • 有趣的是,如果sigmoid() 非归一化饱和,那么边界不是[0,1] 而不是(0,1)?由于计算近似,它是否饱和?或者它真的会“自然地”饱和
【解决方案2】:

在这种情况下,您必须区分三件事:sigmoid 函数、具有 softmax 归一化的 sigmoid 函数和 softmax 函数。

  1. sigmoid 函数是一个实值函数,它由等式f(x) = 1 / (1 + exp(-x)) 简单给出。多年来,它被用于机器学习领域,因为它将真实输入压缩到 (0,1) 区间,这可能被解释为例如概率值。现在 - 许多专家建议不要使用它,因为它的饱和度和非零均值问题。你可以阅读它(只要如何处理问题,例如这里http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf)。
  2. 使用 softmax 归一化的 sigmoid 用于处理在使用 sigmoid 函数过程中可能出现的两个重要问题。首先是处理异常值(它将您的x 压缩为0 并使其sd = 1 使您的数据标准化),其次(在我看来更重要的是)是使不同的变量在进一步的分析。要理解这种现象,假设您有两个变量 ageincome,其中 age 从 20 到 70 不等,收入从 2000 到 60000 不等。如果没有规范化数据 - 这两个变量将通过 sigmoid 变换压缩为几乎一个.此外 - 由于更大的平均绝对值 - income 变量对于您的分析将更加重要,无需任何合理解释。
  3. 我认为,在理解 softmax 归一化方面,标准化比处理异常值更为重要。要理解为什么想象一个变量在 99% 的情况下等于 0 而在其他情况下等于 1。在这种情况下,您的 sd ~ 0.01mean ~ 0 和 softmax 归一化将超出 1 甚至更多。
  4. 完全不同的是 softmax 函数。 softmax 函数是从R^kR^k 的数学转换,它将实值向量压缩为相同大小的正值向量,总和为1。它由等式softmax(v) = exp(v)/sum(exp(v)) 给出。它与 softmax 归一化完全不同,通常用于多类分类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2021-05-05
    • 2018-10-20
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多