Составление дистрибутивов с Edward и TensorFlow

На этой неделе сделал небольшой перерыв, чтобы провести небольшое исследование вероятностного программирования, хотя я не уверен, что слово «исследование» — правильное слово, поскольку я не люблю проводить эксперименты или что-то в этом роде — считается ли это исследованием, когда вы просто читаете кучу документы? Хм. Что ж, учитывая, насколько сложными были документы, я просто собираюсь продолжить и назвать это исследованием. Исполнительное решение.

По сути, я пытался ухватиться за некоторые концепции, с которыми я как бы познакомился на NeurIPS в разговоре, но на самом деле не смог присутствовать ни на одном из выступлений (трудно все увидеть). В частности, я видел в повестке дня встречу по «вероятностному программированию», которая, как бы, прошла без особого усердия заранее, так что да, в основном было что-то вроде «Я изучал вероятность, я изучал нейронные сети, как может быть пересечение? Ну получается как-то тяжело.

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

Да, и поскольку это эссе может временами быть немного сухим, вот саундтрек, чтобы поднять настроение.

Часть 1: сочинение музыки с Эдвардом

На основе обзора книги Эдвард: библиотека для вероятностного моделирования, логических выводов и критики Дастина Трана, Альпа Кукукельбира, Аджи Б. Диенг, Майи Рудольф, Давен Лян и Дэвида М. Блей (2017)arXiv:1610.09787

Я продолжу и оставлю лучшую часть для начала. Библиотека Эдварда будет в центре внимания этого эссе, поскольку она служит платформой для вероятностного программирования. Построенный на основе библиотеки распределения TensorFlow для моделирования распределений, он также позволяет использовать TensorFlow для включения элементов нейронной сети. Библиотека находится на том же уровне абстракции, что и, скажем, Keras, но в документе отмечается, что приложения между этими двумя являются своего рода ортогональными, так что они предназначены для разных задач — фактически Keras также может служить входом для элементов нейронной сети. вероятностной модели Эдварда, чтобы дать вам представление. Конечно, вероятностное программирование не ново, но что нового в платформе Edward, так это несколько моментов: во-первых, это возможность бесплатного ускорения операций GPU/TPU или даже распределенного обучения за счет построения поверх TensorFlow, во-вторых, возможность компоновки. не только вероятностных моделей, но и способности компоновать элементы логического вывода сопоставимым образом (подробнее об этом далее). В любом случае, давайте прыгнем в него. Цикл вероятностного программирования следует простому соглашению, фактически происходящему от того же ящика Джорджа Эдварда Пелхэма, в честь которого была названа библиотека.

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

  • В своей самой чистой форме сегмент «данных» на самом деле будет в значительной степени сравним по составу с тем, что можно было бы ожидать для задачи обучения с учителем. У нас будет обучающий набор, назовем его X, и некоторый соответствующий набор меток y, где целью будет моделирование взаимосвязи между X и y, где, поскольку это вероятностный фрейм, мы можем думать о нем как о моделировании p(y |Х).
  • Один из способов думать о составлении вероятностной модели — это что-то вроде создания и инициализации слоев нейронной сети. Однако это грубая аналогия, когда в нейронной сети мы создаем архитектуру нейронов, а в вероятностной композиции модели мы вместо этого создаем модель одного или нескольких распределений, параметры которых мы затем попытаемся вывести. Я собираюсь вдаваться в подробности здесь в ближайшее время, просто пытаясь заложить основу.
  • Составление вывода в некотором роде похоже на составление гиперпараметров нейронной сети — например, выбор функции потерь или алгоритма оптимизации — так что применение итераций вывода затем похоже на повторение операции обучения. Есть несколько вариантов методов вывода, мы их рассмотрим.
  • Сегмент критики, о котором вы можете думать, похож на операцию проверки контролируемого обучения. Здесь мы оцениваем, насколько хорошо работает наша модель, например, чтобы определить, является ли модель достаточной или могут быть уместны дальнейшие эксперименты с композицией распределения, что, вне рамок AutoML, обычно является ручным анализом даже в нейронных сетях, поэтому любое обновление основанный на критике, как я полагаю, обычно включает человека в петлю.

