ReLU 可以代替神经网络中的 Sigmoid 激活函数吗

数据挖掘 Python 神经网络
2022-02-15 12:34:48

我是新手,我正在尝试用 ReLU 替换以下简单 NN 中的 sigmoid 激活函数。我可以这样做吗?我试过替换 sigmoid 函数,但它不起作用。输出应该是与门(如果输入(0,0)-> 输出 0)。

import numpy as np

 # sigmoid function
def nonlin(x, deriv=False):
   if(deriv == True):
       return x*(1-x)
   return 1/(1+np.exp(-x))

# input dataset
X = np.array([[0, 0],
          [0, 1],
          [1, 0],
          [1, 1]])

# output dataset            
y = np.array([[0, 0, 0, 1]]).T

# seed random numbers to make calculation
# deterministic (just a good practice)
np.random.seed(1)

# initialize weights randomly with mean 0
syn0 = 2*np.random.random((2, 1)) - 1

for iter in xrange(10000):
    # forward propagation
    l0 = X
    l1 = nonlin(np.dot(l0,syn0))

    # how much did we miss?
    l1_error = y - l1

    l1_delta = l1_error * nonlin(l1, True)

    syn0 += np.dot(l0.T,l1_delta)
1个回答

要直接回答您的问题,的,您可以将sigmoid激活函数替换为ReLU激活函数。

我认为真正的问题是“你应该吗?” 这是一个更难回答的问题。

sigmoid函数返回一个介于 0 和 1 之间的数字,但函数的路径从不恒定,在接近 0 和 1 时减速,并在输入值为 0 时在 0.5 处达到峰值。

另一方面,ReLU对于小于 0 的输入值,该函数返回 0,而对于大于 0 的输入值,该函数返回介于 0 和 1 之间的值。

因此,sigmoid的最低极值处返回 0 对于的最大值,“理论上”将返回值 1。基于正态分布的变量,您不会期望经常看到 0 或 1。xxx

对于该ReLU函数,该函数返回 0 的可能性没有任何理论意义。它将为大约一半的输入值返回 0。

还有一点,激活函数绝对可以改变神经网络的行为,但是选择不当的激活函数不一定会阻止 NN 收敛,但它可能需要不同的模型架构,并且可能会使其更难训练。

在这一点上,社区似乎依靠启发式和经验评估来选择一个函数而不是另一个函数。某些模式似乎被社区接受为某些领域的一般经验法则。还有一些模式被很好地接受为唯一有效的模式。例如,当使用softmax激活函数确定输出时,通常认为前面的隐藏层必须使用该sigmoid函数。

我的猜测是,大多数从业者都是从sigmoid激活函数开始的,除非有领域知识暗示它不合适,但我希望在模型选择期间评估许多不同的架构。