首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Relu激活和反向传播

Relu激活和反向传播
EN

Stack Overflow用户
提问于 2021-03-24 16:41:12
回答 2查看 373关注 0票数 1

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

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

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

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

代码语言:javascript
复制
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导数并应用,但对如何应用感到困惑。感谢您的建议

EN

回答 2

Stack Overflow用户

发布于 2021-03-24 20:02:58

假设您的类当前设置如下:

代码语言:javascript
复制
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

则新的派生类将是

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2021-03-24 20:33:19

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

代码语言:javascript
复制
f(x) = relu(sigmoid(x))
relu(x) = max(0,x)
sigmoid(x) = 1/(1+exp(-1*a))

使用链式规则(拉格朗日符号)导出f(x)

代码语言:javascript
复制
f'(x) = relu'(sigmoid(x)) * sigmoid'(x)

你可以看到来自sigmoid的梯度乘以来自relu的梯度。另请注意,relu计算其相对于sigmoid输出的梯度,而sigmoid计算其相对于输入(x)的梯度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66777458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档