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
相关产品推荐
相关产品推荐

