神经网络反向传播算法与RELU函数

43

我正在尝试使用RELU实现神经网络。

输入层-> 1个隐藏层-> relu-> 输出层-> softmax层

以上是我的神经网络架构。 我对这个relu的反向传播感到困惑。 对于RELU的导数,如果x ≤ 0,则输出为0。 如果x> 0,则输出为1。 因此,在计算梯度时,这是否意味着如果x≤0,我会破坏梯度下降?

有人可以逐步解释一下我的神经网络架构的反向传播吗?

6个回答

18
如果 x ≤ 0,则输出为0。如果 x > 0,则输出为1。
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是使用整流器激活函数的单元。这意味着它的工作方式与任何其他隐藏层完全相同,只是除了tanh(x),sigmoid(x)或其他激活函数之外,你将使用f(x) = max(0,x)。
如果您已经编写了具有sigmoid激活的工作多层网络的代码,那么只需要更改1行代码。前向或反向传播的算法不会发生任何变化。如果您还没有使较简单的模型工作,请先返回并从那里开始。否则,您的问题实际上不是关于ReLU,而是关于整个实现NN。

2
你确定这是正确的吗?我有可行的反向传播代码,我改变了激活函数(在前向传播代码中)和梯度(在反向传播代码中),然后程序在一个简单的异或测试中无法收敛。 - Yan King Yin
1
@Yan King Yin 是的。这可能是由于死重的结果。您也不需要更改梯度方面的任何内容。 - runDOSrun
谢谢,修复了一些错误后,我认为你是正确的。对于一些随机的初始权重,整个网络可能会死掉。 - Yan King Yin
1
不是整个网络,除非你的梯度消失了。但其中的一部分可能会出现这种情况,这时候泄漏整流可能会有所帮助,因为它不会有0权重。 - runDOSrun
3
我觉得这里存在一些混淆?楼主提到的0/1输出是“对于RELU的导数”(这是正确的),而回答则假定了RELU本身的输出。 - Bachi

11

这是一个很好的例子,使用ReLU实现XOR:

参考链接:http://pytorch.org/tutorials/beginner/pytorch_with_examples.html
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

# N is batch size(sample size); D_in is input dimension;
# H is hidden dimension; D_out is output dimension.
N, D_in, H, D_out = 4, 2, 30, 1

# Create random input and output data
x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])

# Randomly initialize weights
w1 = np.random.randn(D_in, 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  # the derivate of ReLU
    grad_w1 = x.T.dot(grad_h)

    # Update weights
    w1 -= learning_rate * grad_w1
    w2 -= learning_rate * grad_w2

plt.plot(loss_col)
plt.show()

关于ReLU的导数,您可以在这里查看:http://kawahara.ca/what-is-the-derivative-of-relu/


2
关于这行代码:grad_h[h < 0] = 0 # the derivate of ReLU。我理解它的含义。但是,我们是否应该再添加一行代码:grad_h[h > 1] = 1,因为当x>0时,导数为1? - mah65
@mah65 grad_h[h < 0] = 0; grad_h[h > 1] = 1是关于h_reluh的梯度。 @Belter的代码将grad_h定义为loss相对于h的梯度。根据链式法则,这等于逐元素相乘的grad_h_relu * (h > 0),与grad_h = grad_h_relu.copy(); grad_h[h < 0] = 0相当(但可能更慢)。 - chicxulub

10
如果您的层只使用了一个ReLU,就像您的结构所建议的那样,那么是的,在0处会抑制梯度。在训练期间,ReLU将返回0到输出层,该层将返回0或0.5(如果使用逻辑单元),然后softmax将它们压缩。因此,在当前架构下,值为0的情况对于前向传播部分也没有多大意义。
例如,请参见此处。您可以使用“泄漏ReLU”,即0处的小值,例如0.01。
但是我认为应该重新考虑这种结构,因为我认为将单个ReLU馈送到其他单元并应用softmax并不太合理。

7

当你计算梯度时,如果x≤0,那么意味着我会抑制梯度下降吗?

是的! 如果神经元的输入加权和(激活函数的输入)小于零且使用Relu激活函数,则在反向传播期间导数值为零,这个神经元的输入权重不会更改(不会更新)。

有人能够“分步骤”解释一下我的神经网络架构的反向传播吗?

一个简单的例子可以展示一步反向传播。这个例子覆盖了一步完整的过程。但你也可以只查看与Relu相关的部分。这与问题中介绍的架构类似,为了简单起见,在每层中使用一个神经元。该架构如下:

enter image description here

f和g分别表示Relu和sigmoid,b表示偏置。

步骤1: 首先计算输出:

enter image description here

这仅仅代表了输出计算。“z”和“a”分别表示神经元的输入总和和激活函数的输出值。 因此,h是估计值。假设真实值为y。

现在使用反向传播更新权重。

通过计算相对于权重的误差函数的梯度,并从以前的权重中减去该梯度来获得新权重,即:

W = =

在反向传播中,首先计算最后一层的最后一个神经元的梯度。使用链式法则计算:

enter image description here

上面使用的三个常规术语是:

  • 实际值与估计值之间的差异

  • 神经元输出的平方

  • 激活函数的导数,鉴于最后一层的激活函数是sigmoid,我们有:

enter image description here

上述语句不一定成为零。

现在我们来到第二层。在第二层中,我们将有:

enter image description here

它由四个主要项组成:

  • 实际值与估计值之间的差异。

  • 神经元输出平方

  • 下一层连接的神经元损失导数之和

  • 激活函数的导数,由于激活函数是Relu,所以我们会有:

如果 z2 <= 0 (z2 是 Relu 函数的输入):

enter image description here

否则,它不一定为零:

enter image description here

因此,如果神经元的输入小于零,则损失导数始终为零,权重将不会更新。

*必须保证神经元输入之和小于零,才能防止梯度下降过程中的梯度消失。

所提供的示例是为了说明反向传播过程的简单示例。


3

是的,原来的Relu函数存在您所描述的问题。因此,他们后来对公式进行了修改,并称之为Leaky Relu。本质上,Leaky Relu通过微小的倾斜水平部分的方式稍微改变了函数,获取更多信息,请观看以下内容:

关于激活方法的解释以及改进的Relu(YouTube视频)


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接