TL; DR: Вы можете просто перейти к вопросу в желтом поле ниже.
Предположим, у меня есть Encoder-Decoder Нейронная сеть с весами W_1
и W_2
кодера и декодера соответственно.Обозначим Z
как выход кодера.Сеть обучена с размером партии n
, и все градиенты будут рассчитаны относительно среднего значения потерь по партии (как показано на рисунке ниже, L_hat
, который является суммой потерь на выборку L
).
То, чего я пытаюсь достичь, это в обратном проходе манипулировать градиентами of Z
перед тем, как передать его весам энкодера W_1
.Предположим, что mod_grad"> является каким-то образом модифицированным оператором градиента, для которого выполняется следующее:
.синхронного прохода (сначала вычислите модифицированные градиенты 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
.