From 94c60a690f67f881a150208a922346f9d19d7308 Mon Sep 17 00:00:00 2001 From: SsnL Date: Sat, 28 Apr 2018 04:04:05 +0800 Subject: [PATCH 1/3] subgradient 1 at min and max for clamp --- tools/autograd/derivatives.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/autograd/derivatives.yaml b/tools/autograd/derivatives.yaml index 3208235217fb0..5349273d2904a 100644 --- a/tools/autograd/derivatives.yaml +++ b/tools/autograd/derivatives.yaml @@ -164,7 +164,7 @@ self: zeros_like(grad) - name: clamp(Tensor self, Scalar min, Scalar max) - self: grad * (self > min).type_as(grad) * (self < max).type_as(grad) + self: grad * ((self >= min) * (self <= max)).type_as(grad) - name: clamp_min(Tensor self, Scalar min) self: grad * (self > min).type_as(grad) From 50d4e698a97b8bb0673073deb08550326d6a13f3 Mon Sep 17 00:00:00 2001 From: SsnL Date: Sat, 28 Apr 2018 11:20:46 +0800 Subject: [PATCH 2/3] clamp max and clamp min too --- tools/autograd/derivatives.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/autograd/derivatives.yaml b/tools/autograd/derivatives.yaml index 5349273d2904a..e452c019072de 100644 --- a/tools/autograd/derivatives.yaml +++ b/tools/autograd/derivatives.yaml @@ -167,10 +167,10 @@ self: grad * ((self >= min) * (self <= max)).type_as(grad) - name: clamp_min(Tensor self, Scalar min) - self: grad * (self > min).type_as(grad) + self: grad * (self >= min).type_as(grad) - name: clamp_max(Tensor self, Scalar max) - self: grad * (self < max).type_as(grad) + self: grad * (self <= max).type_as(grad) - name: clone(Tensor self) self: grad From f15c4217b4b379f4a47ee6ac3fe0d7f54a6a37bb Mon Sep 17 00:00:00 2001 From: SsnL Date: Mon, 30 Apr 2018 17:01:19 +0800 Subject: [PATCH 3/3] add comment --- tools/autograd/derivatives.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/autograd/derivatives.yaml b/tools/autograd/derivatives.yaml index e452c019072de..54a5f230f5616 100644 --- a/tools/autograd/derivatives.yaml +++ b/tools/autograd/derivatives.yaml @@ -163,6 +163,9 @@ - name: ceil(Tensor self) self: zeros_like(grad) +# For clamp, clamp_min, and clamp_max, gradient is not defined at the +# boundaries. But empirically it's helpful to be able to get gradient on min and +# max, so we return the subgradient 1 for these cases. - name: clamp(Tensor self, Scalar min, Scalar max) self: grad * ((self >= min) * (self <= max)).type_as(grad)