You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Leaky ReLU:带mask与alpha的前向、反向传播实现求助

带Mask和Alpha的Leaky ReLU实现修正建议

你的代码存在两处关键错误,违背了Leaky ReLU的数学定义,以下是问题分析和修正方案:

前向传播逻辑错误

Leaky ReLU的计算公式为:

$f(x) = \begin{cases} x, & x > 0 \ \alpha x, & x \leq 0 \end{cases}$

你当前的out[self.mask] = self.alpha会把所有负输入替换成固定值α,这完全不符合函数定义,正确的做法是对负输入乘以α。

反向传播梯度计算错误

Leaky ReLU的导数为:

$f'(x) = \begin{cases} 1, & x > 0 \ \alpha, & x \leq 0 \end{cases}$

反向传播需要将上游梯度dout与对应位置的导数相乘,你当前的dout[self.mask]=self.alpha直接覆盖了上游梯度,导致梯度传递完全错误。正确的操作是对负输入对应的梯度部分乘以α,同时要注意避免修改原始的dout(防止副作用)。

修正后的完整代码

import numpy as np

class Leaky_ReLU():
    def __init__(self, alpha=0.01):
        self.mask = None
        self.alpha = alpha

    def __call__(self, x):
        self.mask = x <= 0
        out = x.copy()
        # 对负输入应用alpha缩放
        out[self.mask] *= self.alpha
        return out

    def backward(self, dout):
        # 复制dout避免修改原始输入
        dx = dout.copy()
        # 对负输入位置的梯度应用alpha缩放
        dx[self.mask] *= self.alpha
        return dx

验证示例

# 前向传播测试
x = np.array([1, -2, 3, -4])
lrelu = Leaky_ReLU(alpha=0.01)
out = lrelu(x)
print(out)  # 输出: [ 1.   -0.02  3.   -0.04]

# 反向传播测试
dout = np.array([0.5, 0.5, 0.5, 0.5])
dx = lrelu.backward(dout)
print(dx)  # 输出: [0.5   0.005 0.5   0.005]

内容的提问来源于stack exchange,提问作者user25498702

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:35:10