Тензорный поток: накопление градиентов тензорного - PullRequest
0 голосов
/ 25 февраля 2019

TL; DR: Вы можете просто перейти к вопросу в желтом поле ниже.

Предположим, у меня есть Encoder-Decoder Нейронная сеть с весами W_1 и W_2 кодера и декодера соответственно.Обозначим Z как выход кодера.Сеть обучена с размером партии n, и все градиенты будут рассчитаны относительно среднего значения потерь по партии (как показано на рисунке ниже, L_hat, который является суммой потерь на выборку L).

enter image description here

То, чего я пытаюсь достичь, это в обратном проходе манипулировать градиентами of Z перед тем, как передать его весам энкодера W_1.Предположим, что imagemod_grad"> является каким-то образом модифицированным оператором градиента, для которого выполняется следующее:

enter image description here

.синхронного прохода (сначала вычислите модифицированные градиенты Z, затем распространите до W_1) очень легко реализовать (умножение Jacobian выполняется с использованием grad_ys из tf.gradients):

def modify_grad(grad_z):
    # do some modifications

grad_z = tf.gradients(L_hat, Z)
mod_grad_z = modify_grad(grad_z)
mod_grad_w1 = tf.gradients(Z, W_1, mod_grad_z)

Проблема в том, что Мне нужно накопить градиенты grad_z тензора Z за несколько партий.Поскольку его форма является динамической (с None в одном из измерений, как на иллюстрации выше), я не могу определить tf.Variable для ее хранения.Кроме того, размер партии n может измениться во время тренировки.Как я могу хранить среднее значение grad_z за несколько партий?

PS : я просто хотел объединить оптимальное по парето обучение из ArXiv:1810.04650обучение асинхронной сети ArXiv:1609.02132 и планирование размера партии ArXiv:1711.00489.

...