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 | Описывает, как перепараметризуются выборки из распределения. В настоящее время это один из статических экземпляров |
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.
| Аргументы | |
|---|---|
sample_shape | Tensor или список/кортеж Python. Желаемая форма вызова sample(). |
name | имя для добавления в начало операций. |
| Возвращает | |
|---|---|
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, чтобы возвращать тензоры с постоянными значениями при подаче постоянных значений.
| Аргументы | |
|---|---|
sample_shape | TensorShape или список/кортеж Python. Желаемая форма вызова sample(). |
| Возвращает | |
|---|---|
dict имени параметра к TensorShape. |
| Возможные исключения | |
|---|---|
ValueError | если sample_shape является TensorShape и не определён полностью. |
data-text="prob" id="prob" tabindex="0">prob
prob(
value, name='prob'
)
Функция плотности/массы вероятности.
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Строковый префикс Python для имён операций, созданных этой функцией. |
| Возвращает | |
|---|---|
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
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Строковый префикс Python для имён операций, созданных этой функцией. |
| Возвращает | |
|---|---|
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() без аргументов сгенерирует одну выборку.
| Аргументы | |
|---|---|
sample_shape | 0D или 1D int32 Tensor. Форма генерируемых выборок. |
seed | Целочисленное начальное значение для генератора псевдослучайных чисел. |
name | имя для операции. |
| Возвращает | |
|---|---|
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.
| Аргументы | |
|---|---|
name | Строковый префикс Python для имён операций, созданных этой функцией. |
| Возвращает | |
|---|---|
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).
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Строковый префикс Python для имён операций, созданных этой функцией. |
| Возвращает | |
|---|---|
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.
| Аргументы | |
|---|---|
name | Строковый префикс Python для имён операций, созданных этой функцией. |
| Возвращает | |
|---|---|
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