反向传播沿计算图把损失 往前传。每经过一个结点,就把上游梯度乘上该结点的局部导数。取整、符号和硬阈值要么不可导,要么导数几乎处处为 。局部导数为 时,更前面的参数收不到更新。

Straight-Through Estimator(STE,直通估计器)保持前向计算不变,只在反向替换局部导数。最常用的替换是恒等映射的导数,使上游梯度原样通过。

1. 恒等梯度

设这个操作为 ,

链式法则把损失对 的梯度写成上游梯度与局部导数的乘积:

是从 传回 的上游梯度。 为取整时, 几乎处处成立,(1) 给出 。

恒等 STE 把局部导数换成恒等映射的导数。 按坐标作用时,对角元近似为 ,其余近似为 :

对应的雅可比就是单位阵 。代回 (1),

是局部导数的替代。按 (2), 收到的梯度等于上游梯度 。前向输出仍是 。

2. 用 detach 实现

下面把前向数值和反向通路拆开。detach 切断括号中的梯度,留下的 提供恒等导数。

y = Q(x)
y_st = x + (y - x).detach()

前向时 detach 不改变数值,因此 。后面的层使用的仍是 。

反向时, 已从计算图断开,对 的贡献为 。 对 的局部导数只来自第一项 :

上游梯度 再乘这个局部导数:

这就是 (2)。取整这类 不含可学习参数,梯度停在 detach 处即可,只需经第一项 继续向前。