Spec-Zone.ru › TensorFlow 1.15

tf.contrib.distributions.Autoregressive

Авторегрессивные распределения.

Наследуется от: Distribution

tf.contrib.distributions.Autoregressive(
    distribution_fn, sample0=None, num_steps=None, validate_args=False,
    allow_nan_stats=True, name='Autoregressive'
)

Распределение Autoregressive позволяет обучать (часто) более сложные многомерные распределения, многократно применяя диффеоморфное преобразование (например, реализованное в Bijector). Что касается терминологии,

"Авторегрессивные модели разлагают совместную плотность как произведение условных плотностей, и моделируют каждую условную плотность поочерёдно. Нормируемые потоки преобразуют базовую плотность (например, стандартное гауссово распределение) в целевую плотность посредством обратимого преобразования с вычислимой якобианом." [(Papamakarios et al., 2016)][1]

Другими словами, "авторегрессивное свойство" эквивалентно разложению p(x) = prod{ p(x[i] | x[0:i]) : i=0, ..., d }. Предоставленный shift_and_log_scale_fn, masked_autoregressive_default_template, достигает этого свойства, обнуляя веса в своих masked_dense слоях.

Практически говоря, авторегрессивное свойство означает, что существует перестановка координат событий, такая, что каждая координата является диффеоморфной функцией только предшествующих координат [(van den Oord et al., 2016)][2].

Математические подробности

Функция вероятности:

prob(x; fn, n) = fn(x).prob(x)

А образец генерируется по формуле:

x = fn(...fn(fn(x0).sample()).sample()).sample()

где многоточие (...) представляют собой n-2 составленные вызовы к fn, fn создаёт экземпляр, подобный tfp.distributions.Distribution, и x0 является фиксированным начальным Tensor.

Примеры

import tensorflow_probability as tfp
tfd = tfp.distributions

def normal_fn(self, event_size):
  n = event_size * (event_size + 1) / 2
  p = tf.Variable(tfd.Normal(loc=0., scale=1.).sample(n))
  affine = tfd.bijectors.Affine(
      scale_tril=tfd.fill_triangular(0.25 * p))
  def _fn(samples):
    scale = math_ops.exp(affine.forward(samples)).eval()
    return independent_lib.Independent(
        normal_lib.Normal(loc=0., scale=scale, validate_args=True),
        reinterpreted_batch_ndims=1)
  return _fn

batch_and_event_shape = [3, 2, 4]
sample0 = array_ops.zeros(batch_and_event_shape)
ar = autoregressive_lib.Autoregressive(
    self._normal_fn(batch_and_event_shape[-1]), sample0)
x = ar.sample([6, 5])
# ==> x.shape = [6, 5, 3, 2, 4]
prob_x = ar.prob(x)
# ==> x.shape = [6, 5, 3, 2]

Ссылки

[1]: George Papamakarios, Theo Pavlakou, and Iain Murray. Masked Autoregressive Flow for Density Estimation. In Neural Information Processing Systems, 2017. https://arxiv.org/abs/1705.07057

[2]: Aaron van den Oord, Nal Kalchbrenner, Oriol Vinyals, Lasse Espeholt, Alex Graves, and Koray Kavukcuoglu. Conditional Image Generation with PixelCNN Decoders. In Neural Information Processing Systems, 2016. https://arxiv.org/abs/1606.05328

Аргументы
distribution_fn Python callable, которое создаёт экземпляр, подобный tfp.distributions.Distribution из Tensor (например, sample0). Функция должна соблюдать "авторегрессивное свойство", то есть существует перестановка событий, такая, что каждая координата является диффеоморфной функцией от предыдущих координат.
sample0 Начальный вход для distribution_fn; используется для построения распределения в __init__, которое в свою очередь определяет свойства этого распределения, например, event_shape, batch_shape, dtype. Если не указано, то distribution_fn должен быть создаваемым по умолчанию.
num_steps Количество раз distribution_fn составляется из выборок, например, num_steps=2 подразумевает distribution_fn(distribution_fn(sample0).sample(n)).sample().
validate_args Python bool. Нужно ли проверять входные данные с помощью утверждений. Если validate_args равно False, и входные данные неверны, корректное поведение не гарантируется.
allow_nan_stats Python bool, значение по умолчанию True. Когда True, статистика (например, среднее, мода, дисперсия) использует значение "NaN" для обозначения того, что результат не определён. Если False, возникает исключение, если один или несколько членов пакета статистики не определены.
name Имя Python str, добавляемое в качестве префикса к операциям, созданным этим классом. Значение по умолчанию: "Autoregressive".
Возбуждает
ValueError если num_steps и distribution_fn(sample0).event_shape.num_elements() оба None.
ValueError если num_steps < 1.
Атрибуты
allow_nan_stats Python bool, описывающий поведение, когда статистическое значение не определено.

