2

relu 激活函数不包含导数这一事实有什么影响?

如何在 Numpy 中实现 ReLU 函数将 relu 实现为(0 ,矩阵向量元素)的最大值。

这是否意味着对于梯度下降我们不采用 relu 函数的导数?

更新 :

来自使用 RELU 的神经网络反向传播

本文有助于理解:

ReLU 函数定义为: 对于 x > 0,输出为 x,即 f(x) = max(0,x)

所以对于导数 f '(x) 它实际上是:

如果 x < 0,则输出为 0。如果 x > 0,则输出为 1。

导数 f'(0) 没有定义。因此它通常设置为 0,或者您将激活函数修改为 f(x) = max(e,x) 以获得较小的 e。

一般来说:一个 ReLU 是一个使用 rectifier 激活函数的单元。这意味着它的工作原理与任何其他隐藏层完全相同,但除了 tanh(x)、sigmoid(x) 或您使用的任何激活之外,您将改为使用 f(x) = max(0,x)。

如果您已经为具有 sigmoid 激活功能的多层网络编写了代码,那么这实际上是 1 行更改。前向或反向传播在算法上没有任何变化。如果您还没有使用更简单的模型,请先返回并从该模型开始。否则,您的问题实际上不是关于 ReLU,而是关于整体实现 NN。

但这仍然会留下一些混乱,因为神经网络成本函数通常需要激活函数的导数,那么对于 relu,这对成本函数有何影响?

4

1 回答 1

2

标准答案是 ReLU 的输入很少完全为零,例如,请参见此处,因此它不会产生任何显着差异。

具体来说,要使 ReLU 获得零输入,输入的一整行到具有该层权重矩阵的一整列的层的点积必须完全为零。即使您有一个全零输入样本,最后一个位置仍然应该有一个偏差项,所以我真的看不到这种情况发生。

但是,如果您想自己测试,请尝试将零处的导数实现为0, 0.5,1并查看是否有任何变化。

PyTorch 文档给出了一个简单的神经网络,带有一个隐藏层和 relu 激活的 numpy 示例。我在下面用一个固定的随机种子和三个将 ReLU 梯度的行为设置为 0 的选项复制了它。我还添加了一个偏差项。

N, D_in, H, D_out = 4, 2, 30, 1

# Create random input and output data
x = x = np.random.randn(N, D_in)
x = np.c_(x, no.ones(x.shape[0]))
y = x = np.random.randn(N, D_in)

np.random.seed(1)

# Randomly initialize weights
w1 = np.random.randn(D_in+1, H)
w2 = np.random.randn(H, D_out)

learning_rate = 0.002
loss_col = []
for t in range(200):
    # Forward pass: compute predicted y
    h = x.dot(w1)
    h_relu = np.maximum(h, 0)  # using ReLU as activate function
    y_pred = h_relu.dot(w2)

    # Compute and print loss
    loss = np.square(y_pred - y).sum() # loss function
    loss_col.append(loss)
    print(t, loss, y_pred)

    # Backprop to compute gradients of w1 and w2 with respect to loss
    grad_y_pred = 2.0 * (y_pred - y) # the last layer's error
    grad_w2 = h_relu.T.dot(grad_y_pred)
    grad_h_relu = grad_y_pred.dot(w2.T) # the second laye's error 
    grad_h = grad_h_relu.copy()        
    grad_h[h < 0] = 0  # grad at zero = 1
    # grad[h <= 0] = 0 # grad at zero = 0
    # grad_h[h < 0] = 0; grad_h[h == 0] = 0.5 # grad at zero = 0.5
    grad_w1 = x.T.dot(grad_h)

    # Update weights
    w1 -= learning_rate * grad_w1
    w2 -= learning_rate * grad_w2
于 2017-11-30T22:16:55.203 回答