Пользовательский градиент первого и второго порядка в Tensorflow 2.0 - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь понять пользовательскую функцию градиента tensorflow 2.0. Судя по моим поискам, есть два декоратора, которые можно использовать для расчета настраиваемого градиента (хотя разница между ними мне все еще не ясна)

a) @ tf.RegisterGradient

b ) @ tf.custom_gradient

Изучая документацию по @ tf.custom_gradient, я заметил несколько вещей:

1) Если я хочу создать собственный градиент для log1exp, то мне нужно определить функцию ( как показано ниже) (Понятно)

def log1pexp(x):
  return tf.math.log(1 + tf.exp(x))

2) Теперь мы можем написать эту функцию так, чтобы внутренняя функция возвращала градиент внешней функции ((Хорошо, я могу вспомнить это для всех таких операций . Нет проблем)

@tf.custom_gradient
def log1pexp(x):
  e = tf.exp(x)
  def grad(dy):
    return dy * (1 - 1 / (1 + e))
  return tf.math.log(1 + e), grad

Ниже я понимаю эту функцию, которая может быть неверной.

Но при определении grad (dy) мы здесь прохождение градиента dy. Подождите, что? Это что-то неинтуитивное для меня. (Насколько я понимаю, эта функция принимает градиент, который был рассчитан до сих пор, может быть какой-то кеш, который мы передаем n на каждой итерации), но после завершения моего первого прямого прохода (до начала моего обратного прохода) у меня не будет градиента какой-либо функции? Итак, как я могу это получить?

3) Я также старался изо всех сил понять, как вычислить производную второго порядка (я знаю, что это не так часто) со страницы документации на на странице, производная второго порядка вычисляется, как указано ниже: (не понял)

@tf.custom_gradient
def op_with_fused_backprop(x):
  y, x_grad = fused_op(x)
  def first_order_gradient(dy):
    @tf.custom_gradient
    def first_order_custom(unused_x):
      def second_order_and_transpose(ddy):
        return second_order_for_x(...), gradient_wrt_dy(...)
      return x_grad, second_order_and_transpose
    return dy * first_order_custom(x)
  return y, first_order_gradient

4) Я также пытался понять @ tf.RegisterGradient из здесь , здесь и из docs (на странице do c нет достаточной информации) (не понял)

Кто-нибудь, пожалуйста, постарайтесь объяснить вещи подробнее интуитивно понятный и простой способ? (Прошу прощения за мой уровень новичка в этом контексте)

i) Разница между декоратором @ tf.RegisterGradient и @ tf.custom_gradient. Если одно предпочтительнее другого, то почему?

ii) Откуда dy во внутренней функции, упомянутой в пунктах 2 выше? (Во время вычислений) Я понимаю поток ( выделено жирным шрифтом) правильно?

iii) Какое правильное и более интуитивное объяснение производной второго порядка, упомянутой в пунктах 3?

iv) Каков будет общий процесс поиска производной n-го порядка с использованием любого из @ tf.RegisterGradient и @ tf.custom_gradient?

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