Отлично, теперь вы официально в курсе. Давайте погрузимся немного глубже.

Композиция модели

Мне как бы интересно, до какой степени это может быть интуитивно понятным для непосвященных, что значит составить модель вероятностного распределения. Позвольте мне посмотреть, смогу ли я поговорить с ним, стоит попробовать. Итак, все ли мы знаем, что такое распределение вероятностей? Я имею в виду, на всякий случай, давайте хотя бы коснемся первого этажа. Распределение вероятностей с одной переменной представляет собой фигурную кривую, представляющую вероятности извлечения значения из случайного выбора, где ось x представляет потенциально реализованное значение из случайного выбора, а ось y представляет соответствующую вероятность реализации этого значения x. Вот несколько простых распределений с одной переменной для иллюстрации — ключевой момент, о котором следует помнить: теоретики со временем каталогизировали целый зоопарк распределений, каждая из формул которых регулируется собственным набором параметров. Я имею в виду, я уверен, что мы все слышали о нормальном распределении, если нет, вам может понадобиться открыть википедию, но давайте просто вспомним пару простых распределений, чтобы поддержать повествование, одно для непрерывного распределения и одно для дискретный:

Итак, важно иметь в виду, что нет необходимости ограничивать распределения вероятностей одной переменной, на самом деле один простой тип композиции вероятностной модели может быть достигнут в Эдварде путем присвоения сопоставимого класса распределения по набору переменных, каждая из которых имеет свою собственную «ось X» и связанные с ней параметры (например, такие визуализации могут быть немного сложнее). В контексте Эдварда мы можем добиться этого, определив, скажем, (гипотетически) нормальное распределение, в котором параметры передаются как тензоры, а не скаляры. Например, если мы хотим инициализировать нормальное распределение с двумя переменными, мы можем инициализировать набор параметров нормального с векторизованным mu=[0,0], sigma=[1,1]; отмечая, что мы используем тензоры TensorFlow для этих векторов, например. инициализация с помощью tf.zeros(2) и tf.ones(2), и для большего количества переменных потенциально могут передаваться тензоры более высокого порядка, такие как матрица и т. д. На самом деле это даже не нетипичный способ инициализации нашего распределения, ( предупреждение о спойлере) весь смысл операции вывода будет заключаться в обновлении инициализированных параметров (в статически определенных классах распределения) на основе свойств данных, поэтому на самом деле просто первоначальное определение параметров, скажем, 0 или 1 - это все, что нужно - бонус это немного проще, чем соображения по инициализации весов нейронной сети.

Этот продемонстрированный тип распределения двух переменных является лишь одним из способов, которыми мы можем смешивать и формировать наши вероятностные модели. В документе отмечается, что Эдвард на самом деле является полным по Тьюрингу вероятностным языком программирования, что означает, что он может моделировать любое вычислимое распределение вероятностей. Если мы хотим добраться до некоторых из более экзотических разновидностей композиции моделей, учтите, что мы можем комбинировать несколько дистрибутивов несколькими способами. Например, мы могли бы сказать, что основное распределение для p(y|X) является результатом алгебраических комбинаций компонентных распределений. Другим источником композиции может быть предположение, что параметры распределения имеют свое собственное вероятностное распределение, которое можно легко смоделировать в Edward, встраивая распределение в качестве параметра для другого распределения. Другим источником композиции может быть встраивание операции управления потоком в дистрибутивы, например. Операторы if или циклы while. Да, и, конечно же, еще одним интересным средством композиции является включение определенных нейронных сетей, обученных в сочетании с операцией вывода, таких как, например, параметры, полученные нейронной сетью, или другие комбинации между нейронной сетью и смоделированной случайной величиной как функция данных (I рассмотрим пример демонстрации во второй части этого эссе). Все эти различные методы композиции демонстрируются в статье в виде визуализаций с помощью «вычислительных графиков», изображающих направления внесения параметров и данных в различные компоненты распределений (в основном набор кружков и стрелок), для краткости я буду сохраните пример для части 2 этого эссе.