Статистики возвращают +/- бесконечность, когда это имеет смысл. Например, дисперсия распределения Коши равна бесконечности. Однако иногда статистика не определена, например, если плотность распределения не достигает максимума в пределах области определения распределения, мода не определена. Если среднее не определено, то по определению и дисперсия не определена. Например, среднее для распределения Стьюдента для df = 1 не определено (нет чёткого способа сказать, что это либо + либо - бесконечность), поэтому дисперсия = E[(X - среднее)**2] также не определена.

batch_shape Форма одной выборки из одного индекса события в виде TensorShape.

Может быть частично определена или неизвестна.

Размерности пакета — это индексы независимых, но не одинаковых параметризаций этого распределения.

distribution0
distribution_fn
dtype DType Tensor обрабатываемые этим Distribution.
event_shape Форма одной выборки из одного набора в виде TensorShape.

Может быть частично определена или неизвестна.

name Префикс имени, добавляемый ко всем операциям, созданным этим Distribution.
num_steps
parameters Словарь параметров, используемых для создания этого Distribution.
reparameterization_type Описывает, как перепараметризуются выборки из распределения.

В настоящее время это один из статических экземпляров distributions.FULLY_REPARAMETERIZED или distributions.NOT_REPARAMETERIZED.

sample0
validate_args Python bool, указывающий на то, что, возможно, дорогостоящие проверки включены.

Методы

batch_shape_tensor

Просмотр исходного кода

batch_shape_tensor(
    name='batch_shape_tensor'
)

Форма одной выборки из одного индекса события в виде одномерного Tensor.

Размерности пакета — это индексы независимых, но не одинаковых параметризаций этого распределения.

Аргументы
name имя для операции
Возвращает
batch_shape Tensor.

cdf

Просмотр исходного кода

cdf(
    value, name='cdf'
)

Функция кумулятивного распределения.

Для случайной величины X, функция кумулятивного распределения cdf вычисляется следующим образом:

cdf(x) := P[X <= x]
Аргументы
value float или double Tensor.
name Python str префикс к именам операций, созданных этой функцией.
Возвращает
cdf тензор формы sample_shape(x) + self.batch_shape со значениями типа self.dtype.

copy

Просмотр исходного кода

copy(
    **override_parameters_kwargs
)

Создаёт глубокую копию распределения.

Примечание: скопированное распределение может по-прежнему зависеть от исходных аргументов инициализации.
Аргументы
**override_parameters_kwargs Словарь строковых/значимых аргументов инициализации для переопределения новыми значениями.
Возвращает
distribution Новый экземпляр type(self) инициализированный из объединения self.parameters и override_parameters_kwargs, то есть dict(self.parameters, **override_parameters_kwargs).

covariance

Просмотр исходного кода

covariance(
    name='covariance'
)

Ковариация.

Ковариация (возможно) определена только для распределений нескалярных событий.

Например, для векторного распределения длиной k, оно рассчитывается как,

Cov[i, j] = Covariance(X_i, X_j) = E[(X_i - E[X_i]) (X_j - E[X_j])]

где Cov — (пакет) k x k матрица, 0 <= (i, j) < k, и E обозначает математическое ожидание.

В качестве альтернативы, для не-векторных, многомерных распределений (например, матричных, Вишарта), Covariance возвращает (пакет) матриц при какой-либо векторизации событий, то есть

Cov[i, j] = Covariance(Vec(X)_i, Vec(X)_j) = [as above]
END_OF_DOCUMENT_MARKER

где Cov — это (группа) k' x k' матриц, 0 <= (i, j) < k' = reduce_prod(event_shape), и Vec — некоторая функция, сопоставляющая индексы размерностей событий этого распределения индексам вектора длины k'.

Аргументы
name Префикс Python str, добавляемый к именам операций, созданных этой функцией.
Возвращаемое значение
covariance Вещественное число Tensor со формой [B1, ..., Bn, k', k'], где первые n размерности — это координаты пакетной обработки, а k' = reduce_prod(self.event_shape).

cross_entropy

Просмотреть исходный код

cross_entropy(
    other, name='cross_entropy'
)

Вычисляет перекрестную энтропию (Шеннона).

Обозначим это распределение (self) как P и распределение other как Q. Предполагая, что P, Q абсолютно непрерывны друг относительно друга и допускают плотности p(x) dr(x) и q(x) dr(x), (энтропия Шеннона) перекрестная энтропия определяется как:

