Неагрегированные градиенты / градиенты на пример в тензорном потоке
Учитывая простую проблему мини-пакетного градиентного спуска на mnist в тензорном потоке (как в этом уроке), как я могу получить градиенты для каждого примера в пакете по отдельности.
tf.gradients()
кажется, возвращает градиенты, усредненные по всем примерам в пакете. Есть ли способ получить градиенты до агрегации?
Редактировать: первый шаг к этому ответу - выяснить, в какой точке тензор потока усредняет градиенты по примерам в пакете. Я думал, что это произошло в _AggregatedGrads, но, похоже, это не так. Есть идеи?
3 ответа
tf.gradients
возвращает градиент по отношению к потере. Это означает, что если ваша потеря является суммой потерь за пример, то градиент также является суммой градиентов потерь за пример.
Подведение итогов неявно. Например, если вы хотите минимизировать сумму квадратов норм Wx-y
ошибки, градиент по отношению к W
является 2(WX-Y)X'
где X
это партия наблюдений и Y
это партия этикеток. Вы никогда явно не формируете градиенты для каждого отдельного примера, которые потом суммируете, так что не просто удалить какой-либо этап в градиентном конвейере.
Простой способ получить k
градиенты потерь для каждого примера должны использовать партии размером 1 и делать k
проходит. Йен Гудфеллоу написал, как получить все k
градиенты за один проход, для этого вам нужно будет явно указать градиенты, а не полагаться на tf.gradients
метод
Частично ответить на мой собственный вопрос, немного поработав с этим. Похоже, что можно манипулировать градиентами для каждого примера, все еще работая в пакетном режиме, выполнив следующее:
- Создайте копию tf.gradients(), которая принимает дополнительный тензор / заполнитель с конкретными факторами
- Создайте копию _AggregatedGrads() и добавьте пользовательский метод агрегирования, который использует факторы, специфичные для примера.
- Вызовите свою пользовательскую функцию tf.gradients и сообщите свою потерю в виде списка срезов:
custagg_gradients(
ys=[cross_entropy[i] for i in xrange(batch_size)],
xs=variables.trainable_variables(),
aggregation_method=CUSTOM,
gradient_factors=gradient_factors
)
Но это, вероятно, будет иметь ту же сложность, что и отдельные проходы для каждого примера, и мне нужно проверить правильность градиентов:-).
Один из способов получения градиентов перед агрегацией - использовать grads_ys
параметр. Хорошее обсуждение находится здесь:
Использование параметра grads_ys в tf.gradients - TensorFlow