О, и просто быстрое уточнение. Весь смысл этих вероятностных моделей заключается в том, чтобы облегчить создание возвращаемых выборок точек данных, характеристики распределения которых основаны на модели. Например, для смоделированного простого нормального распределения возвращаемая выборка будет представлять собой точки данных, среднее значение которых будет соответствовать переданному среднему параметру, или для распределения Бернулли модель будет возвращать выборки нулей и единиц с отношением вокруг базового параметра. (И, конечно же, по мере того, как мы увеличиваем количество «розыгрышей», распределение возвращаемой выборки будет все больше приближаться к идеальной модели).

Композиция вывода

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

Две ключевые парадигмы вывода подпадают под заголовки Вариационный вывод и Монте-Карло. Они проиллюстрированы как иерархия, соответствующая наследованию библиотечных классов, например. каждый из двух классов (VariationalInference и MonteCarlo) наследуется от главного класса Inference и сходства вниз по гнезду, где слой под этими двумя методами, я считаю, служит целевыми функциями, например, для вариационного вывода. может выбирать между минимизацией расхождения KL, также известной как относительная энтропия (например, минимизация в направлении q|p или p|q) — на самом деле соглашение о маркировке KLpq полезно для этого повествования, поэтому я просто расширю. Вероятностная модель, определенная в предыдущем разделе, — это то, что мы будем называть распределением вероятностей p, а затем распределение вероятностей, которое мы составляем для вывода, — это сопоставимое распределение, которое мы называем q. Я думаю, что разница между p и q заключается в направлении вывода — в вероятностной модели p мы начинаем с введенных параметров распределения и пытаемся создать выборки на основе связанной вероятности возвращенных точек данных, тогда как в модели вывода q мы повторно начать с обучающих точек данных и попытаться вывести соответствующие параметры — так что это почти похоже на прямой и обратный проход обратного распространения, но я не хочу, чтобы вы слишком увлекались этой аналогией с нейронной сетью. потому что это просто аналогия. Также обратите внимание, что те же самые параметры, которые я считаю, обычно вводятся как тензоры для вероятностной модели p, а затем как переменные TensorFlow для модели вывода q — разница в том, что тензоры являются временными значениями, которые постепенно обновляются посредством вывода, тогда как переменные значения, полученные явно. На самом деле, в каждой итерации вывода мы будем немного улучшать модель вывода q Переменные параметры, используя информацию, полученную из данных, введенных через заполнители TensorFlow, которые мы затем передадим вероятностной модели p в качестве обновлений соответствующих тензоров введенных параметров ( те, которые мы инициализировали только 0 и 1 в предыдущем разделе).

Другими словами, каждая из различных целевых функций использует некоторый метод для сравнения распределения вероятностной модели p и распределения модели вывода q, где, более конкретно, я полагаю, что с каждой итерацией операции вывода они обновляют переменные параметра модели вывода q. например, чтобы сделать распределение выборочных «обучающих данных», используемых в качестве входных данных для операции вывода, более близким к распределению возвращенной выборки из вероятностной модели p. Затем после итерации вывода происходит обновление параметров вероятностной модели p с этими улучшенными параметрами модели вывода q. Таким образом проверяется достоверность вероятностной модели, чтобы лучше соответствовать характеристикам обучающих данных. Когда я говорю об обновлении «параметров», я имею в виду параметры, сравнимые с показанными выше, такие как мю и сигма (μ, σ) для нормального распределения или тета (ϴ) для распределения Бернулли. Классы распределений, определенные в моделях, являются статическими, все, что обновляется посредством логического вывода, — это параметры, поэтому, если у нас есть плохая модель для классов и комбинаций распределений, нам нужно будет решить эту проблему после этапа критики. Да, и обновление параметров выполняется по-разному в зависимости от различных целевых функций, доступных для вариационного вывода и Монте-Карло, которые я не собираюсь пытаться делать так, как будто я полностью понимаю, но суть, которую я понял, заключалась в том, что в вариационном выводе мы основывая нашу оценку сравнения распределений между p и q на основе предполагаемого семейства распределений, которое мы указали в вероятностной модели, и я думаю, что анализ распределения методом Монте-Карло является более «эмпирическим» в том смысле, что суммирование ( определенное количество) образцов Монте-Карло берется и эмпирически оценивается — я знаю, что это немного похоже на махание рукой, извините. Существует много отличных ресурсов, чтобы узнать о Монте-Карло, и для вывода о вариациях в документе приводится источник статьи (Jordan, 1999).

