Ресурсы Инструменты вероятностного программирования: официальное введение в TensorFlow Probability

искусственный интеллект TensorFlow

из среды

автор: Джош Диллон, Майк Шве, Дастин Тран

Сборник "Сердце машины"

принимать участие: Бай Юсинь, Ли Цзэнань

На саммите разработчиков TensorFlow в 2018 году Google анонсировала TensorFlow Probability, набор инструментов вероятностного программирования, который исследователи и практики машинного обучения могут использовать для быстрого и надежного создания современных сложных аппаратных моделей.

Вероятность TensorFlow подходит для следующих нужд:

  • Хотите построить генеративную модель данных, чтобы рассуждать о ее скрытых процессах.

  • Неопределенность в прогнозах необходимо измерять количественно, а не прогнозировать отдельные значения.

  • Обучающий набор имеет большое количество функций по отношению к количеству точек данных.

  • Структурированные данные (например, с использованием группировки, пространственной, диаграммной или лингвистической семантики) и структура, в которой вы хотите зафиксировать важную информацию. Существует обратная задача — пожалуйста, обратитесь к разговорному видео TFDS'18 (https://www.youtube.com/watch?v=Bb1_zlrjo1c), чтобы реконструировать термоядерную плазму по измерениям.

Вероятность TensorFlow может решить эти проблемы. Он унаследовал преимущества TensorFlow, такие как автоматическая дифференциация и возможность масштабирования производительности на нескольких платформах (CPU, GPU и TPU).

Какие возможности есть у TensorFlow Probability?

Вероятностные инструменты машинного обучения Google предоставляют модульные абстракции для вероятностных выводов и статистического анализа в экосистеме TensorFlow.

Схематическая диаграмма структуры вероятности TensorFlow. Набор инструментов вероятностного программирования для специалистов по данным и статистиков, а также для всех пользователей TensorFlow.

Уровень 0: TensorFlow.Числовые операции. LinearOperator выполняет эффективные вычисления с помощью специальных структур (диагональных, низкоранговых и т. д.) вместо матриц. Он создается и поддерживается командой TensorFlow Probability и теперь является частью ядра TensorFlow tf.linalg.

Уровень 1: Статистические строительные блоки

  • Распределения (tf.contrib.distributions, tf.distributions): содержит большое количество вероятностных распределений и связанных статистических данных, а также пакетную семантику и широковещательную семантику.

  • Биекторы (tf.contrib.distributions.bijectors): комбинаторные преобразования обратимых случайных величин. Биекторы предоставляют богатый класс преобразованных распределений, начиная от классических примеров (таких как логнормальное распределение) и заканчивая сложными моделями глубокого обучения (такими как замаскированные авторегрессионные потоки).

Уровень 2: построение модели

  • Edward2 (tfp.edward2): это вероятностный язык программирования, который задает гибкие вероятностные модели в виде программ.

  • Вероятностные слои (tfp.layers): они представляют функции с неопределенностью для слоев нейронной сети, расширяя слои TensorFlow.

  • Обучаемые распределения (tfp.trainable_distributions): распределения вероятностей, параметризованные одним тензором, что упрощает создание нейронных сетей, которые выводят распределения вероятностей.

Уровень 3: вероятностный вывод

  • Цепь Маркова Метод Монте-Карло (tfp.mcmc): Алгоритм аппроксимации интегралов путем выборки. Включает гамильтониан Монте-Карло (алгоритм HMC), стохастический процесс Метрополиса-Гастингса и возможность создавать собственные переходные ядра.

  • Вариационный вывод (tfp.vi): Алгоритмы аппроксимации интегралов посредством оптимизации.

  • оптимизатор (tfp.optimizer): метод стохастической оптимизации, расширяющий оптимизатор TensorFlow. Включает стохастическую градиентную динамику Ланжевена.

  • Монте-Карло (tfp.monte_carlo): Инструмент для расчета ожиданий Монте-Карло.

Уровень 4: готовые модели и выводы (по аналогии с готовыми оценщиками TensorFlow).

Байесовские структурированные временные ряды (скоро): высокоуровневый интерфейс для подбора моделей временных рядов (например, R-подобный пакет BSTS).

Обобщенные линейные смешанные модели (скоро): высокоуровневый интерфейс для подбора моделей регрессии со смешанными эффектами (т. е. аналогичный пакету R lme4).

Команда TensorFlow Probability стремится поддерживать пользователей и участников с помощью новейших функций, постоянных обновлений кода и исправлений ошибок. Google заявляет, что в будущем инструмент продолжит добавлять сквозные примеры и учебные пособия.

