tf.contrib.distributions.QuantizedDistribution
Распределение, представляющее квантование Y = ceiling(X).
Наследуется от: Distribution
tf.contrib.distributions.QuantizedDistribution(
distribution, low=None, high=None, validate_args=False,
name='QuantizedDistribution'
)
Определение в терминах выборки
1. Draw X 2. Set Y <-- ceiling(X) 3. If Y < low, reset Y <-- low 4. If Y > high, reset Y <-- high 5. Return Y
Определение в терминах функции вероятностной массы
Дано скалярная случайная величина X, мы определяем дискретную случайную величину Y со значениями на целых числах следующим образом:
P[Y = j] := P[X <= low], if j == low,
:= P[X > high - 1], j == high,
:= 0, if j < low or j > high,
:= P[j - 1 < X <= j], all other j.
Понятие, без отсечений, процесс квантования разделяет действительную ось R на полуоткрытые интервалы и идентифицирует целое число j с правыми концами:
R = ... (-2, -1](-1, 0](0, 1](1, 2](2, 3](3, 4] ... j = ... -1 0 1 2 3 4 ...
P[Y = j] — это масса X внутри интервала jth. Если low = 0, и high = 2, то интервалы перерисовываются, и j переназначается:
R = (-infty, 0](0, 1](1, infty) j = 0 1 2
P[Y = j] всё ещё является массой X внутри интервала jth.
Примеры
Мы иллюстрируем смесь дискретизированных логистических распределений [(Salimans et al., 2017)][1]. Это используется, например, для захвата 16-битного аудио в WaveNet [(van den Oord et al., 2017)][2]. Значения находятся в одномерной целой области [0, 2**16-1], а дискретизация захватывает P(x - 0.5 < X <= x + 0.5) для всех x в области, за исключением конечных точек. Наименьшее значение имеет вероятность P(X <= 0.5), а наибольшее — P(2**16 - 1.5 < X).
Ниже мы предполагаем функцию wavenet. Она принимает в качестве входных данных сдвинутые вправо аудио-образцы формы [..., sequence_length]. Она возвращает вещественный тензор формы [..., num_mixtures * 3], то есть каждый компонент смеси имеет параметры loc и scale логистического распределения и параметр logits, определяющий ненормализованную вероятность этого компонента.
import tensorflow_probability as tfp
tfd = tfp.distributions
tfb = tfp.bijectors
net = wavenet(inputs)
loc, unconstrained_scale, logits = tf.split(net,
num_or_size_splits=3,
axis=-1)
scale = tf.nn.softplus(unconstrained_scale)
# Form mixture of discretized logistic distributions. Note we shift the
# logistic distribution by -0.5. This lets the quantization capture "rounding"
# intervals, `(x-0.5, x+0.5]`, and not "ceiling" intervals, `(x-1, x]`.
discretized_logistic_dist = tfd.QuantizedDistribution(
distribution=tfd.TransformedDistribution(
distribution=tfd.Logistic(loc=loc, scale=scale),
bijector=tfb.AffineScalar(shift=-0.5)),
low=0.,
high=2**16 - 1.)
mixture_dist = tfd.MixtureSameFamily(
mixture_distribution=tfd.Categorical(logits=logits),
components_distribution=discretized_logistic_dist)
neg_log_likelihood = -tf.reduce_sum(mixture_dist.log_prob(targets))
train_op = tf.train.AdamOptimizer().minimize(neg_log_likelihood)
После создания экземпляра mixture_dist мы иллюстрируем максимальное правдоподобие, вычисляя логарифмическую вероятность аудио-образцов как target и оптимизируя.
Ссылки
[1]: Tim Salimans, Andrej Karpathy, Xi Chen и Diederik P. Kingma. PixelCNN++: улучшение PixelCNN с использованием дискретизированной логистической смеси вероятностей и других модификаций. Международная конференция по представлениям о машинном обучении, 2017. https://arxiv.org/abs/1701.05517 [2]: Aaron van den Oord и др. Параллельный WaveNet: быстрый синтез речи с высоким качеством. arXiv preprint arXiv:1711.10433, 2017. https://arxiv.org/abs/1711.10433
| Аргументы | |
|---|---|
distribution | Класс базового распределения для преобразования. Обычно экземпляр Distribution . |
low | Целое число с той же размерностью, что и это распределение, и формой, которую можно добавлять к выборкам. Должно быть целым числом. По умолчанию None. Если задано, базовая функция распределения должна быть определена в low. |
high | Целое число с той же размерностью, что и это распределение, и формой, которую можно добавлять к выборкам. Должно быть целым числом. По умолчанию None. Если задано, базовая функция распределения должна быть определена в high - 1. high должно быть строго больше low . |
validate_args | Python-выражение, по умолчанию False. Когда параметры распределения True проверяются на допустимость, несмотря на возможную деградацию производительности выполнения. Когда False неверные входные данные могут втихаря генерировать некорректные выходные данные. |
name | Префикс Python-имени к операциям, созданным этим классом. |
| Исключения | |
|---|---|
TypeError | Если dist_cls не является подклассом Distribution или непрерывным. |
NotImplementedError | Если базовая функция распределения не реализует cdf. |
| Атрибуты | |
|---|---|
allow_nan_stats | Python-выражение, описывающее поведение при неопределённом статистическом показателе. Статистики возвращают +/- бесконечность, когда это имеет смысл. Например, дисперсия распределения Коши равна бесконечности. Однако иногда статистический показатель является неопределенным, например, если плотность вероятности распределения не достигает максимума в области определения распределения, мода неопределена. Если среднее значение неопределено, то дисперсия по определению тоже неопределена. Например, среднее значение для распределения Стьюдента при df = 1 неопределенно (нет явного способа сказать, что это либо + или - бесконечность), поэтому дисперсия = E[(X - mean)**2] тоже неопределена. |
batch_shape | Размерность одной выборки из одного индекса события в виде TensorShape. Может быть частично определён или неизвестен. Размерности пакетов служат индексами для независимых, нетождественных параметризаций этого распределения. |
distribution | Базовое распределение, p(x). |
dtype | Значение DType Tensor обработанных этим Distribution. |
event_shape | Размерность одной выборки из одного пакета в виде TensorShape. Может быть частично определён или неизвестен. |
high | Наибольшее значение, возвращаемое квантованием. |
low | Наименьшее значение, возвращаемое квантованием. |
name | Имя, добавляемое к операциям, созданным этим Distribution. |
parameters | Словарь параметров, используемых для создания этого Distribution. |
reparameterization_type | Описание того, как выборки из распределения повторно параметризуются. В настоящее время это один из статических экземпляров |
validate_args | Python-выражение, указывающее на то, что возможно дорогостоящие проверки включены. |
Методы
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]
Дополнительная документация из QuantizedDistribution:
Для целых чисел y:
cdf(y) := P[Y <= y]
= 1, if y >= high,
= 0, if y < low,
= P[X <= y], otherwise.
Поскольку Y имеет массу только в целых числах, P[Y <= y] = P[Y <= floor(y)]. Это подразумевает, что дробные y сначала округляются до ближайшего целого числа, и затем применяется вышеприведенное определение.
Метод cdf базового распределения должен быть определён в y - 1.
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Python-строка, добавляемая в имена операций, создаваемых этой функцией. |
| Возвращаемое значение | |
|---|---|
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 | Значение с плавающей точкой 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-D int32 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.
Дополнительная документация от QuantizedDistribution:
Для целых чисел y,
cdf(y) := P[Y <= y]
= 1, if y >= high,
= 0, if y < low,
= P[X <= y], otherwise.
Так как у Y есть масса только в целых числах, P[Y <= y] = P[Y <= floor(y)]. Это означает, что дробные y сначала округляются до ближайшего целого, а затем применяется приведенное выше определение.
Метод log_cdf базового распределения должен быть определён для y - 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'
)
Логарифм плотности/массы вероятности.
Дополнительная документация от QuantizedDistribution:
Для целых чисел y,
P[Y = y] := P[X <= low], if y == low,
:= P[X > high - 1], y == high,
:= 0, if j < low or y > high,
:= P[y - 1 < X <= y], all other y.
Метод log_cdf базового распределения должен быть определён для y - 1. Если у базового распределения есть метод log_survival_function, результаты будут более точными для больших значений y, и в этом случае метод log_survival_function также должен быть определён для y - 1.
| Аргументы | |
|---|---|
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.
Дополнительная документация из QuantizedDistribution:
Для целых чисел y,
survival_function(y) := P[Y > y]
= 0, if y >= high,
= 1, if y < low,
= P[X <= y], otherwise.
Поскольку у Y есть масса только в целых числах, P[Y <= y] = P[Y <= floor(y)]. Это означает, что дробные y сначала округляются до ближайшего целого числа, а затем применяется вышеприведённое определение.
Метод базового распределения log_cdf должен быть определён для y - 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'
)
Функция плотности/массы вероятности.
Дополнительная документация из QuantizedDistribution:
Для целых чисел y,
P[Y = y] := P[X <= low], if y == low,
:= P[X > high - 1], y == high,
:= 0, if j < low or y > high,
:= P[y - 1 < X <= y], all other y.
Метод базового распределения cdf должен быть определён для y - 1. Если у базового распределения есть метод survival_function, результаты будут более точными для больших значений y, и в этом случае survival_function также должен быть определён для y - 1.
| Аргументы | |
|---|---|
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 | Целое 0D-числовое семя для генератора псевдослучайных чисел (ПСПЧ). |
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 | Python-префикс str к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
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).
Дополнительная документация из QuantizedDistribution:
Для целых чисел y,
survival_function(y) := P[Y > y]
= 0, if y >= high,
= 1, if y < low,
= P[X <= y], otherwise.
Поскольку у Y есть масса только в целых числах, P[Y <= y] = P[Y <= floor(y)]. Это означает, что дробные y сначала округляются до ближайшего целого числа, а затем применяется вышеприведённое определение.
Метод базового распределения cdf должен быть определён для y - 1.
| Аргументы | |
|---|---|
value | float или double Tensor. |
name | Python-префикс str к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
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 | Префикс Python str, добавляемый к именам операций, созданных этой функцией. |
| Возвращаемое значение | |
|---|---|
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/QuantizedDistribution