Итак, после того, как мы настроили нашу модель вывода в соответствии с вероятностной моделью, мы можем запустить нашу операцию вывода через Эдварда, используя одну из целевых функций из иерархии методов вывода, показанной выше. Вуаля. (Быстрая звездочка — в документе также отмечается третий тип парадигмы вывода, не показанный выше, называемый «Точный вывод», основанный на символической алгебре на узлах вычислительного графа для определения отношений сопряженности между переменными, откладывая эту обработку до статьи.)

Критика

Выше я отметил, что стадия критики в общих чертах аналогична проверке контролируемой операции обучения. Мы оцениваем точность модели и рабочие характеристики. Как вы можете спросить, можно ли оценивать точность вероятностной модели по сравнению с невероятностным проверочным набором, полученным из обучающих данных? Учтите, что для примера задачи классификации выходные данные вероятностной модели p(y|X) примерно аналогичны сигмовидной функции активации, где у нас есть некоторый диапазон между 0–1 и, как и в обучении с учителем, где мы можем сжать активации одного из двух значений на основе некоторого порога, мы можем просто использовать наши оценки вероятности для получения наиболее вероятной классификации и сравнения с метками набора проверки. Точно так же, скажем, в задаче регрессии, хотя и несколько менее строгой, мы можем использовать среднее значение прогнозов, например, с соответствующей метрикой точности (что-то вроде среднеквадратичной ошибки или т. д.), отметив также, что графическое изображение распределений может дополнять оценку метрики для лучшая объяснимость. И, как показано выше в петле Коробки, намерение должно состоять в потенциальном пересмотре вашего состава архитектур распределения прогнозных моделей на основе результатов критики, хотя в документе не содержится большого количества деталей того, что это может повлечь за собой.

Часть 2: Обучение через поколения

На основе обзора книги Глубокое вероятностное программирование, написанной Дастином Траном, Мэтью Д. Хоффманом, Рифом А. Сауроусом, Юджином Бревдо, Кевином Мерфи и Дэвидом М. Блеем (2017 г.)arXiv:1701.03757

