Подтвердить что ты не робот

Разделенные градиенты/градиенты на пример в тензорном потоке

Учитывая простую задачу спуска мини-пакетного градиента на mnist в тензорном потоке (как в этом tutorial), как я могу получить градиенты для каждого примера в партии по отдельности.

tf.gradients(), кажется, возвращает градиенты, усредненные по всем примерам в партии. Есть ли способ получить градиенты до агрегации?

Изменить: первый шаг к этому ответу - выяснить, в какой точке тензорный поток усредняет градиенты над примерами в партии. Я думал, что это произошло в _ AggregatedGrads, но это, похоже, не так. Любые идеи?

4b9b3361

Ответ 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 )

Но это, вероятно, будет иметь ту же сложность, что и отдельные проходы на пример, и мне нужно проверить правильность градиентов: -).