tf.contrib.distributions.VectorDiffeomixture
Распределение VectorDiffeomixture.
Наследуется от: Distribution
tf.contrib.distributions.VectorDiffeomixture(
mix_loc, temperature, distribution, loc=None, scale=None, quadrature_size=8, qua
drature_fn=tf.contrib.distributions.quadrature_scheme_softmaxnormal_quantiles,
validate_args=False, allow_nan_stats=True, name='VectorDiffeomixture'
)
Векторное распределение diffeomixture (VDM) параметризуется как выпуклая комбинация K компонентных loc векторов, loc[k], k = 0,...,K-1, и K scale матриц scale[k], k = 0,..., K-1. Оно аппроксимирует следующее составное распределение
p(x) = int p(x | z) p(z) dz, where z is in the K-simplex, and p(x | z) := p(x | loc=sum_k z[k] loc[k], scale=sum_k z[k] scale[k])
Интеграл int p(x | z) p(z) dz аппроксимируется схемой квадратур, адаптированной к плотности смеси p(z). N точки квадратуры z_{N, n} и веса w_{N, n} (которые неотрицательны и суммируются до 1) выбираются так, что
как N --> infinity.
Так как q_N(x) фактически является смесью (N точек), мы можем точно генерировать выборки из q_N. Важно отметить, что VDM определяется как q_N выше, а не как p(x). Следовательно, генерация выборок и вычисление плотности могут быть реализованы как точные (с точностью до ошибки с плавающей точкой) методы.
Обычный выбор для условного p(x | z) — многомерное нормальное распределение.
Реализованная маргинальная p(z) — это SoftmaxNormal, которая представляет собой K-1-мерное нормальное распределение, преобразованное биектором SoftmaxCentered, что делает его плотностью на K-симплексе. То есть,
Z = SoftmaxCentered(X), X = Normal(mix_loc / temperature, 1 / temperature)
Схема квадратур по умолчанию выбирает z_{N, n} в качестве N середин квантилей p(z) (обобщенных квантилей, если K > 2).
Подробнее см. [Диллон и Ленгмор (2018)][1].
О Vector распределениях в TensorFlow.
VectorDiffeomixture — это нестандартное распределение, обладающее свойствами, особенно полезными в методах вариационного байесовского анализа.
При обусловленности извлечением из SoftmaxNormal, X|z — это вектор, компоненты которого являются линейными комбинациями аффинных преобразований, поэтому само по себе является аффинным преобразованием.
Примечание: Маргинальные распределенияX_1|v, ..., X_d|vне обычно совпадают с какой-либо параметризациейdistribution. Это связано с тем, что сумма извлечённых значений изdistributionобычно не равна самомуdistribution.
О Diffeomixture и перепараметризации.
VectorDiffeomixture разработан для перепараметризации, т.е. его параметры используются только для преобразования выборок из распределения, не имеющего обучаемых параметров. Это свойство важно, потому что обратное распространение останавливается на источниках случайности. То есть, пока параметры используются после основного источника случайности, вычисленный градиент является точным.
Перепараметризация означает, что мы можем использовать градиентный спуск (через обратное распространение) для оптимизации задач Монте-Карло. Такие задачи представляют собой аппроксимацию конечной выборки ожидания и возникают во многих научных вычислениях.
Примеры
import tensorflow_probability as tfp
tfd = tfp.distributions
# Create two batches of VectorDiffeomixtures, one with mix_loc=[0.],
# another with mix_loc=[1]. In both cases, `K=2` and the affine
# transformations involve:
# k=0: loc=zeros(dims) scale=LinearOperatorScaledIdentity
# k=1: loc=[2.]*dims scale=LinOpDiag
dims = 5
vdm = tfd.VectorDiffeomixture(
mix_loc=[[0.], [1]],
temperature=[1.],
distribution=tfd.Normal(loc=0., scale=1.),
loc=[
None, # Equivalent to `np.zeros(dims, dtype=np.float32)`.
np.float32([2.]*dims),
],
scale=[
tf.linalg.LinearOperatorScaledIdentity(
num_rows=dims,
multiplier=np.float32(1.1),
is_positive_definite=True),
tf.linalg.LinearOperatorDiag(
diag=np.linspace(2.5, 3.5, dims, dtype=np.float32),
is_positive_definite=True),
],
validate_args=True)
Литература
[1]: Джошуа Диллон и Иэн Ленгмор. Квадратурная смесь: аппроксимирующее семейство распределений. arXiv preprint arXiv:1801.03080, 2018. https://arxiv.org/abs/1801.03080
| Аргументы | |
|---|---|
mix_loc | Распределение, подобное float со формой [b1, ..., bB, K-1]. С точки зрения выборок, большее mix_loc[..., k] ==> Z будет с большей вероятностью отдавать больший вес своей kth компоненте. |
temperature | Распределение, подобное float Tensor. Совместимо по передаче с mix_loc. С точки зрения выборок, меньшее значение temperature означает, что одна компонента будет с большей вероятностью доминировать. То есть меньшее значение temperature заставляет VDM выглядеть более похожим на стандартную смесь K компонентов. |
distribution | Экземпляр, подобный tf.Distribution . Распределение, из которого d независимых идентично распределенных выборок используются в качестве входных данных для выбранного аффинного преобразования. Должно быть скалярным распределением с пакетной и событийной размерностью 1. Обычно distribution.reparameterization_type = FULLY_REPARAMETERIZED или является функцией от необучаемых параметров. ВНИМАНИЕ: если вы производите обратное распространение через образец VectorDiffeomixture и distribution не является FULLY_REPARAMETERIZED , но является функцией обучаемых переменных, градиент будет некорректным! |
loc | Список длины K float-типовых Tensor. Элемент с индексом k представляет shift , используемый для k аффинного преобразования. Если элемент с индексом k равен None, то loc подразумевается как 0 . Если указано, размерность должна быть [B1, ..., Bb, d], где b >= 0 и d — размерность события. |
scale | Список длины K LinearOperator. Каждый должен быть положительно определенным и действовать в d-мерном векторном пространстве. Элемент с индексом k представляет scale , используемый для k аффинного преобразования. LinearOperator должны иметь размерность [B1, ..., Bb, d, d], b >= 0, т.е. описывают b пакетов d x d матриц |
quadrature_size | Скалярное значение типа Python, представляющее количество точек квадратуры. Большее значение quadrature_size означает, что q_N(x) лучше аппроксимирует p(x) . |
quadrature_fn | Python-функция, принимающая normal_loc, normal_scale, quadrature_size, validate_args и возвращающая tuple(grid, probs) сетку SoftmaxNormal и соответствующий нормированный вес. нормированный) вес. Значение по умолчанию: quadrature_scheme_softmaxnormal_quantiles. |
validate_args | Python-скаляр, значение по умолчанию False . Когда True проверка параметров распределения на корректность, несмотря на возможное ухудшение производительности. При False недопустимые входные данные могут незаметно привести к некорректным результатам. |
allow_nan_stats | Python-скаляр, значение по умолчанию True . Когда True, для статистик (например, среднего, моды, дисперсии) используется значение «NaN» для обозначения того, что результат неопределён. При False, возникает исключение, если один или несколько статистических элементов пакета имеют неопределённое значение. |
name | Имя Python-строка, добавляемое к операциям, созданным этим классом. |
| Исключения | |
|---|---|
ValueError | если not scale or len(scale) < 2. |
ValueError | если len(loc) != len(scale) |
ValueError | если quadrature_grid_and_probs is not None и len(quadrature_grid_and_probs[0]) != len(quadrature_grid_and_probs[1]) |
ValueError | если validate_args и какой-либо scale не является положительно определённым. |
TypeError | если тип данных какой-либо scale отличается от типа данных scale[0]. |
TypeError | если тип данных какой-либо loc отличается от типа данных scale[0]. |
NotImplementedError | если len(scale) != 2. |
ValueError | если not distribution.is_scalar_batch. |
ValueError | если not distribution.is_scalar_event. |
| Атрибуты | |
|---|---|
allow_nan_stats | Python bool описывающий поведение, когда статистика не определена. Статистики возвращают +/- бесконечность, когда это имеет смысл. Например, дисперсия распределения Коши равна бесконечности. Однако иногда статистика не определена, например, если плотность распределения не достигает максимума в области определения распределения, мода не определена. Если среднее значение не определено, то по определению дисперсия также не определена. Например, среднее значение для распределения Стьюдента при df = 1 не определено (нет ясного способа сказать, что оно либо + или - бесконечность), поэтому дисперсия = E[(X - среднее)**2] также не определена. |
batch_shape | Форма одного образца из одного индекса события как TensorShape. Может быть частично определена или неизвестна. Размеры пакетных данных — индексы независимых, не идентичных параметризаций этого распределения. |
distribution | Базовое скалярно-событийное, скалярно-пакетное распределение. |
dtype | Размер Tensor обрабатываемый этим Distribution. |
endpoint_affine | Аффинное преобразование для каждого из K компонентов. |
event_shape | Форма одного образца из одного пакета как TensorShape. Может быть частично определена или неизвестна. |
grid | Матрица смешивающих вероятностей, одна для каждой точки сетки. |
interpolated_affine | Аффинное преобразование для каждой выпуклой комбинации K компонентов. |
mixture_distribution | Распределение, используемое для выбора выпуклой комбинации аффинных преобразований. |
name | Имя, добавляемое перед всеми операциями, созданными этим Distribution. |
parameters | Словарь параметров, используемых для создания экземпляра этого Distribution. |
reparameterization_type | Описывает, как образцы из распределения повторно параметризуются. В настоящее время это один из статических экземпляров |
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]
где Cov — (пакет) k' x k' матриц, 0 <= (i, j) < k' = reduce_prod(event_shape), и Vec — некоторая функция, отображающая индексы измерений событий данного распределения на индексы вектора длины k'.
| Аргументы | |
|---|---|
name | Python str добавляемое к именам операций, созданных этой функцией. |
| Возвращает | |
|---|---|
covariance | Числовое значение с плавающей точкой формы [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 с формой [B1, ..., Bn] представляющее n различные вычисления перекрёстной энтропии. |
entropy
entropy(
name='entropy'
)
Энтропия Шеннона в натах.
event_shape_tensor
event_shape_tensor(
name='event_shape_tensor'
)
Форма одного образца из одного пакета как одномерный целочисленный тензор 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 | имя для добавления в начало операций. |
| Возвращаемое значение | |
|---|---|
словарь имени параметра к формам Tensor. |
param_static_shapes
@classmethod
param_static_shapes(
sample_shape
)
param_static_shapes с постоянными (т.е. TensorShape) формами.
Это метод класса, который описывает, какие пары "ключ-значение" необходимы для создания экземпляра данного Distribution, чтобы получить определенную форму для вызова sample() этим экземпляром. Предполагается, что форма выборки известна статически.
Подклассы должны переопределять метод класса _param_shapes для возврата тензоров с постоянными значениями при подаче постоянных значений.
| Аргументы | |
|---|---|
sample_shape | TensorShape или список/кортеж Python. Желаемая форма вызова sample(). |
| Возвращаемое значение | |
|---|---|
словарь имени параметра к TensorShape. |
| Исключения | |
|---|---|
ValueError | если sample_shape является TensorShape и не полностью определен. |
prob
prob(
value, name='prob'
)
Плотность/масса вероятности.
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Pythonский str добавляемый в имена операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
prob | тензор Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
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ский str добавляемый в имена операций, созданных этой функцией. |
| Возвращает | |
|---|---|
quantile | массив Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
sample
sample(
sample_shape=(), seed=None, name='sample'
)
Генерирует образцы заданной формы.
Обратите внимание, что вызов sample() без аргументов сгенерирует один образец.
| Аргументы | |
|---|---|
sample_shape | 0D или 1D int32 Tensor. Форма генерируемых образцов. |
seed | Целочисленный псевдослучайный генератор (Python) |
name | имя операции. |
| Возвращает | |
|---|---|
samples | массив Tensor с добавленными размерностями sample_shape. |
stddev
stddev(
name='stddev'
)
Среднее квадратическое отклонение.
Среднее квадратическое отклонение определяется как,
stddev = E[(X - E[X])**2]**0.5
где X — случайная величина, связанная с этим распределением, E обозначает математическое ожидание, и stddev.shape = batch_shape + event_shape.
| Аргументы | |
|---|---|
name | строка, добавляемая в начало имён операций, созданных этой функцией. |
| Возвращает | |
|---|---|
stddev | число с плавающей запятой Tensor с формой, идентичной batch_shape + event_shape, т.е. такой же формы, как и self.mean(). |
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 | строка, добавляемая в начало имён операций, созданных этой функцией. |
| Возвращает | |
|---|---|
Tensor формы sample_shape(x) + self.batch_shape со значениями типа self.dtype. |
variance
variance(
name='variance'
)
Дисперсия.
Дисперсия определяется как,
Var = E[(X - E[X])**2]
где X — случайная величина, связанная с этим распределением, E обозначает математическое ожидание, и Var.shape = batch_shape + event_shape.
| Аргументы | |
|---|---|
name | строка, добавляемая в начало имён операций, созданных этой функцией. |
| Возвращает | |
|---|---|
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/VectorDiffeomixture