В последнем разделе при обсуждении возможных путей построения модели я кратко отметил различные способы, которыми мы могли бы придать случайности форму нашим спецификациям распределений. Например, мы могли бы создать распределение как алгебраическую композицию нескольких распределений или ввести цикл управления, например, с операторами если или пока. назначьте распределения параметрам этих распределений, съешьте свое сердце Synecdoche, Нью-Йорк). Но ключевой метод, который является предметом этой второй статьи, также включает в себя пересечение вероятностного программирования и нейронных сетей, например, что будет для этой демонстрации определение параметров распределения в качестве выходных данных смежного обучения нейронной сети, связанной с операция вывода. Мы продемонстрируем здесь одну такую ​​композицию, пройдясь по компонентам вероятностного программирования вариационного автокодировщика (VAE), типа генеративной модели, которая имеет возможность продвигать характеристики изображения по скрытым векторам, определенным в ходе операции обучения, которая использует некоторые вероятностные выводы для достижения. На самом деле, если вам нужен хороший учебник по VAE в качестве основы, я могу снова указать вам на другой обзор моей статьи под названием Выбор нового поколения. Anyhoo, в рамках этой демонстрации, давайте сначала начнем с представления вычислительного графа ванильного VAE, изображающего направления ввода параметров и данных в различные компоненты распределений.

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

  • Большой прямоугольник с N внизу просто представляет собой набор данных с N числом выборок, так что, когда мы позже будем говорить о наборах Xn и Zn, они будут соответствовать тому же набору данных, что и можно вывести из подзаголовка n. Поскольку это данные изображения, давайте для простоты пренебрежем цветовыми обозначениями RGB и просто предположим черно-белое изображение, так что каждая точка данных из набора N будет изображением 28x28 пикселей с двоичными активациями (так проще, чем MNIST, который имеет оттенки серого в активацию пикселей). [обновление/исправление: я считаю, что N для этого изображения на самом деле указывает номер оси распределения Xn.]
  • Кружки представляют распределения в игре. Здесь мы видим два распределения: распределение скрытых векторов Zn и распределение соответствующих точек данных Xn (которые, напомню, представляют собой набор пикселей). Обратите внимание на затенение распределения Xn, я считаю, что это сигнал, указывающий на то, что это распределение имеет свои параметры как функцию нейронной сети. (Хотя интересный момент в стороне, когда мы позже составим наши распределения, мы обнаружим, что точки приложения для нейронной сети «h» различаются между вероятностной моделью p и моделью вывода q. Немного запутанно, чтобы описать, просто что-то искать когда мы доберемся до кода ниже). [обновление / исправление: я считаю, что затенение указывает на то, что это распределение наблюдаемо, а включение нейронной сети не изображено на графике.]
  • Греческие символы — это параметры, обозначающие классы распределений. Например, ранее мы видели, что распределение Бернулли параметризовано тета, и фактически это то, что мы определим для распределения Xn (это Бернулли, потому что наши пиксели следуют дискретному распределению, означающему, что каждый пиксель либо включен, либо выключен, 1/ 0). Параметр phi (φ), входящий в распределение скрытого вектора Zn, я считаю, является сокращением для набора параметров, связанных с нормальным распределением, которое мы видели ранее, было параметризовано мю и сигмой — поэтому, когда вы видите фи на этом изображении, просто прочитайте его. как набор мю и сигма. Мы применяем непрерывное (нормальное) распределение к скрытым векторам Zn, потому что они реализованы как непрерывный (потенциально неограниченный) диапазон — это не значит, что нормальное всегда является лучшим распределением для каждого приложения, но я ожидаю, что это обычное начальное распределение. точка.
  • Стрелки на диаграмме различают направления распределения параметров распределения, например, между вероятностной моделью для производства образцов и моделью вывода для получения параметров. Напоминаем, что выход вероятностной модели p представляет собой набор выборок точек данных, соответствующих распределению модели, которые здесь будут получены как функция распределений скрытых векторов Zn и тета-параметра распределений Бернулли пикселей Xn — это то, что показано сплошными стрелками. Затем выходные данные модели вывода получают в другом направлении путем применения целевой функции вывода (например, вариационного вывода или оценки Монте-Карло) в направлениях, указанных пунктирными стрелками. (Для этого примера есть небольшая дополнительная сложность, поскольку в миксе есть нейронная сеть, которую, честно говоря, я думаю, что вычислительный график мог бы лучше иллюстрировать работу, опять же, я считаю, что это то, что означает заштрихованный кружок для Xn распределение.)

Отлично, теперь вы разобрались с вычислительным графом, давайте углубимся в демонстрацию кода композиций дистрибутива.

Композиция модели

Мы продемонстрируем здесь состав вероятностной модели, опять же для нашей демонстрации VAE при применении набора двоичных пикселей 28x28 из N точек данных, показывающих распределение Xn со скрытыми векторами Zn. На заметку, буква «h», которую вы увидите здесь, — это слой в нейронной сети, который будет обучен как часть операции логического вывода. В качестве обзора выходными данными нашей вероятностной модели будет набор точек данных Xn с характеристиками выборки, основанными на распределении модели. Отлично, так что давайте начнем.

Первым входом в вероятностную модель (z) будет представление скрытых распределений векторов. Как указано на вычислительном графике с помощью параметра phi, это распределение Zn моделируется нормальным распределением, обозначение которого будет статическим посредством вывода, это просто параметры указанного нормального распределения, которые будут скорректированы путем вывода (извините, что получил немного впереди себя). Поскольку мы будем получать параметры этого нормального распределения посредством логического вывода, инициализация относительно проста, поскольку мы просто передаем тензоры TensorFlow с произвольными значениями, здесь мы устанавливаем нули для мю и единицы для сигмы, и единственная реальная сложность связана с определением размерностей этих инициализированных тензоров параметров. Размеры [N, d] представляют N для количества точек данных в нашем наборе и d для количества оцененных скрытых векторов. (В качестве иллюстрации того, что может означать скрытый вектор, скажем, в приложении распознавания рукописного ввода MNIST один скрытый вектор может представлять аккуратность / неряшливость почерка, или прямолинейность линий, или вы знаете, насколько буквы равномерно распределены и все такое.)

