Python Relu激活和反向传播

Python Relu激活和反向传播,python,backpropagation,mlp,Python,Backpropagation,Mlp,我已经使用sigmoid激活函数实现了MLP的反向传播 在正向阶段,我将每一层的输出存储在内存中 在计算输出误差和输出梯度向量后,我开始反向返回并计算每个层的隐藏误差(使用当前层的输出+层+1的权重+层+1的输出误差)。然后,我使用隐藏错误和第1层的输出来计算梯度向量。一旦反向传播完成,我将使用为每个层计算的梯度向量更新权重 我的问题与relu激活功能的实现有关。我有以下用于应用激活函数的函数。第一个是我在初始运行中使用的,第二个是用于relu激活 def sigmoid(self, a):

我已经使用sigmoid激活函数实现了MLP的反向传播

在正向阶段,我将每一层的输出存储在内存中

在计算输出误差和输出梯度向量后,我开始反向返回并计算每个层的隐藏误差(使用当前层的输出+层+1的权重+层+1的输出误差)。然后,我使用隐藏错误和第1层的输出来计算梯度向量。一旦反向传播完成,我将使用为每个层计算的梯度向量更新权重

我的问题与relu激活功能的实现有关。我有以下用于应用激活函数的函数。第一个是我在初始运行中使用的,第二个是用于relu激活

def sigmoid(self, a):
    o = 1/(1+np.exp(-1*a))
    return o

def relu(self, a):
    return np.maximum(0, a)

def reluDerivative(self, x):       
    return 1. * (x > 0)

要实现relu激活功能,我需要在正向传播阶段或反向传播阶段进行任何其他更改。我读到我可能需要在反向阶段计算relu导数并应用,但我对如何应用感到困惑。非常感谢您的建议

假设您的课程当前设置如下:

def logistic(z):
    return 1./(1. + np.exp(-z))


class backpropagation(object):

    ...

    def get_activation(self, a):
        return logistic(a)

    def get_delta_activation(self, a):
        y = logistic(a)
        dy = y * (1. - y)
        return dy
那么新的派生类将是

class BPwithRelu(backpropagation):
    
    def get_activation(self, a):
        return np.max(0, a)

    def get_delta_activation(self, a):
        return (x > 0).astype(np.float)


    

进行反向传播时,需要使用链规则的中间值。假设您只有一个relu后跟一个sigmoid,则有:

f(x) = relu(sigmoid(x))
relu(x) = max(0,x)
sigmoid(x) = 1/(1+exp(-1*a))
使用链式规则(拉格朗日符号)推导
f(x)

f'(x)=relu'(sigmoid(x))*sigmoid'(x)

你可以看到,从sigmoid得到的梯度乘以从relu得到的梯度。还要注意,relu计算其相对于sigmoid输出的梯度,而sigmoid计算其相对于输入(x)的梯度。

为什么不使用任何框架,如pytorch?这是一个好主意。。。但现在我正在尝试使用jupyter:-)学习基本知识,对于反向传播阶段,必须定义导数函数 雷卢的。很难告诉你们神经网络是如何进行前馈和反向传播的。首先,你可以实现导数函数!我知道如何在前进阶段实现relu,但如何在后退阶段应用它?我有计算relu导数的函数,但不确定该应用于何处。
def reluDerivative(self,x):返回1。*(x>0)
那么在backprop阶段,我是否必须使用relu导数重新计算每层的输出?然后用它来计算隐藏的错误?我需要哪些中间值。我目前正在内存中保存每个层的权重和输出。激活前是否还需要保存值?是的,输入(或前一层的输出)用于反向传播。对于二进制操作(即加法或乘法),您将有两个输入,这将需要您反向传播两个值。这可能更容易用一个例子来解释你的网络是什么样子的。我不确定如何共享我的代码,但基本上我正在使用MNIST数据。我的架构由两个隐藏层(10,30)和一个输出层(10个神经元)组成。我已经从sigmoid将我的激活更新为relu,并且还修改了backprop阶段,因此在正向阶段应用relu激活之前,隐藏的错误会考虑总权重。准确度很低,我觉得需要对代码进行更多更新每个隐藏层通常会将输入乘以一些权重,添加偏差并通过激活函数传递,即
f(Wx+b)
其中
f
是激活函数,
W
是权重,
b
是偏差。如果您了解这是一个组合函数,您就能够计算导数,该导数可以轻松地扩展到其他隐藏层。网上有很多关于这方面的资源,但是如果没有更多关于你要完成什么的细节,就很难给出任何具体的答案。如何在backprop中应用relu导数?谢谢