Передача пакетов в Tensorflow занимает структурное время

#tensorflow #tensorflow2.0 #tensorflow-probability

#tensorflow #tensorflow2.0 #tensorflow-вероятность

Вопрос:

Я создаю модель для прогнозирования временных рядов с вероятностью Tensorflow, следуя этому руководству. В этих примерах мне нужно передавать все данные сразу, но это недопустимо при работе с большими данными (мой случай), как я должен передавать пакеты или любые другие данные, загруженные с задержкой, в этот инструмент?

Комментарии:

1. Не уверен в вероятности tensorflow, но для tensorflow keras у нас есть такие методы, как train_on_batch, где вы можете просто передавать один пакет за раз.

2. Спасибо, это действительно просто и хорошо документировано для tensorflow keras и пользовательских циклов обучения tensorflow, но не для tfp.

Ответ №1:

Это общая проблема для большинства случаев вероятностного вывода: использование большинства градиентов неполного пакета приведет к смещенным выборкам.

Вы должны быть в состоянии написать target_log_prob_fn с tf.custom_gradient для перебора tf.data.Dataset итератора. Поскольку целевая logprob является скалярной, вы можете накапливать как градиенты, так и logprob, по мере выполнения функции по всем мини-пакетам в наборе данных.

 ds = build_dataset()
def build_model(params):
  return time_series_model(..)

@tf.custom_gradient
@tf.function  # autograph should turn the dataset loop into a tf.while_loop.
def log_prob(*params):
  total_lp = 0.
  total_grad = tf.nest.map_structure(tf.zeros_like, params)
  for batch in ds:
    lp, grad = tfp.math.value_and_gradient(
        lambda *p: build_model(p).log_prob(batch),
        params)
    total_lp  = lp
    total_grad = tf.nest.map_structure(lambda x,y: x y, total_grad, grad)
  return total_lp, lambda dy: tf.nest.map_structure(lambda g: dy*g, total_grad)
  

Комментарии:

1. можете ли вы дать мне несколько ссылок? Я хотел бы понять, что такое params и какая функция должна возвращаться.