derivative of logsumexp is independent of max (#17088)

same as #7009 but for logsumexp and logcumsumexp.
fwd+bwd kernel count 5 -> 3 for both. gradients unchanged
(ties, -inf masks, torch-compared at grad_atol=1e-7).
This commit is contained in:
Pol Puigdemont Plana
2026-07-20 06:52:16 -07:00
committed by GitHub
parent abba2aebda
commit ef77963cfd
2 changed files with 14 additions and 2 deletions
+12
View File
@@ -1472,6 +1472,18 @@ class TestSchedule(unittest.TestCase):
x.softmax().sum().backward()
run_linear(*check_schedule(x.grad, 4))
def test_logsumexp_backward(self):
Tensor.manual_seed(0)
x = Tensor.randn(4, 12, 64, 64).realize()
x.logsumexp(-1).sum().backward()
run_linear(*check_schedule(x.grad, 3))
def test_logcumsumexp_backward(self):
Tensor.manual_seed(0)
x = Tensor.randn(4, 512).realize()
x.logcumsumexp(-1).sum().backward()
run_linear(*check_schedule(x.grad, 3))
def test_scaled_dot_product_attention_fusion(self):
x, y, z, m = (Tensor.empty(32, 8, 16, 16) for _ in range(4))
out = Tensor.scaled_dot_product_attention(x, y, z, attn_mask=m)
+2 -2
View File
@@ -658,7 +658,7 @@ class OpMixin(ElementwiseMixin, ReduceMixin):
print(t.logsumexp(axis=1).numpy())
```
"""
m = self.max(axis=axis, keepdim=True)
m = self.max(axis=axis, keepdim=True).detach()
return (self - m).exp().sum(axis=axis, keepdim=keepdim).log() + (m if keepdim else m.squeeze(axis))
def _softmax(self, axis, dtype:DTypeLike|None=None) -> tuple[Self, Self, Self]:
@@ -841,7 +841,7 @@ class OpMixin(ElementwiseMixin, ReduceMixin):
x = self.transpose(axis, -1)
last_dim_size = x.shape[-1]
x_unsqueezed = x.unsqueeze(-2).expand((None,)*(self.ndim-1)+(last_dim_size, None))
x_cummax, _ = x.cummax(-1)
x_cummax = x.cummax(-1)[0].detach()
mask = type(self).ones(last_dim_size, last_dim_size, buffer=False).tril()
ret = mask.where(x_unsqueezed - x_cummax.unsqueeze(-1), self.dtype.min).exp().sum(-1).log() + x_cummax
return ret.transpose(-1, axis)