x 的 Sigmoid 为 1
Sigmoid of x is 1
我刚刚读了 "Make your own neural network" 本书。现在我正在尝试在 Python 中创建 NeuralNetwork class。我使用 sigmoid 激活函数。我编写了基本代码并尝试对其进行测试。但是我的实现根本无法正常工作。经过长时间的调试和与书中代码的比较后,我发现非常大的 sigmoid 是 1,因为 Python 对它进行了舍入。我使用 numpy.random.rand()
生成权重,此函数 returns 仅从 0 到 1 的值。在对权重和输入的所有乘积求和后,我得到一个非常大的数字。我用 numpy.random.normal()
函数解决了这个问题,该函数从范围内生成随机数,例如 (-1, 1)。但是我有一些问题。
- sigmoid 激活函数好吗?
- node的输出还是那么大,Python四舍五入到1,sigmoid做不到怎么办?
- 如何防止Python舍入非常接近整数的浮点数
- 对我这个神经网络初学者的任何建议(书籍、技术等)。
这个问题的答案显然取决于上下文。 "good" 是什么意思。 sigmoid 激活函数将导致输出介于 0 和 1 之间。因此,它们是二进制 classification 的标准输出激活,您希望神经网络输出介于 0 和 1 之间的数字 - 输出为解释为您的输入在指定 class 中的概率。但是,如果您在整个神经网络(即也在中间层)中使用 sigmoid 激活函数,您可能会考虑切换到 RELU 激活函数。从历史上看,S 形激活函数在整个神经网络中被用作引入非线性的一种方式,因此神经网络可以做的不仅仅是近似线性函数。然而,人们发现 sigmoid 激活严重受到梯度消失问题的影响,因为该函数远离 0 非常平坦。因此,如今,大多数中间层将使用 RELU 激活函数(或更奇特的东西 - 例如 SELU/Leaky RELU/etc.) RELU 激活函数对于小于 0 的输入为 0,对于大于 0 的输入等于输入。它被发现足以将非线性引入神经网络。
通常,您不希望处于输出太大或太小以至于计算不稳定的状态。如前所述,帮助解决此问题的一种方法是使用不同的激活函数(例如 RELU)。帮助解决这个问题的另一种方法,也许甚至是更好的方法是使用例如更好地初始化权重。 Xavior-Glorot initialization 方案或简单地将它们初始化为较小的值,例如在 [-.01,.01] 范围内。基本上,您缩放随机初始化,以便您的输出在一个很好的值范围内,而不是一些巨大或微小的数字。你当然也可以两者都做。
您可以使用更高精度的浮点数来使 python 保留更多的小数位。例如。您可以使用 np.float64 而不是 np.float32...但是,这会增加计算的复杂性并且可能没有必要。今天的大多数神经网络都使用 32 位浮点数,并且它们工作得很好。请参阅第 1 点和第 2 点以获得解决问题的更好替代方案。
这个问题太笼统了。我想说,Andrew Ng 教授的 coursera 课程和专业化是我在学习神经网络方面最强烈的推荐。
我刚刚读了 "Make your own neural network" 本书。现在我正在尝试在 Python 中创建 NeuralNetwork class。我使用 sigmoid 激活函数。我编写了基本代码并尝试对其进行测试。但是我的实现根本无法正常工作。经过长时间的调试和与书中代码的比较后,我发现非常大的 sigmoid 是 1,因为 Python 对它进行了舍入。我使用 numpy.random.rand()
生成权重,此函数 returns 仅从 0 到 1 的值。在对权重和输入的所有乘积求和后,我得到一个非常大的数字。我用 numpy.random.normal()
函数解决了这个问题,该函数从范围内生成随机数,例如 (-1, 1)。但是我有一些问题。
- sigmoid 激活函数好吗?
- node的输出还是那么大,Python四舍五入到1,sigmoid做不到怎么办?
- 如何防止Python舍入非常接近整数的浮点数
- 对我这个神经网络初学者的任何建议(书籍、技术等)。
这个问题的答案显然取决于上下文。 "good" 是什么意思。 sigmoid 激活函数将导致输出介于 0 和 1 之间。因此,它们是二进制 classification 的标准输出激活,您希望神经网络输出介于 0 和 1 之间的数字 - 输出为解释为您的输入在指定 class 中的概率。但是,如果您在整个神经网络(即也在中间层)中使用 sigmoid 激活函数,您可能会考虑切换到 RELU 激活函数。从历史上看,S 形激活函数在整个神经网络中被用作引入非线性的一种方式,因此神经网络可以做的不仅仅是近似线性函数。然而,人们发现 sigmoid 激活严重受到梯度消失问题的影响,因为该函数远离 0 非常平坦。因此,如今,大多数中间层将使用 RELU 激活函数(或更奇特的东西 - 例如 SELU/Leaky RELU/etc.) RELU 激活函数对于小于 0 的输入为 0,对于大于 0 的输入等于输入。它被发现足以将非线性引入神经网络。
通常,您不希望处于输出太大或太小以至于计算不稳定的状态。如前所述,帮助解决此问题的一种方法是使用不同的激活函数(例如 RELU)。帮助解决这个问题的另一种方法,也许甚至是更好的方法是使用例如更好地初始化权重。 Xavior-Glorot initialization 方案或简单地将它们初始化为较小的值,例如在 [-.01,.01] 范围内。基本上,您缩放随机初始化,以便您的输出在一个很好的值范围内,而不是一些巨大或微小的数字。你当然也可以两者都做。
您可以使用更高精度的浮点数来使 python 保留更多的小数位。例如。您可以使用 np.float64 而不是 np.float32...但是,这会增加计算的复杂性并且可能没有必要。今天的大多数神经网络都使用 32 位浮点数,并且它们工作得很好。请参阅第 1 点和第 2 点以获得解决问题的更好替代方案。
这个问题太笼统了。我想说,Andrew Ng 教授的 coursera 课程和专业化是我在学习神经网络方面最强烈的推荐。