Можно ли эффективно вычислить градиенты для каждого примера в TensorFlow всего за один прогон графика? - PullRequest
0 голосов
/ 28 апреля 2018

TD; DR: есть ли способ оценить f '(x1), f' (x2), ..., f '(xn) всего за один прогон графа в векторизованной форме? Где f '(x) - производная от f (x).

Что-то вроде:

x = tf.placeholder(tf.float32, shape=[100])
f = tf.square(x)
f_grad = tf.multiple_gradients(x) # f_grad contains f'(x[0]), f'(x[1]), ...

Точнее говоря, я пытаюсь реализовать Black Box Stochastic Variational Inference (BBSVI) вручную (я знаю, что мог бы использовать такую ​​библиотеку, как Edward , но я пытаюсь реализовать ее самостоятельно). В какой-то момент мне нужно вычислить среднее значение f '(x) g (x) для множества различных значений x (x1, x2, ..., xn), где f (x) и g (x) равны двум функции, и f '(x) является производной от f (x).

Используя функцию автодифференцирования TensorFlow, я могу вычислить f '(x1), f' (x2), ..., f '(xn), просто вызывая f_prime.eval(feed_dict={x: xi}) один раз для каждого значения xi в (x1, x2, ..., хп). Это совсем не эффективно: я хотел бы использовать вместо этого векторизованную форму, но я не уверен, как это сделать.

Возможно, используя tf.stop_gradient() как-нибудь? Или используя аргумент grad_ys в tf.gradients()?

1 Ответ

0 голосов
/ 29 апреля 2018

После небольшого копания кажется, что вычисление градиентов для каждого примера в TensorFlow не является тривиальным, потому что эта библиотека выполняет стандартное обратное распространение для вычисления градиентов (как и другие библиотеки глубокого обучения, такие как PyTorch, Theano и т. Д.). on), который фактически никогда не вычисляет градиенты для каждого примера, он непосредственно получает сумму градиентов для каждого примера. Проверьте это обсуждение для более подробной информации.

Однако есть некоторые методы, чтобы обойти эту проблему, по крайней мере, для некоторых случаев использования. Например, в статье Иана Гудфеллоу Эффективное вычисление градиента для каждого примера объясняется, как эффективно вычислять векторы для каждого примера, содержащие сумму квадратов производных. Вот выдержка из статьи, показывающая вычисления (но я настоятельно рекомендую вам прочитать статью, она очень короткая):

enter image description here

Этот алгоритм использует O (mnp) вместо O (mnp²), где m - количество примеров, n - количество слоев в нейронной сети, а p - количество нейронов на слой. Так что это намного быстрее, чем наивный подход (т. Е. Выполнение back-prop один раз за пример), особенно когда p велико, и даже больше, когда используется GPU (который ускоряет векторизованные подходы с большим коэффициентом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...