из среды
автор: Джош Диллон, Майк Шве, Дастин Тран
Сборник "Сердце машины"
принимать участие: Бай Юсинь, Ли Цзэнань
На саммите разработчиков 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