Второй вход в вероятностную модель (h) — это наше первое закодированное представление слоя нейронной сети. Здесь мы проходим плотно связанный слой из 256 клеток с активацией relu. Честно говоря, я не уверен, является ли вызов Dense родным для Edward и построен поверх TensorFlow, или это прямой вызов TensorFlow (полная демонстрация этого кода в Приложении C к статье использует TensorFlow). Слим, в чем не очень разбираюсь, но думаю именно последнее). Входными данными для этого плотного слоя является тензор, возвращенный из выборок нормального распределения скрытых векторов Zn, и один из способов думать об этом состоит в том, что каждая строка этой композиции модели представляет собой собственную отдельную вероятностную модель, которая генерирует свой собственный набор выборок на управляющее распределение, поэтому, другими словами, плотный слой нейронной сети h преобразует набор латентных векторных образцов с помощью функций активации relu (для подачи на вход следующего слоя).

Тогда последний слой нашей вероятностной модели (x) представляет собой распределение Бернулли, чей тета-параметр выводится как функция выхода активаций relu слоя h в еще один плотный слой. Если честно, меня немного смущает отсутствие активации. Хм. Сохраните это для следующей статьи. Но, как вы можете видеть, выходные данные нейронной сети передают входные логиты в распределение Бернулли, которое представляет логарифмические шансы события 1 (посмотрел это) — на самом деле я думаю, что использование логитов делает функцию без активации приемлемой. Таким образом, этот слой выводит совместное распределение изображения размером 28x28 пикселей или, более конкретно, генерирует набор выборок изображений размером 28x28 пикселей, отвечающих этим объединенным бернуллиевским распределениям активаций пикселей.

Композиция вывода

Отлично, у нас есть прямой проход вероятностной модели p, теперь давайте продемонстрируем, так сказать, обратный проход для модели вывода q. Конечно, композиция — это только первый шаг вывода, после которого мы должны запустить целевую функцию, которая здесь не показана. (Определенно стоит ознакомиться с Приложением C к статье, если вы хотите увидеть полную демонстрацию кода, которая включает в себя взаимодействие совместного вывода и обучения (проще, чем кажется), я просто сосредоточусь здесь на композиции модели вывода. .) Обратите внимание, что в документе это называется «вариационной моделью», а не моделью вывода, я полагаю, что это связано с использованием вариационного вывода в качестве целевой функции (в частности, KLqp), я не уверен, что эта композиция будет необходимо изменить, например, для использования вывода Монте-Карло, оставив этот вопрос в качестве упражнения для читателя.

Первый вход в модель логического вывода q (qx) связан с распределением Xn, которое, если вы посмотрите выше, вы увидите, что это последний слой вероятностной модели p, который показывает движение в противоположных направлениях. Модели вывода, по-видимому, следуют соглашению об именах, когда буква «q» добавляется к соответствующему слою вероятностной модели (т. е. «qx» соответствует «x»). Заполнение входных данных — это просто заполнитель TensorFlow, что означает, что мы на самом деле не инициализируем значениями, заполнитель — это просто заполнитель для переданных значений, которые в данном случае будут переданными значениями нашего набора данных N. Мы инициализируем заполнитель, чтобы принять точки в нашем наборе данных N с заданной точностью с плавающей запятой (32-битное число с плавающей запятой) и входными размерами [N, 28 * 28], для N отсчетов в нашем наборе данных, каждый из которых представляет собой набор 28x28 активация бинарных пикселей.

