Есть ли способ обрезать промежуточные взорванные градиенты в тензорном потоке

Проблема: очень длинная сеть RNN

N1 -- N2 -- ... --- N100

Для оптимизатора, такого как AdamOptimizer, compute_gradient() даст градиенты всем обучающим переменным.

Однако на каком-то этапе он может взорваться.

Метод, подобный описанному в как-эффективно- apply-gradient-clipping-in-tensor-flow может обрезать большой окончательный градиент.

Но как обрезать эти промежуточные?

Один из способов может заключаться в том, чтобы вручную сделать бэкпроп из "N100 --> N99", обрезать градиенты, затем "N99 --> N98" и так далее, но это слишком сложно.

Итак, мой вопрос: есть ли более простой способ обрезать промежуточные градиенты? (конечно, строго говоря, они больше не являются градиентами в математическом смысле)


person user1441268    schedule 12.10.2016    source источник
comment
Грубая идея — оберните каждый из ваших слоев в py_func, который использует собственный градиент, как это сделано здесь. Пользовательская функция градиента будет принимать вектор обратных значений и возвращать обрезанную версию.   -  person Yaroslav Bulatov    schedule 13.10.2016
comment
Отсечение весов и/или активаций также может помочь предотвратить большие градиенты.   -  person gizzmole    schedule 27.06.2017


Ответы (1)


Вы можете использовать декоратор custom_gradient, чтобы создать версию tf.identity, которая обрезает промежуточные градиенты с разнесенными частями.

``` из tensorflow.contrib.eager.python import tfe

@tfe.custom_gradient определение градиента_clipping_identity (тензор, max_norm): результат = tf.identity (тензор)

def grad(dresult): return tf.clip_by_norm(dresult, max_norm), None

возвращаемый результат, град ```

Затем используйте gradient_clipping_identity, как вы обычно используете идентификатор, и ваши градиенты будут обрезаны при обратном проходе.

person Alexandre Passos    schedule 27.10.2017