Зачем нам клонировать grad_output и назначать его в grad_input, кроме простого присваивания во время обратного распространения?
tensor.clone()
создает копию тензора, которая имитирует исходный тензор requires_grad
поле. clone
- это способ скопировать тензор, сохраняя при этом копию как часть графа вычислений, из которого он получен.
Итак, grad_input
является частью того же графа вычислений, что и grad_output
, и если мы вычисляем градиент для grad_output
, затем то же самое будет сделано для grad_input
.
Поскольку мы вносим изменения в grad_input
, мы сначала его клонируем.
Какова цель 'grad_input [input <0] = 0'? Означает ли это, что мы не обновляем градиент при вводе меньше нуля? </p>
Это делается в соответствии с определением функции ReLU. Функция ReLU f(x)=max(0,x)
. Это означает, что если x<=0
, то f(x)=0
, иначе f(x)=x
. В первом случае, когда x<0
, производная f(x)
по x
равна f'(x)=0
. Итак, мы выполняем grad_input[input < 0] = 0
. Во втором случае это f'(x)=1
, поэтому мы просто передаем grad_output
в grad_input
(работает как открытые ворота).