【问题标题】:How Precise Does an Activation Function Need to Be and How Large Will Its Inputs Be?激活函数需要有多精确,其输入需要多大?
【发布时间】:2017-02-03 04:29:48
【问题描述】:

我正在用 Java 编写一个基本的神经网络,并且正在编写激活函数(目前我刚刚编写了 sigmoid 函数)。我正在尝试使用doubles(与BigDecimal相对),希望培训实际上需要合理的时间。但是,我注意到该函数不适用于较大的输入。目前我的功能是:

public static double sigmoid(double t){

    return (1 / (1 + Math.pow(Math.E, -t)));

}

这个函数返回相当精确的值直到t = -100,但是当t >= 37 函数返回1.0在典型的神经网络中,当输入被归一化时这样可以吗?神经元会得到总和超过 37 的输入吗?如果输入到激活函数的输入总和的大小从 NN 到 NN 不同,影响它的因素有哪些? 另外,有没有办法让这个函数更精确?有没有更精确和/或更快的替代方法?

【问题讨论】:

    标签: java machine-learning neural-network sigmoid activation-function


    【解决方案1】:

    令人惊讶的答案是 double 实际上比您需要的更精确。 This blog article by Pete Warden 声称即使是 8 位也足够精确。不仅仅是一个学术理念:NVidia 的新 Pascal 芯片强调其单精度性能高于一切,因为这对深度学习训练很重要。

    您应该标准化您的输入神经元值。如果仍然出现极值,则可以将它们设置为 -1 或 +1。事实上,this answer 明确表示这样做。 (关于这个问题的其他答案也很有趣——建议只预先计算 100 个左右的值,而根本不使用 Math.exp()Math.pow()!)

    【讨论】:

      【解决方案2】:

      是的,在标准化网络中使用 double 是可以的。但这取决于您的输入,如果您的输入层更大,您的输入总和当然会更大。

      我在使用 C++ 时遇到了同样的问题,在 t 变大之后,编译器/rte 甚至不考虑 E^-t 并返回纯 1,因为它只计算 1/1 部分。我试图将已经标准化的输入除以 1000-1000000,它有时会起作用,但有时它不起作用,因为我在第一个时期使用随机输入,而我的输入层是一个 784x784 的矩阵。不过,如果您的输入层很小,并且您的输入已标准化,这将对您有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-13
        • 2015-04-17
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        • 2016-07-28
        • 2020-10-19
        • 2011-04-16
        相关资源
        最近更新 更多