0

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

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

1 回答 1

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 初始化方案更好地初始化权重,或者简单地将它们初始化为较小的值,例如在 [-.01,.01] 范围内。基本上,您可以缩放随机初始化,以便您的输出处于良好的值范围内,而不是一些巨大或极小的数字。你当然也可以两者兼得。

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

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

于 2018-05-21T16:18:15.187 回答