H[P, Q] = E_p[-log q(X)] = -int_F p(x) log q(x) dr(x)

где F обозначает область определения случайной величины X ~ P.

Аргументы
other Экземпляр tfp.distributions.Distribution.
name Префикс Python str , добавляемый к именам операций, созданных этой функцией.
Возвращаемое значение
cross_entropy Вещественное число self.dtype Tensor с формой [B1, ..., Bn] , представляющей n различные вычисления (энтропии Шеннона) перекрестной энтропии.

entropy

Просмотреть исходный код

entropy(
    name='entropy'
)

Энтропия Шеннона в натах.

event_shape_tensor

Просмотреть исходный код

event_shape_tensor(
    name='event_shape_tensor'
)

Форма одного образца из одного пакета как 1-мерный целочисленный Tensor.

Аргументы
name имя, которое нужно дать операции
Возвращаемое значение
event_shape Tensor.

is_scalar_batch

Просмотреть исходный код

is_scalar_batch(
    name='is_scalar_batch'
)

Указывает, что batch_shape == [].

Аргументы
name Префикс Python str , добавляемый к именам операций, созданных этой функцией.
Возвращаемое значение
is_scalar_batch bool скаляр Tensor.

is_scalar_event

Просмотреть исходный код

is_scalar_event(
    name='is_scalar_event'
)

Указывает, что event_shape == [].

Аргументы
name Префикс Python str , добавляемый к именам операций, созданных этой функцией.
Возвращаемое значение
is_scalar_event bool скаляр Tensor.

kl_divergence

Просмотреть исходный код

kl_divergence(
    other, name='kl_divergence'
)

Вычисляет расстояние Кульбака—Лейблера.

Обозначим это распределение (self) как p и распределение other как q. Предполагая, что p, q абсолютно непрерывны относительно меры отсчета r, расстояние Кульбака-Лейблера определяется как:

KL[p, q] = E_p[log(p(X)/q(X))]
         = -int_F p(x) log q(x) dr(x) + int_F p(x) log p(x) dr(x)
         = H[p, q] - H[p]

где F обозначает область определения случайной величины X ~ p, H[., .] обозначает (энтропию Шеннона) перекрестную энтропию, а H[.] обозначает (энтропию Шеннона) энтропию.

Аргументы
other Экземпляр tfp.distributions.Distribution.
name Префикс Python str , добавляемый к именам операций, созданных этой функцией.
Возвращаемое значение
kl_divergence Вещественное число self.dtype Tensor с формой [B1, ..., Bn] , представляющей n различные вычисления расстояния Кульбака-Лейблера.

log_cdf

Просмотреть исходный код

log_cdf(
    value, name='log_cdf'
)

Логарифмическая функция кумулятивного распределения.

Для случайной величины X, функция кумулятивного распределения cdf равна:

log_cdf(x) := Log[ P[X <= x] ]

Часто для log_cdf(x) используется численное приближение, которое дает более точный результат, чем просто взятие логарифма cdf , когда x << -1.

Аргументы
value float или double Tensor .
name Префикс Python str , добавляемый к именам операций, созданных этой функцией.
Возвращаемое значение
logcdf тензор Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype.

log_prob

Просмотреть исходный код

log_prob(
    value, name='log_prob'
)

Логарифмическая функция плотности/массы вероятности.

Аргументы
value float или double Tensor .
name Префикс Python str , добавляемый к именам операций, созданных этой функцией.
Возвращаемое значение
log_prob тензор Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype.

log_survival_function

Просмотреть исходный код

log_survival_function(
    value, name='log_survival_function'
)

Логарифмическая функция выживания.

Для случайной величины X, функция выживания определяется как:

log_survival_function(x) = Log[ P[X > x] ]
                         = Log[ 1 - P[X <= x] ]
                         = Log[ 1 - cdf(x) ]

Обычно для логарифмической функции выживания используются различные численные приближения, которые более точны, чем 1 - cdf(x) , когда x >> 1.

Аргументы
value float или double Tensor .
name Префикс Python str , добавляемый к именам операций, созданных этой функцией.
Возвращаемое значение
тензор Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype.

mean

Просмотреть исходный код

mean(
    name='mean'
)

Среднее значение.

mode

Просмотреть исходный код

mode(
    name='mode'
)

Мода.

param_shapes

Просмотреть исходный код

@classmethod
param_shapes(
    sample_shape, name='DistributionParamShapes'
)

Формы параметров, учитывая желаемую форму вызова sample().

Это метод класса, описывающий необходимые аргументы ключ/значение для создания экземпляра данного Distribution, чтобы получить определённую форму для вызова sample() этого экземпляра.

