【问题标题】:Sigmoid of x is 1x 的 Sigmoid 为 1
【发布时间】:2018-05-22 00:18:15
【问题描述】:

我刚刚阅读了“制作自己的神经网络”一书。现在我正在尝试在 Python 中创建 NeuralNetwork 类。我使用 sigmoid 激活函数。我编写了基本代码并尝试对其进行测试。但是我的实现根本无法正常工作。经过长时间的调试和与书中代码的比较后,我发现非常大的 sigmoid 是 1,因为 Python 将它四舍五入。我使用numpy.random.rand() 生成权重,此函数仅返回从 0 到 1 的值。将所有权重和输入的乘积相加后,我得到非常大的数字。我用numpy.random.normal() 函数解决了这个问题,该函数从范围(-1, 1) 中生成随机数。但我有一些问题。

  • sigmoid 是好的激活函数吗?
  • 如果node的输出仍然很大,Python将结果四舍五入为1,这对于sigmoid是不可能的怎么办?
  • 如何防止 Python 舍入非常接近整数的浮点数
  • 对于我作为神经网络初学者的任何建议(书籍、技术等)。

【问题讨论】:

  • 你用的是什么版本的python?你能举一个最终将float转换为int的操作示例吗?

标签: python neural-network sigmoid


【解决方案1】:
  1. 这个问题的答案显然取决于上下文。 “好”是什么意思。 sigmoid 激活函数将产生介于 0 和 1 之间的输出。因此,它们是二进制分类的标准输出激活,您希望神经网络输出介于 0 和 1 之间的数字 - 输出被解释为您的输入在指定的类中。但是,如果您在整个神经网络中使用 sigmoid 激活函数(即在中间层中也是如此),您可以考虑切换到RELU 激活函数。从历史上看,sigmoid 激活函数在整个神经网络中被用作引入非线性的一种方式,因此神经网络可以做的不仅仅是近似线性函数。然而,人们发现 sigmoid 激活严重受梯度消失问题的影响,因为该函数与 0 相差甚远。因此,如今,大多数中间层将使用 RELU 激活函数(或者更奇特的东西 - 例如 SELU/Leaky RELU /etc.) RELU 激活函数对于小于 0 的输入为 0,对于大于 0 的输入等于输入。已发现它足以将非线性引入神经网络。

  2. 通常,您不希望处于一个输出太大或太小以至于计算不稳定的状态。如前所述,帮助解决此问题的一种方法是使用不同的激活函数(例如 RELU)。帮助解决这个问题的另一种方法,也许是更好的方法是使用例如更好地初始化权重。 Xavior-Glorot initialization 方案或简单地将它们初始化为较小的值,例如在 [-.01,.01] 范围内。基本上,您可以缩放随机初始化,以便您的输出处于良好的值范围内,而不是一些巨大或极小的数字。你当然也可以两者兼得。

  3. 您可以使用更高精度的浮点数使 python 保留更多小数。例如。您可以使用 np.float64 而不是 np.float32 ...但是,这会增加计算复杂性并且可能没有必要。今天的大多数神经网络都使用 32 位浮点数,它们工作得很好。请参阅第 1 点和第 2 点,了解解决问题的更好方法。

  4. 这个问题过于宽泛。我想说,Andrew Ng 教授的 coursera 课程和专业化是我在学习神经网络方面最强烈的推荐。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多