Изменения

Перейти к: навигация, поиск

Порождающие модели

16 555 байт добавлено, 19:15, 4 сентября 2022
м
rollbackEdits.php mass rollback
'''Порождающие модели''' (англ[[Файл:Generative_v_discriminative. ''generative model'') {{---}} это класс моделей для обучения без учителя, png|420px|thumb|right|Порождающая модель может пытается генерировать новые фотографии животныхрукописные 0 и 1, которые выглядят как настоящие животныедля этого моделирует распределение по всему пространству данных. Напротив, в то время как дискриминативная модель (англ. ''discriminative model'')<ref>[https://en.wikipedia.org/wiki/Discriminative_model Discriminative model]</ref> может отличить собаку старается разделить данные, без необходимости точно моделировать, как объекты размещаются по обе стороны от кошкилинии. [[:Generative Adversarial Nets (GAN)|GAN]] {{---}} один из видов порождающей модели.
== Стандартные примеры =='''Порождающие модели''' (англ. ''generative model'') {{---}} это класс моделей, которые обучают ''совместное'' распределение<ref> [[Байесовская классификация#Наивный байесовский классификатор|Наивный байес]https://en.wikipedia.org/wiki/Joint_probability_distribution Joint probability distribution]</ref> данных <tex>p(x, y)</tex>; отсюда легко получить ''условное'' распределение <tex>p(y \mid x)={p(x, y)\over p(x)}</tex>, но совместное даёт больше информации и его можно использовать, например, для ''генерации'' новых фотографий животных, которые выглядят как настоящие животные.
С другой стороны, дискриминативная модель (англ. ''discriminative model'')<ref> [https://en.wikipedia.org/wiki/Discriminative_model Discriminative model]</ref> обучает только ''условное'' распределение и может, например, отличить собаку от кошки.
Примером простейшей порождающей модели является [[Байесовская классификация#Наивный байесовский классификатор|наивный байесовский классификатор]]. == Классификация задачи ==Можно использовать некоторые эмпирические правила для генерации новых объектов, не используя машинного обучения. Мы хотим научиться создавать правдоподобный объект относительно некоторой скрытой структуры исходных объектов. Давайте изучим распределение по ним, а затем просто будем сэмплировать новый объект из этого распределения. Значит эта задача относится к классу задач [[Общие понятия#Обучение без учителя (англ. Unsupervised learning)|обучения без учителя]]. Порождающая модель иногда позволяет использовать обучение [[Общие понятия#Обучение с частичным привлечением учителя (англ. Semi-supervised learning)|с частичным привлечением учителя]]. Пусть задача состоит в том, чтобы отличить кошек от собак на фотографиях. Обычно мало размеченных данных, на которых кошки и со­баки отмечены вручную. Основная часть задачи со­стоит в том, чтобы понять, чем разумные фотографии отличаются от слу­чайного шума. Иначе говоря, если сначала определить распределение <tex>p(x)</tex>, то проще обучить распределение <tex>p(y \mid x)</tex>, где <tex>y</tex> {{---}} это один бит, отвечающий за отдельный признак, а <tex>x</tex> {{---}} это вся фотография. == Вычисление плотности распределения ==С математической точки зрения основная цель порождающей модели обычно состоит в максимизации функции '''правдоподобия''': для набора данных <tex>X = \{x_i\}</tex> максимизировать <tex>\displaystyle \prod_i p_{model}(x_i;\theta)</tex> по параметрам модели <tex>\theta</tex>, т.е. найти <math>\theta^* = \underset{\theta}{\operatorname{argmax}} \displaystyle \prod_i p_{model}(x_i;\theta)</math> Чтобы избежать арифметического переполнения снизу<ref>[https://ru.wikipedia.org/wiki/Исчезновение_порядка Исчезновение порядка]</ref> зачастую пользуются свойством логарифма произведения <tex>\log ab = \log a+\log b</tex>. Благодаря моннотоности логарифма, его применение к обоим частям выражения не изменит параметры, при которых достигается максимум. При этом, логарифм от числа близкого к нулю будет числом отрицательным, но в абсолютном значении существенно большим чем исходное число, что делает логарифмические значения вероятностей более удобными для анализа. Что в нашем случае с вероятности очень уместно. Поэтому, мы переписываем нашу формулу с использованием логарифма. <math>\theta^* = \underset{\theta}{\operatorname{argmax}} \log \displaystyle \prod_i p_{model}(x_i;\theta) = \underset{\theta}{\operatorname{argmax}} \displaystyle \sum_i \log p_{model}(x_i;\theta) </math> Важен и другой взгляд на то же самое: максимизация правдоподобия эквивалентна минимизации расстояния Кульбака-Лейблера<ref>[https://ru.wikipedia.org/wiki/Расстояние_Кульбака_—_Лейблера Расстояние Кульбака-Лейблера]</ref> между распределением <tex>р</tex>, которое получается из нашей модели, и распределением <tex>\hat{p}_{data}</tex> — эмпирическим распределе­нием данных. Это эмпирическое распределение попросту полностью сосредоточе­но в точках из набора данных и равномерно распределено по ним, так что: <tex>KL(\hat{p}_{data}(x), p(x; \theta)) = \int \hat{p}_{data}(x) \log p(x; \theta) = \displaystyle \sum_i \hat{p}_{data}(x_i) \log p(x_i; \theta)</tex> и минимизация этого выражения эквивалентна максимизации того, что выше. ==Таксономия порождающих моделей==[[Файл:tax7.png|thumb|right|upright=2.37|Таксономия порождающих моделей]]Генеративные модели различаются как раз тем, как именно они строят рас­пределение <tex>p(x; \theta)</tex>.  ===Явный подход=== Порождающие Можно строить это распределение ''явно'', делая вероятностные предположения, которые обычно сводятся к тому, что общее распределение <tex>p(x; \theta)</tex> выражается в виде произведения тех или иных распределений. Как правило, модели , где плотность известна явно, делают какие-то дополни­тельные предположения на структуру этих распределений. Например, [[Байесовские сети|байесовские сети]] строят распределение из условных распре­делений <math>\mathrm P(X_1, \ldots, X_n) = \prod_{i=1}^n \mathrm P(X_i \mid \operatorname{parents}(X_i)).</math> Можно даже и вовсе никаких предположений не делать: любое распределение всегда раскладывается как: <tex>p(x) = \displaystyle \prod_{i} p(x_i \mid x_1, {{...}}, x_{i-1})</tex> Так представляется модель в FVBN (fully visible belief net­works)<ref>[https://mitpress.mit.edu/books/graphical-models-machine-learning-and-digital-communication Frey B. Graphical Models for Machine Learning and Digital Communication, Cambridge, MA: MIT Press, 1998.]</ref>, идея которых состоит в том, что с одномерными распределениями нетрудно разобраться - в ранних работах их представляли классическими моделями. А сейчас мы можем их промоделировать последовательно [[Глубокое обучение|глу­бокими сетями]], получится модель, которая сможет последовательно породить <tex>х</tex> компонент за компонентом, каждый раз для порождения <tex>x_i</tex> опираясь на уже порожденные <tex>x_1, {{...}}, x_{i-1})</tex>. Именно эта идея лежит в основе моде­ли для работы со звуком WaveNet, разработанной Google DeepMind<ref>[https://deepmind.com/blog/article/wavenet-generative-model-raw-audio Blog post by DeepMind about WaveNet]</ref>. Существующие параметрические модели синтезирования речи<ref>[https://en.wikipedia.org/wiki/Speech_synthesis Text-To-Speech (TTS)]</ref> обычно генерируют звук, прогоняя выходной сигнал через специальные обработчики, называемые вокодерами<ref>[https://en.wikipedia.org/wiki/Vocoder Vocoder]</ref>.[[Файл:WaveNet.gif|thumb|upright=1.5|right|Устройство WaveNet]]WaveNet меняет парадигму, генерируя звуковой сигнал по семплам. Это не только приводит к более натуральному звучанию речи, но и позволяет создавать любые звуки, включая музыку.Эта ар­хитектура состоит из нескольких последовательных слоев разреженных сверток и в ней снова встречаются остаточные связи, связи «через уровень» и так далее.Во время обучения входящие последовательности представляют собой звуковые волны от примеров записи голоса. После тренировки можно с помощью сети генерировать синтетические фразы. На каждом шагу семплирования значение вычисляется из вероятностного распределения, посчитанного сетью. Затем это значение возвращается на вход и делается новое предсказание для следующего шага. В моделях [[Задача генерации объектов|PixelRNN]]<sup>[на 24.02.20 не создан]</sup> и [[Задача генерации объектов|PixelCNN]]<sup>[на 24.02.20 не создан]</sup> строится изображение пиксель за пикселем, слева направо и свер­ху вниз. Каждый пиксель <tex>x_n</tex> порождается из условного распределе­ния <tex>p(x_n \mid x_1, {{...}}, x_{n-1})</tex>а оно уже моделируется или [[Рекуррентные нейронные сети|рекуррентной сетью]] или [[Сверточные нейронные сети|сверточной]]. Модель DRAW<ref>[http://arxiv.org/abs/1502.04623 DRAW: A Recurrent Neural Network For Image Generation / K. Gregor et al. / / arXiv, 2015.]</ref> последо­вательно «рисует» картинку с помощью рекуррентной сети, а [[механизм внимания]]<sup>[на 24.02.20 не создан]</sup> помогает сети в данный момент сконцентрироваться на нужной части изображе­ния. Если хочется явно выразить совсем сложные распределения в порождающих моделях, их приходится приближать более простыми, которые уже, в свою очередь, могут быть выражены явно. Для этого обычно используются [[Вариационный автокодировщик|вариационные мето­ды]]. ===Неявный подход===Основная альтернатива всему этому состоит в том, чтобы использовать ''неявные'' порождающие модели, в которых мы не пытаемся получить функцию, подсчитывающую плотность нужного распределения в каждой точке, а просто мо­делируем то, что нам от этой модели нужно. Например, если мы хотим просто научиться порождать фото­графии милых котиков, нам не так важно иметь явную функцию плотности <tex>p(x)</tex>, которая могла бы сказать, насколько вероятно, что перед нами котик, - вполне до­статочно просто уметь генерировать новые <tex>x \sim p(x)</tex>. Сэмплирование из сложных многомерных распределений делается с помощью МСМС<ref>[https://en.wikipedia.org/wiki/Markov_chain_Monte_Carlo Markov chain Monte Carlo(МСМС)]</ref>-методов: попробуем построить мар­ковскую цепь, которая описывает случайное блуждание под графиком плотности распределения. Если достаточно долго блуждать под графиком плотности <tex>p(x)</tex>, можно будет считать, что полученная точка представляет собой случайную точ­ку, взятую по распределению <tex>p(x)</tex>. Примером такого моделирования глубокой сетью являются порождающие стохастические сети<ref>[https://arxiv.org/abs/1503.05571 Generative Stochastic Networks]</ref>. [[Generative Adversarial Nets (GAN)|Порождающие состязательные сети]] {{---}} алгоритм машинного обучения, построенный на комбинации из двух нейронных сетей : генеративная модель <tex>G</tex>, которая строит приближение распределения данных, и дискриминативная модель <tex>D</tex>, оценивающая вероятность, что образец пришел из тренировочных данных, а не сгенерированных моделью <tex>G</tex>. Обучение для модели <tex>G</tex> заключается в максимизации вероятности ошибки дискриминатора <tex>D</tex>. ==См. также ==*[[Байесовская классификация#Наивный байесовский классификатор|Наивный байесовский классификатор]]*[[Generative Adversarial Nets (GAN)|Порождающие состязательные сети]]*[[Автокодировщик]]*[[Вариационный автокодировщик]]*[[Генерация изображения по тексту]]
== Примечания ==
*[https://towardsdatascience.com/generating-passwords-with-generative-models-from-probabilistic-to-deep-learning-approaches-54d41d8810e3 Примеры генерации паролей на основе исходного распределения]
<references/>
== Источники информации ==
*[https://en.wikipedia.org/wiki/Generative_model Generative_model]* [https://developers.google.com/machine-learning/gan/generative Google courses с примерами на понимание]*[https://arxiv.org/abs/1701.00160 NIPS 2016 Tutorial: Generative Adversarial Networks(Ian Goodfellow, 2016)]* Николенко С., Кадурин А., Архангельская Е. Глубокое обучение. СПб.: Питер, 2018.
[[Категория: Машинное обучение]]
[[Категория: Порождающие модели]]
1632
правки

Навигация