Подклассы должны переопределять метод класса _param_shapes.

class="responsive fixed orange">
Аргументы
sample_shape Tensor или список/кортеж Python. Желаемая форма вызова sample().
name имя для добавления в начало операций.
class="responsive fixed orange">
Возвращает
dict имени параметра к формам Tensor.

data-text="param_static_shapes" id="param_static_shapes" tabindex="0">param_static_shapes

Просмотреть исходный код

@classmethod
param_static_shapes(
    sample_shape
)

param_shapes со статическими (т.е. TensorShape) формами.

Это метод класса, описывающий необходимые аргументы ключ/значение для создания экземпляра данного Distribution, чтобы получить определённую форму для вызова sample() этого экземпляра. Предполагается, что форма выборки известна статически.

Подклассы должны переопределять метод класса _param_shapes, чтобы возвращать тензоры с постоянными значениями при подаче постоянных значений.

class="responsive fixed orange">
Аргументы
sample_shape TensorShape или список/кортеж Python. Желаемая форма вызова sample().
class="responsive fixed orange">
Возвращает
dict имени параметра к TensorShape.
class="responsive fixed orange">
Возможные исключения
ValueError если sample_shape является TensorShape и не определён полностью.

data-text="prob" id="prob" tabindex="0">prob

Просмотреть исходный код

prob(
    value, name='prob'
)

Функция плотности/массы вероятности.

class="responsive fixed orange">
Аргументы
value float или double Tensor.
name Строковый префикс Python для имён операций, созданных этой функцией.
class="responsive fixed orange">
Возвращает
prob Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype.

data-text="quantile" id="quantile" tabindex="0">quantile

Просмотреть исходный код

quantile(
    value, name='quantile'
)

Функция квантиля. Также известна как "обратная функция распределения" или "функция процентиля".

Для случайной величины X и p in [0, 1], quantile:

quantile(p) := x such that P[X <= x] == p
class="responsive fixed orange">
Аргументы
value float или double Tensor.
name Строковый префикс Python для имён операций, созданных этой функцией.
class="responsive fixed orange">
Возвращает
quantile Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype.

data-text="sample" id="sample" tabindex="0">sample

Просмотреть исходный код

sample(
    sample_shape=(), seed=None, name='sample'
)

Генерация выборок указанной формы.

Обратите внимание, что вызов sample() без аргументов сгенерирует одну выборку.

class="responsive fixed orange">
Аргументы
sample_shape 0D или 1D int32 Tensor. Форма генерируемых выборок.
seed Целочисленное начальное значение для генератора псевдослучайных чисел.
name имя для операции.
class="responsive fixed orange">
Возвращает
samples Tensor с добавленными размерностями sample_shape.

data-text="stddev" id="stddev" tabindex="0">stddev

Просмотреть исходный код

stddev(
    name='stddev'
)

Стандартное отклонение.

Стандартное отклонение определяется как,

stddev = E[(X - E[X])**2]**0.5

где X — случайная величина, связанная с этим распределением, E — математическое ожидание, а stddev.shape = batch_shape + event_shape.

class="responsive fixed orange">
Аргументы
name Строковый префикс Python для имён операций, созданных этой функцией.
class="responsive fixed orange">
Возвращает
stddev Число с плавающей точкой Tensor с формой, идентичной batch_shape + event_shape, т.е. такой же формы, как и self.mean().

data-text="survival_function" id="survival_function" tabindex="0">survival_function

Просмотреть исходный код

survival_function(
    value, name='survival_function'
)

Функция выживания.

Для случайной величины X, функция выживания определяется как:

survival_function(x) = P[X > x]
                     = 1 - P[X <= x]
                     = 1 - cdf(x).
class="responsive fixed orange">
Аргументы
value float или double Tensor.
name Строковый префикс Python для имён операций, созданных этой функцией.
class="responsive fixed orange">
Возвращает
Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype.

data-text="variance" id="variance" tabindex="0">variance

Просмотреть исходный код

variance(
    name='variance'
)

Дисперсия.

Дисперсия определяется как,

Var = E[(X - E[X])**2]

где X — случайная величина, связанная с этим распределением, E — математическое ожидание, а Var.shape = batch_shape + event_shape.

class="responsive fixed orange">
Аргументы
name Строковый префикс Python для имён операций, созданных этой функцией.
class="responsive fixed orange">
Возвращает
variance Число с плавающей точкой Tensor с формой, идентичной batch_shape + event_shape, т.е. такой же формы, как и self.mean().

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/distributions/Autoregressive

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API