【问题标题】:Sigmoid function for large numbers in PythonPython中大数的Sigmoid函数
【发布时间】:2016-11-26 23:55:55
【问题描述】:

我正在使用Sigmoid 激活函数执行神经网络任务。我的网络输入是图像(MNIST 数据集),因为每个图像的维度是28*28,当我必须将它们转换为向量时,我将拥有N*784 矩阵。将这个大矩阵与权重矩阵相乘会产生大的权重正数和负数,我必须将它们传递给Sigmoid 函数。我使用expit() 作为 sigmoid 函数,我的问题是:

直到 30 的数字在 expit() 中接近 1。例如expit(28) 结果0.99999999expit(29) 结果1.0 和上29 也得到1。但是我的新人在30 较高,因此在第一个学习周期中他们中的一些人得到1 和一些0,实际上根本没有任何学习。

我必须做什么? Sigmoid's 上限是29?我不能改变它吗?我必须改变我的图像尺寸来克服这个问题?

【问题讨论】:

  • 你使用的是哪个版本的 scipy? expit 在 0.14 (github.com/scipy/scipy/issues/3385) 之前数值不稳定
  • 不知道,前两天我是通过pip安装的。
  • 检查 python -c 'import scipy; print(scipy.__version__)' 我假设你使用的是 scipy 的 expit,对吧?
  • 退出版本为:0.18.1。我的主要问题是,例如,当 1000*1000 numpy 矩阵相乘时,结果可能很大,而这些大数字对 sigmoid 函数没有用。我不知道我必须做什么。现在我将结果除以 1000 并使用它们。但我不知道有多合理和有效。似乎没有人在网络上遇到过这个问题!
  • 您的问题是关于数值稳定性的,这就是我要回答的问题。但你是对的,sigmoid 在这种情况下不是很有用。这就是人们不使用它的原因,因此您在网上找到解决方案时遇到问题:)。改用交叉熵怎么样?使用 sigmoid,您将不可避免地在任何有限精度计算中遇到“1”。

标签: python matrix machine-learning neural-network sigmoid


【解决方案1】:

正如 cmets 部分所讨论的,真正的问题原来是使用 sigmoid 本身,它不适合这种情况。在任何有限精度计算中,都会遇到上述问题,一个系统有 29 个,另一个有 38 个。

解决问题的一种方法是使用softmax 激活函数,它不太容易受到此类问题的影响。请注意,使用成本函数您可能会遇到类似的挑战。

有点偏离主题,但您可能想检查问题是如何解决的,例如tensorflow。它为初学者提供了一些不错的教程。

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 2017-10-08
    • 2018-10-20
    • 2019-07-01
    • 2020-06-29
    • 2013-07-14
    • 2017-01-05
    • 2018-06-06
    • 2016-12-05
    相关资源
    最近更新 更多