Вторым входом в модель логического вывода снова является тот хитрый слой h (qh), который, как вы помните, не очень хорошо представлен на блок-схеме вычислительного графа, представленной выше, и оказывается, что он становится даже немного сложнее, потому что в то время как в вероятностной модели у нас был нейронная сеть передает данные из плотного слоя в h в плотный слой в X, здесь наоборот, мы передаем плотный слой из qh в плотный слой в параметрах распределения qz. Я думаю, что пунктирная стрелка параметров, переданных в Z-распределение, подразумевает, что любая нейронная сеть, включенная в вывод, если она не была предварительно агрегирована, будет передаваться на конечные уровни вывода. Немного запутанно, я знаю. Но продолжая, вы можете видеть, что мы принимаем в качестве входных данных тензоры набора данных, переданные из слоя qx, и вводим их в плотный слой из 256 нейронов — так же, как слой h в вероятностной модели, если подумать, просто разные входы.

Тогда последний слой модели вывода (qz) представляет собой qz, связанный с распределением Zn. Помните, как в вероятностной модели мы получили параметры распределения Xn как функцию нейронной сети? Что ж, здесь, при обратном проходе, мы вместо этого получаем параметры распределения Zn в зависимости от нейронной сети обратного прохода. Это немного отличается, потому что распределение Zn является нормальным, что означает, что у нас есть два параметра для вывода (мю и сигма), по сравнению с прямым проходом, где распределение Xn имело только один параметр для вывода. Входными данными для этих моделей нейронной сети распределения Zn являются значения, возвращенные из слоя qh, и они имеют активацию softplus для параметра mu для работы с ограничениями на допустимые значения (›0). Да, и я предполагаю, что размеры тензора параметров частично унаследованы от qh (который наследуется от qx) для значения N, а d для количества скрытых векторов передается слою явно.

Обучение

Обучение нейронной сети и вывод параметров распределения происходят в параллельных итерациях, которые не уверены, распространяется ли это на все приложения или является кварком VAE. На этом этапе будет применяться целевая функция вывода KLqp для получения параметров, а в демонстрации статьи также используется оптимизатор RMS prop для обучения нейронной сети. Я рекомендую взглянуть на полную демонстрацию кода в Приложении C.1 к статье (имеется в виду статья, которую я просматриваю), которая включает дополнительные детали, такие как импорт, параметры и операция обучения. Ага, идем дальше.

Часть 3: В корне всего этого

На основе обзора "Распределения TensorFlow" Джошуа В. Диллона, Яна Лэнгмора, Дастина Трана, Юджина Бревдо, Сриниваса Васудевана, Дэйва Мура, Брайана Паттона, Алекса Алеми, Мэтта Хоффмана и Рифа. А. Зарус (2017)arXiv:1711.10604

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

Выборка состоит из серии розыгрышей методом Монте-Карло, где набор событий объединяется в набор пакетов, а пакеты объединяются в выборку. Показанные здесь параметры формы n / b / s не обязательно являются скалярами, в конце концов, они представляют формы, поэтому я полагаю, что представление также может быть списком скаляров, каждый из которых представляет количество измерений вдоль некоторой оси (например, аналогично тому, как мы инициализировал размеры скрытых векторов в демонстрации VAE в виде списка [N, d], чтобы дать вам представление). В примере демонстрации VAE одним событием будет нарисованное изображение размером 28x28 пикселей, поэтому я полагаю, что event_shape для выборки из распределения Xn будет [28*28] (тогда как выборка из распределения Zn будет иметь event_shape [ Н, д]). На самом деле, batch_shape не уверен в том, как связать с примером VAE, это может быть частью соображений для различных целевых функций вывода, не уверен. И тогда sample_shape просто говорит о том, как мы используем рисунки Монте-Карло для всей выборки. Когда мы говорим, что отрисовки sample_shape распределяются идентично, а batch_shape распределяются неодинаково, мы имеем в виду возможность того, что, хм, это своего рода предположение, ну, я думаю, это может быть для сценариев, в которых event_shapes подлежат распределению, и на самом деле это может быть то, что подразумевается под event_shape, может зависеть, например, от партии, которую я ожидаю. Своего рода спекуляция на эту тему. Идем дальше.