Давайте посмотрим несколько примеров!

Линейная модель смешанных эффектов Edward2

Линейные модели смешанных эффектов — это простой способ моделирования структурированных отношений в данных. Также известная как иерархическая линейная модель, она разделяет статистическую силу между группами точек данных, чтобы улучшить выводы о любой отдельной точке данных.

Демо учитывает набор данных InstEval из популярного пакета lme4 в R, который содержит университетские курсы и их оценочные рейтинги. Используя TensorFlow Probability, мы указываем модель как вероятностную программу Edward2 (tfp.edward2), которая расширяет Edward. Следующая программа определяет модель на основе процесса ее генерации.

import tensorflow as tffrom tensorflow_probability import edward2 as eddef model(features):  # Set up fixed effects and other parameters.  intercept = tf.get_variable("intercept", [])  service_effects = tf.get_variable("service_effects", [])  student_stddev_unconstrained = tf.get_variable(      "student_stddev_pre", [])  instructor_stddev_unconstrained = tf.get_variable(      "instructor_stddev_pre", [])  # Set up random effects.  *student_effects = ed.MultivariateNormalDiag(      loc=tf.zeros(num_students),      scale_identity_multiplier=tf.exp(          student_stddev_unconstrained),      name="student_effects")  instructor_effects = ed.MultivariateNormalDiag(      loc=tf.zeros(num_instructors),      scale_identity_multiplier=tf.exp(          instructor_stddev_unconstrained),      name="instructor_effects")*  # Set up likelihood given fixed and random effects.  *ratings = ed.Normal(      loc=(service_effects * features["service"] +           tf.gather(student_effects, features["students"]) +           tf.gather(instructor_effects, features["instructors"]) +           intercept),      scale=1.,      name="ratings")*return ratingsскопировать код

Модель принимает на вход словарь признаков «услуга», «ученик» и «преподаватель», и для каждого элемента описывает вектор отдельного курса. Модель регрессирует на основе этих входных данных, предполагая лежащие в их основе случайные переменные, и возвращает распределение оценочных баллов по курсу. Сеанс TensorFlow, запущенный на этом выходе, вернет оценку yigediedai для одной итерации.

Вы можете ознакомиться с учебным пособием «Линейные модели смешанных эффектов», чтобы узнать больше о том, как обучить модель с помощью алгоритма tfp.mcmc.HamiltonianMonteCarlo и как использовать апостериорные прогнозы для изучения и интерпретации модели.

Гауссовы копулы и биекторы TFP

Копулы - это многомерные распределения вероятностей, в которых предельные распределения вероятностей для каждой переменной однородны. Для создания копул, использующих встроенные функции TFP, можно использовать Bijectors и TransformedDistribution. Эти абстракции могут легко создавать сложные дистрибутивы, такие как:

import tensorflow_probability as tfptfd = tfp.distributionstfb = tfp.distributions.bijectors# Example: Log-Normal Distributionlog_normal = tfd.TransformedDistribution(    distribution=tfd.Normal(loc=0., scale=1.),    bijector=*tfb.Exp*())# Example: Kumaraswamy DistributionKumaraswamy = tfd.TransformedDistribution(    distribution=tfd.Uniform(low=0., high=1.),    bijector=*tfb.Kumaraswamy*(        concentration1=2.,        concentration0=2.))# Example: Masked Autoregressive Flow# https://arxiv.org/abs/1705.07057shift_and_log_scale_fn = *tfb.masked_autoregressive_default_template*(    hidden_layers=[512, 512],    event_shape=[28*28])maf = tfd.TransformedDistribution(    distribution=tfd.Normal(loc=0., scale=1.),         bijector=*tfb.MaskedAutoregressiveFlow*(        shift_and_log_scale_fn=shift_and_log_scale_fn))скопировать код

Гауссова копула создает несколько пользовательских биекторов, а затем показывает, как легко построить несколько копул. Дополнительные сведения о распределениях см. в разделе «Понимание формы тензорных распределений трафика». В нем описывается, как управлять выборкой, пакетным обучением и моделировать форму событий.

Вариационный автоэнкодер с утилитами TFP

Вариационный автоэнкодер — это модель машинного обучения, которая использует одну систему обучения для представления данных в некотором низкоразмерном пространстве, а вторую систему обучения — для восстановления низкоразмерных данных до исходных входных значений. Поскольку TensorFlow поддерживает автоматическое дифференцирование, вариационный вывод по методу «черного ящика» очень прост!

Пример:

