Spec-Zone.ru › TensorFlow 1.15

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 разработан для перепараметризации, т.е. его параметры используются только для преобразования выборок из распределения, не имеющего обучаемых параметров. Это свойство важно, потому что обратное распространение останавливается на источниках случайности. То есть, пока параметры используются после основного источника случайности, вычисленный градиент является точным.

Перепараметризация означает, что мы можем использовать градиентный спуск (через обратное распространение) для оптимизации задач Монте-Карло. Такие задачи представляют собой аппроксимацию конечной выборки ожидания и возникают во многих научных вычислениях.

Предупреждение: Если вы производите обратное распространение через образец VectorDiffeomixture, и «базовое» распределение является одновременно: не FULLY_REPARAMETERIZED и функцией обучаемых переменных, то градиент гарантированно неверен!

Примеры

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 Описывает, как образцы из распределения повторно параметризуются.

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

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

Spec-Zone.ru

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