Нужно ли выводить дифференциальные / градиентные входные данные в обратной функции (цепочке)?

Я реализую очень сложную функцию в своем исследовании, использующую распространение веры в этом слое. Я получил градиент относительно W(параметр) этого слоя, но поскольку он сложный, я не получил градиент относительно input_data(данные получены из предыдущего слоя).

Я очень озадачен деталями обратного распространения. Я много слежу за алгоритмом BP, в некоторых заметках говорится, что это нормально только для дифференциала по W(параметр) и использую остаточное значение для получения градиента? Ваш пример, кажется, нам также нужно рассчитать градиент по входным данным (прежний выход слоя). Я в замешательстве? Очень типичный пример, как получить градиент по входному изображению в сверточном слое?

В моей сети два слоя. Нужно ли выводить градиент вручную по вводу X в последнем слое? (в обратном направлении необходимо вернуть gx, чтобы позволить BP работать для градиентного потока на прежний уровень)?

1 ответ

Если вам не нужен градиент относительно ввода, вы можете пропустить его вычисление. В этом случае вернуть None в качестве заполнителя для пропущенного входного градиента. Обратите внимание, что в этом случае grad ввода после backprop будет неверным. Если вы хотите написать функцию, которую можно использовать в любом контексте (включая случай, когда требуется ввод градиента с входными данными), вы должны вычислить градиенты по всем входным данным (за исключением случая, когда функция не дифференцируется по отношению к входным данным). вход). Это причина, по которой встроенные функции Chainer вычисляют градиенты для всех входов.

Кстати, получение градиента по входному изображению сверточного слоя очень просто: примените транспонированную свертку (которая по исторической причине называется "деконволюцией" в Chainer) к выходу, используя тот же вес.

Другие вопросы по тегам