import tensorflow as tfimport tensorflow_probability as tfp# Assumes user supplies `likelihood`, `prior`, `surrogate_posterior`# functions and that each returns a # tf.distribution.Distribution-like object.elbo_loss = *tfp.vi.monte_carlo_csiszar_f_divergence(    *f=*tfp.vi.kl_reverse*,  # Equivalent to "Evidence Lower BOund"    p_log_prob=lambda z: likelihood(z).log_prob(x) + prior().log_prob(z),    q=surrogate_posterior(x),    num_draws=1)train = tf.train.AdamOptimizer(    learning_rate=0.01).minimize(elbo_loss)скопировать код

Чтобы увидеть больше деталей, ознакомьтесь с нашим примером вариационного автоэнкодера!

Байесовская нейронная сеть со слоем вероятности TFP

Байесовская нейронная сеть — это нейронная сеть с априорным распределением весов и смещений. Это обеспечивает более продвинутую неопределенность посредством этих априорных значений. Байесовскую нейронную сеть также можно интерпретировать как бесконечный набор нейронных сетей: вероятность, приписываемая каждой конфигурации нейронной сети, сообщается априори.

В качестве демонстрации рассмотрим набор данных CIFAR-10 с функциями (изображения формы 32 × 32 × 3) и метками (значения от 0 до 9). Чтобы подогнать нейронную сеть, мы будем использовать вариационный вывод, который представляет собой набор методов для аппроксимации апостериорного распределения весов и смещений нейронной сети. То есть мы используем недавно выпущенный оценщик Flipout в модуле TensorFlow Probabilistic Layers (tfp.layers).

import tensorflow as tfimport tensorflow_probability as tfpdef neural_net(inputs):  net = tf.reshape(inputs, [-1, 32, 32, 3])  *net = tfp.layers.Convolution2DFlipout(filters=64,                                        kernel_size=5,                                        padding='SAME',                                        activation=tf.nn.relu)(net)*  net = tf.keras.layers.MaxPooling2D(pool_size=2,                                     strides=2,                                     padding='SAME')(net)  net = tf.reshape(net, [-1, 8 * 8 * 64])  *net = tfp.layers.DenseFlipout(units=10)(net)*  return net# Build loss function for training.logits = neural_net(features)neg_log_likelihood = tf.nn.softmax_cross_entropy_with_logits(    labels=labels, logits=logits)kl = sum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))loss = neg_log_likelihood + kltrain_op = tf.train.AdamOptimizer().minimize(loss)скопировать код

Функция neuro_net формирует слои нейронной сети на входных тензорах и выполняет случайные прямые проходы для вероятностных сверточных и вероятностных плотносвязанных слоев. Функция возвращает выходной тензор формы с размером пакета 10. Каждая строка тензора представляет логиты (неограниченные значения вероятности), что каждая точка данных принадлежит к одной из 10 категорий.

Нам нужно построить функцию потерь для обучения, которая состоит из двух членов: ожидаемого отрицательного логарифмического правдоподобия и расхождения KL. Мы можем аппроксимировать ожидаемое отрицательное логарифмическое правдоподобие методом Монте-Карло. Дивергенция KL добавляется через члены регуляризации, которые являются параметрами слоя.

tfp.layers также можно использовать для быстрого выполнения с помощью класса tf.keras.Model.

class MNISTModel(tf.keras.Model):  def __init__(self):    super(MNISTModel, self).__init__()    *self.dense1 = tfp.layers.DenseFlipout(units=10)    self.dense2 = tfp.layers.DenseFlipout(units=10)*  def call(self, input):    """Run the model."""    result = self.dense1(input)    result = self.dense2(result)    # reuse variables from dense2 layer    result = self.dense2(result)      return resultmodel = MNISTModel()скопировать код

Начать быстро

Перейдите по ссылке ниже, чтобы начать работу с вероятностным машинным обучением в TensorFlow:

pip install --user --upgrade tfp-nightlyскопировать код

Весь код и подробности можно найти на github.com/tensorflow/probability. Google хочет иметь возможность сотрудничать со всеми разработчиками через GitHub.

Оригинальная ссылка: https://medium.com/tensorflow/introducing-tensorflow-probability-dca4c304e245

Эта статья составлена ​​для сердца машины,Для перепечатки, пожалуйста, свяжитесь с этим официальным аккаунтом для авторизации .

✄------------------------------------------------

Присоединяйтесь к сердцу машины (штатный репортер/стажер): hr@jiqizhixin.com

Внесите свой вклад или запросите освещение: editor@jiqizhixin.com

Реклама и деловое сотрудничество: bd@jiqizhixin.com