Spec-Zone.ru › TensorFlow 1.15

tf.contrib.distributions.bijectors.RealNVP

RealNVP «слой аффинного сопряжения» для векторных событий.

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

tf.contrib.distributions.bijectors.RealNVP(
    num_masked, shift_and_log_scale_fn, is_constant_jacobian=False,
    validate_args=False, name=None
)

Real NVP моделирует нормализующее потоковое распределение в D-мерном распределении с помощью одного D-d-мерного условного распределения [(Dinh et al., 2017)][1]:

y[d:D] = y[d:D] * math_ops.exp(log_scale_fn(y[d:D])) + shift_fn(y[d:D]) y[0:d] = x[0:d]

Последние D-d единицы масштабируются и смещаются на основе первых d единиц, в то время как первые d единицы «маскируются» и остаются неизменными. Real NVP's shift_and_log_scale_fn вычисляет векторные величины. Для преобразований масштабирования и сдвига, которые не зависят от каких-либо замаскированных единиц, т.е. d=0, используйте tfb.Affine биджектор с обученными параметрами вместо этого.

Маскирование в настоящее время поддерживается только для базовых распределений с event_ndims=1. Для более сложных схем маскирования, таких как шахматная или канально-ориентированная маскировка [(Papamakarios et al., 2016)[4], используйте tfb.Permute биджектор для переупорядочения требуемых замаскированных единиц в первые d единицы. Для базовых распределений с event_ndims > 1, используйте tfb.Reshape биджектор для сведения формы события.

Обратите внимание, что биджектор MAF [(Papamakarios et al., 2016)][4] реализует нормализующее поток с помощью авторегрессивного преобразования. MAF и IAF имеют противоположные вычислительные компромиссы — MAF может обучать все единицы параллельно, но должен генерировать единицы последовательно, в то время как IAF должен обучать единицы последовательно, но может генерировать параллельно. В отличие от этого, Real NVP может вычислять как прямые, так и обратные вычисления параллельно. Однако отсутствие авторегрессивных преобразований делает его менее выразительным на уровне каждого биджектора.

«Валидный» shift_and_log_scale_fn должен вычислять каждую shift (также известную как loc или «mu» в [Papamakarios et al. (2016)][4]) и log(scale) (также известную как «alpha» в [Papamakarios et al. (2016)][4]) таким образом, чтобы каждая из них могла быть передана с аргументами для forward и inverse, т. е. такие, чтобы вычисления в forward, inverse [ниже] были возможны. Для удобства предлагается функция real_nvp_default_nvp в качестве возможной функции shift_and_log_scale_fn.

NICE [(Dinh et al., 2014)][2] — это частный случай биджектора Real NVP, который отбрасывает масштабирование, что приводит к постоянному времени обратного логарифма определителя якобиана. Чтобы использовать биджектор NICE вместо Real NVP, shift_and_log_scale_fn должно возвращать (shift, None), а is_constant_jacobian должно быть установлено на True в конструкторе RealNVP. Вызов real_nvp_default_template с shift_only=True возвращает один такой совместимый с NICE shift_and_log_scale_fn.

Кэширование: глубина скалярного входа D базового распределения неизвестна во время построения. Первый вызов любого из forward(x), inverse(x), inverse_log_det_jacobian(x), или forward_log_det_jacobian(x) запоминает D, который используется повторно в последующих вызовах. Эта форма должна быть известна до выполнения графика (что выполняется при использовании tf.layers).

Пример использования

import tensorflow_probability as tfp
tfd = tfp.distributions
tfb = tfp.bijectors

# A common choice for a normalizing flow is to use a Gaussian for the base
# distribution. (However, any continuous distribution would work.) E.g.,
num_dims = 3
num_samples = 1
nvp = tfd.TransformedDistribution(
    distribution=tfd.MultivariateNormalDiag(loc=np.zeros(num_dims)),
    bijector=tfb.RealNVP(
        num_masked=2,
        shift_and_log_scale_fn=tfb.real_nvp_default_template(
            hidden_layers=[512, 512])))

x = nvp.sample(num_samples)
nvp.log_prob(x)
nvp.log_prob(np.zeros([num_samples, num_dims]))

Для получения дополнительных примеров см. [Jang (2018)][3].

Список литературы

[1]: Laurent Dinh, Jascha Sohl-Dickstein и Samy Bengio. Оценка плотности с помощью Real NVP. В Международной конференции по представлениям о машинном обучении, 2017. https://arxiv.org/abs/1605.08803

[2]: Laurent Dinh, David Krueger и Yoshua Bengio. NICE: Оценка нелинейных независимых компонентов. arXiv preprint arXiv:1410.8516, 2014. https://arxiv.org/abs/1410.8516

[3]: Эрик Джанг. Руководство по нормализующим потокам, часть 2: Современные нормализующие потоки. Технический отчет, 2018. http://blog.evjang.com/2018/01/nf2.html

[4]: Джордж Папамакариос, Тео Павлаку и Айэн Мюррей. Маскированный авторегрессивный поток для оценки плотности. В Нейронных системах обработки информации, 2017. https://arxiv.org/abs/1705.07057

Args
num_masked Python int указывающий, что первые d единицы события должны быть замаскированы. Должен находиться в замкнутом интервале [1, D-1], где D — размер события базового распределения.
shift_and_log_scale_fn Python callable, который вычисляет shift и log_scale как из прямого домена (x), так и из обратного домена (y). Вычисление должно соблюдать «свойство авторегрессии» (см. строку документации класса). Предлагаемый по умолчанию masked_autoregressive_default_template(hidden_layers=...). Обычно функция содержит tf.Variables и обернута с помощью tf.compat.v1.make_template. Возвращение None для любого (обоих) shift, log_scale эквивалентно (но более эффективно), чем возвращение нуля.
is_constant_jacobian Python bool. Значение по умолчанию: False. При True реализация предполагает, что log_scale не зависит от значений прямого домена (x) или обратного домена (y). (Валидация не выполняется; is_constant_jacobian=False всегда безопасен, но потенциально вычислительно неэффективен.)
validate_args Python bool указывающий, должны ли проверяться аргументы на правильность.
name Python str, имя, заданное для операций, управляемых этим объектом.
Raises
ValueError Если num_masked < 1.
Attributes
dtype тип Tensor преобразуемых этим распределением.
forward_min_event_ndims Возвращает минимальное количество измерений, на которых работает bijector.forward.
graph_parents Возвращает graph_parents этого Bijector как список Python.
inverse_min_event_ndims Возвращает минимальное количество измерений, на которых работает bijector.inverse.
is_constant_jacobian Возвращает true, если матрица якобиана не является функцией от x.
Примечание: Матрица якобиана либо постоянна для прямого и обратного, либо ни для того, ни для другого.
name Возвращает строковое имя этого Bijector.
validate_args Возвращает True, если аргументы Tensor будут проверены.

Методы

forward

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

forward(
    x, name='forward'
)

Возвращает вычисление прямого Bijector, т. е. X = g(Y).

Args
x Tensor. Вход в «прямое» вычисление.
name Имя, которое нужно дать этой операции.
Returns
Tensor.
Raises
TypeError если self.dtype указано, а x.dtype не self.dtype.
NotImplementedError если _forward не реализовано.

forward_event_shape

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

forward_event_shape(
    input_shape
)

Форма одного образца из одной партии как TensorShape.

То же значение, что и у forward_event_shape_tensor. Может быть частично определено.

Args
input_shape TensorShape, указывающий на форму части события, переданную в функцию forward.
Returns
forward_event_shape_tensor TensorShape, указывающий на форму части события после применения forward. Возможно неизвестно.

forward_event_shape_tensor

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

forward_event_shape_tensor(
    input_shape, name='forward_event_shape_tensor'
)

Форма одного образца из одной партии как вектор int32 1D Tensor.

Args
input_shape Tensor, вектор int32 указывающий на форму части события, переданную в функцию forward .
name имя операции
Returns
forward_event_shape_tensor Tensor, вектор int32 указывающий на форму части события после применения forward.

forward_log_det_jacobian

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

forward_log_det_jacobian(
    x, event_ndims, name='forward_log_det_jacobian'
)

Возвращает как forward_log_det_jacobian.

Аргументы
x Tensor. Входное значение для вычисления обратной якобиановой матрицы.
event_ndims Число измерений в преобразуемых вероятностных событиях. Должно быть больше или равно self.forward_min_event_ndims. Результат суммируется по последним измерениям для получения скалярного определителя якобиановой матрицы для каждого события, т.е. имеет размерность x.shape.ndims - event_ndims .
name Имя для данного оператора.
Возвращаемое значение
Tensor, если этот биектор является инъективным. Если нет, то это не реализовано.
Исключения
TypeError если self.dtype задано, а y.dtype не self.dtype.
NotImplementedError если ни _forward_log_det_jacobian ни {_inverse, _inverse_log_det_jacobian} не реализованы, или это неинъективный биектор.

inverse

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

inverse(
    y, name='inverse'
)

Возвращает обратное вычисление Bijector, т.е., X = g^{-1}(Y).

Аргументы
y Tensor. Входное значение для обратного вычисления.
name Имя для данного оператора.
Возвращаемое значение
Tensor, если этот биектор является инъективным. Если нет, то возвращает k-кортеж, содержащий уникальные k точки (x1, ..., xk) такие, что g(xi) = y.
Исключения
TypeError если self.dtype задано, а y.dtype не self.dtype.
NotImplementedError если _inverse не реализовано.

inverse_event_shape

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

inverse_event_shape(
    output_shape
)

Форма одного образца из одной партии как TensorShape.

То же самое, что и inverse_event_shape_tensor. Может быть частично определена.

Аргументы
output_shape TensorShape указывающая форму части события, переданной в функцию inverse .
Возвращаемое значение
inverse_event_shape_tensor TensorShape указывающая форму части события после применения inverse. Возможно неизвестна.

inverse_event_shape_tensor

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

inverse_event_shape_tensor(
    output_shape, name='inverse_event_shape_tensor'
)

Форма одного образца из одной партии как int32 1D Tensor.

Аргументы
output_shape Tensor, int32 вектор, указывающий форму части события, переданной в функцию inverse .
name имя для данного оператора
Возвращаемое значение
inverse_event_shape_tensor Tensor, int32 вектор, указывающий форму части события после применения inverse.

inverse_log_det_jacobian

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

inverse_log_det_jacobian(
    y, event_ndims, name='inverse_log_det_jacobian'
)

Возвращает (log o det o Jacobian o inverse)(y).

Математически возвращает: log(det(dX/dY))(Y). (Напомним, что: X=g^{-1}(Y).)

Обратите внимание, что forward_log_det_jacobian является отрицанием этой функции, вычисленной в g^{-1}(y).

Аргументы
y Tensor. Входное значение для вычисления обратной якобиановой матрицы.
event_ndims Число измерений в преобразуемых вероятностных событиях. Должно быть больше или равно self.inverse_min_event_ndims. Результат суммируется по последним измерениям для получения скалярного определителя якобиановой матрицы для каждого события, т.е. имеет размерность y.shape.ndims - event_ndims .
name Имя для данного оператора.
Возвращаемое значение
Tensor, если этот биектор является инъективным. Если нет, то возвращает кортеж локальных логарифмов определителей якобианов, log(det(Dg_i^{-1}(y))), где g_i является ограничением g на ith разбиение Di.
Исключения
TypeError если self.dtype задано, а y.dtype не self.dtype.
NotImplementedError если _inverse_log_det_jacobian не реализовано.

© 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/bijectors/RealNVP

Spec-Zone.ru

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