Разделенные градиенты/градиенты на пример в тензорном потоке
Учитывая простую задачу спуска мини-пакетного градиента на mnist в тензорном потоке (как в этом tutorial), как я могу получить градиенты для каждого примера в партии по отдельности.
tf.gradients()
, кажется, возвращает градиенты, усредненные по всем примерам в партии. Есть ли способ получить градиенты до агрегации?
Изменить: первый шаг к этому ответу - выяснить, в какой точке тензорный поток усредняет градиенты над примерами в партии. Я думал, что это произошло в _ AggregatedGrads, но это, похоже, не так. Любые идеи?
Ответы
Ответ 1
tf.gradients
возвращает градиент относительно потери. Это означает, что если ваша потеря представляет собой сумму потерь на пример, тогда градиент также является суммой градиентов потерь в каждом примере.
Подведение итогов неявно. Например, если вы хотите минимизировать сумму квадратов норм ошибок Wx-y
, то градиент по отношению к W
равен 2(WX-Y)X'
, где X
- партия наблюдений, а Y
- партия меток. Вы никогда явно не создаете градиенты "для каждого примера", которые вы позже суммируете, поэтому не просто удалить какой-либо этап в контуре градиента.
Простым способом получить k
для каждого примера градиента потерь является использование партий размером 1 и прохождение k
. Ian Goodfellow написал, как получить все градиенты k
за один проход, для этого вам нужно будет явно указывать градиенты и не полагаться на tf.gradients
Ответ 2
Отчасти ответить на мой вопрос после того, как он немного поработал с этим. По-видимому, можно манипулировать градиентами на пример, все еще работая в пакетном режиме, делая следующее:
- Создайте копию 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
)
Но это, вероятно, будет иметь ту же сложность, что и отдельные проходы на пример, и мне нужно проверить правильность градиентов: -).
Ответ 3
Одним из способов получения градиентов перед агрегацией является использование параметра grads_ys
. Хорошее обсуждение можно найти здесь:
Использование параметра grads_ys в tf.gradients - TensorFlow