Neural network 基于RELU的神经网络反向传播

Neural network 基于RELU的神经网络反向传播,neural-network,backpropagation,Neural Network,Backpropagation,我正在尝试用RELU实现神经网络 输入层->1隐藏层->relu->输出层->softmax层 以上是我的神经网络结构。 我对这个relu的反向传播感到困惑。 对于RELU的导数,如果x 0,则输出为1。 所以当你计算梯度时,这是否意味着如果x如果你有一个由单个ReLU组成的层,就像你的架构建议的那样,那么是的,你在0处消除梯度。在训练期间,ReLU将返回0到您的输出层,如果您使用的是后勤单位,则输出层将返回0或0.5,softmax将挤压这些输出层。因此,在当前架构下,值0对于前向传播部分也没

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

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

以上是我的神经网络结构。 我对这个relu的反向传播感到困惑。 对于RELU的导数,如果x 0,则输出为1。
所以当你计算梯度时,这是否意味着如果x如果你有一个由单个ReLU组成的层,就像你的架构建议的那样,那么是的,你在
0
处消除梯度。在训练期间,ReLU将返回
0
到您的输出层,如果您使用的是后勤单位,则输出层将返回
0
0.5
,softmax将挤压这些输出层。因此,在当前架构下,值
0
对于前向传播部分也没有多大意义

例如,见。您可以使用一个“泄漏ReLU”,它是
0
处的一个小值,例如
0.01

我会重新考虑这个架构,但是,将一个ReLU输入到一堆其他单元中,然后应用softmax对我来说没有多大意义

如果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激活的工作的多层网络编写了代码,那么它实际上是一行更改。关于前向传播或后向传播的算法没有任何变化。如果您还没有让更简单的模型工作,请返回并首先从该模型开始。否则,您的问题实际上不是关于ReLUs,而是关于作为一个整体实现NN

此外,您可以在caffe框架中找到一个实现:


负斜率指定是否通过将其与斜率值相乘而不是将其设置为0来“泄漏”负部分。当然,您应该将此参数设置为零以获得经典版本。

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

#-*-编码:utf-8-*-
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#N为批量(样本量);D_in为输入维;
#H为隐维;D_out是输出维度。
N、 D_in,H,D_out=4,2,30,1
#创建随机输入和输出数据
x=np.数组([[0,0],[0,1],[1,0],[1,1]]
y=np.array([[0],[1],[1],[0]])
#随机初始化权重
w1=np.random.randn(D_in,H)
w2=np.random.randn(H,D_out)
学习率=0.002
损失_col=[]
对于范围(200)内的t:
#向前传球:计算预测y
h=x点(w1)
h_relu=np.最大值(h,0)#使用relu作为激活函数
y_pred=h_relu.dot(w2)
#计算和打印损耗
损耗=np.平方(y_pred-y).sum()#损耗函数
损失列追加(损失)
打印(t、损耗、y_pred)
#Backprop计算w1和w2相对于损失的梯度
grad_y_pred=2.0*(y_pred-y)#最后一层的错误
grad_w2=h_relu.T.dot(grad_y_pred)
grad_h_relu=grad_y_pred.dot(w2.T)#第二层的错误
grad_h=grad_h_relu.copy()
grad_h[h<0]=0#ReLU的导数
梯度w1=x.T.dot(梯度h)
#更新权重
w1-=学习率*年级w1
w2-=学习率*年级w2
plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt.plt
plt.show()

关于ReLU的导数,您可以在这里看到:

是的,原始ReLU函数存在您描述的问题。 所以他们后来对公式做了一个修改,称之为“漏洞百出的雷卢” 本质上,Leaky Relu将函数的水平部分稍微倾斜一小部分。有关更多信息,请观看以下内容:

所以当你计算梯度时,这是否意味着我要消除梯度
如果x是正数,你确定这是正确的吗?我有正在工作的backprop代码,我更改了激活函数(在前向prop代码中)和梯度(在backprop代码中),然后程序无法收敛进行简单的异或测试。@yanking-Yin是的。这可能是自重的结果。你也不需要改变任何关于梯度的东西。谢谢,在修复了一些错误之后,我认为你是对的。对于一些随机初始权重,整个网络可能是死的。除非梯度消失,否则不是整个网络。但是部分,是的。在这种情况下,不使用0-weights可能会有帮助。在我看来,这里有点混乱?OP表示0/1输出“用于RELU的导数”(这是正确的),而答案假设RELU本身的输出。