Как отмечалось во введении к этому разделу, в библиотеке TensorFlow Distributions есть два основных метода: Distributions для моделирования классов распределений и Bijectors для применения преобразований к распределениям. Для методов распределений на самом деле существует библиотека классов распределения, каждый из которых имеет свои параметры и характеристики (например, различие между непрерывным и дискретным распределениями, продемонстрированное ранее в этой статье). Библиотеку Bijectors я нахожу очень интересной, и для меня не совсем очевидно, как Bijectors связана с библиотекой Edward — все это может быть под капотом. Это может быть немного менее интуитивным, поэтому я попытаюсь дать небольшое пояснение, когда мы применяем преобразование к распределению, что примерно аналогично тому, когда мы применяем нормализацию z-показателя к одной переменной при предварительной обработке табличных данных. . Но учтите, что нормализация z-оценки в первую очередь изменяет масштабирование значений, возвращаемых из распределения, посредством смещения и множителя, я ожидаю, что библиотека Bijector может добавить больше сложности в обновлении формы кривой распределения — применяя преобразование к возвращаемым значениям. из выборки путем применения преобразования к кривой вероятностей, связанных с возвращенными потенциальными значениями из распределения. Конечно, важно иметь в виду, что не все распределения имеют достаточно общего, чтобы можно было напрямую преобразовать одно в другое — например, распределение с ограниченным левым хвостом не может быть получено из распределения с неограниченным левым хвостом без потери некоторой информации в процесс или, что еще более драматично, непрерывное распределение не может быть преобразовано в дискретное распределение без еще большей потери информации. Самое главное, и я ожидаю, что здесь будет простая «ошибка», может заключаться в том, что преобразование распределения основано на предположении, что свойства исходного распределения достаточно понятны — я полагаю, что есть некоторые распределения, где для оценки параметров потенциально требуются порядки величин. больше данных, чем другие, например, с толстыми хвостами.

В заключение я кратко скажу, что это исследование библиотеки Edward и TensorFlow Distributions было очень приятным и полезным опытом. Я надеюсь, что вы, читатель, могли извлечь некоторую пользу из этого обзора. Я знаю, что это была своего рода сложная тема, цель здесь состояла в том, чтобы попытаться предоставить простой язык с высокой детализацией механики, например, чтобы читатель получил понимание, на что у меня ушло несколько дней рецензирования статей. Если вам понравился этот обзор или вы извлекли из него какую-то пользу, я надеюсь, что вы могли бы рассмотреть Automunge, библиотеку с открытым исходным кодом, созданную в качестве платформы для разработки функций и автоматической подготовки табличных данных для машинного обучения. Это очень полезно, и я очень жду отзывов от пользователей, которые могли бы помочь мне определить, что сделано хорошо и/или может потребовать уточнения. Желаем всего наилучшего впечатляющим фасилитаторам вероятностного программирования библиотек Edward и TensorFlow. Я ожидаю, что промышленность продолжит находить новые ценные варианты использования этих инструментов в качестве вечной основы для пересечений между нейронными сетями и вероятностью. Ваше здоровье.

Книги, которые были упомянуты здесь или иным образом вдохновили на создание этого поста:

Из дневников Джона Генри — Николас Тиг

использованная литература

[1] Дастин Тран, Альп Кукукельбир, Аджи Б. Диенг, Майя Рудольф, Давен Лян и Дэвид М. Блей (2017) Эдвард: библиотека для вероятностного моделирования, логических выводов и критика arXiv:1610.09787

[2] Дастин Тран, Мэтью Д. Хоффман, Риф А. Зарус, Юджин Бревдо, Кевин Мерфи и Дэвид М. Блей (2017) Глубокое вероятностное программирование arXiv:1701.03757

[3] Джошуа В. Диллон, Ян Лэнгмор, Дастин Тран, Юджин Бревдо, Сринивас Васудеван, Дэйв Мур, Брайан Паттон, Алекс Алеми, Мэтт Хоффман и Риф А. Зарус (2017) Распределения TensorFlow arXiv:1711.10604

Для дальнейшего чтения, пожалуйста, ознакомьтесь с Оглавлением, Рекомендациями по книгам и Рекомендациями по музыке. Подробнее об Automunge: automunge.com