Порождающие модели — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показано 59 промежуточных версий 3 участников)
Строка 1: Строка 1:
 
[[Файл:Generative_v_discriminative.png|420px|thumb|right|Порождающая модель пытается генерировать рукописные 0 и 1, для этого моделирует распределение по всему пространству данных. Напротив, дискриминативная модель старается разделить данные, без необходимости точно моделировать, как объекты размещаются по обе стороны от линии.]]
 
[[Файл:Generative_v_discriminative.png|420px|thumb|right|Порождающая модель пытается генерировать рукописные 0 и 1, для этого моделирует распределение по всему пространству данных. Напротив, дискриминативная модель старается разделить данные, без необходимости точно моделировать, как объекты размещаются по обе стороны от линии.]]
  
'''Порождающие модели''' (англ. ''generative model'') {{---}} это класс моделей совместного распределения вероятностей <tex>p(x, y)</tex> для генерации новых объектов на основе исходных данных.
+
'''Порождающие модели''' (англ. ''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> может отличить собаку от кошки.
+
С другой стороны, дискриминативная модель (англ. ''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>.  
  
Мы хотим научиться создавать правдоподобный объект относительно некоторой скрытой структуры исходных объектов. Давайте изучим распределение по ним, а затем просто будем сэмплировать новый объект из этого распределения. Значит эта задача относится к классу задач [[Общие понятия#Обучение без учителя (англ. Unsupervised learning)|обучения без учителя]].
+
===Явный подход===
 +
Можно строить это распределение ''явно'', делая вероятностные предположения, которые обычно сводятся к тому, что общее распределение <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>-методов: попробуем построить мар­ковскую цепь, которая описывает случайное блуждание под графиком плотности распределения.
[[Файл:Tax2.png|500px|thumb|right]]
+
Если достаточно долго блуждать под графиком плотности <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>.
* Явный: определить распределение <tex>p_{model}</tex>, описывающее объекты и генерировать данные из него
 
* Неявный: получить некоторое распределение, оценить его близость с <tex>p_{model}</tex> через дивергенцию Кульбака-Лейблера<ref>[https://ru.wikipedia.org/wiki/Расстояние_Кульбака_—_Лейблера Расстояние Кульбака—Лейблера]</ref>
 
  
== Глубокие порождающие модели на основе нейронных сетей ==
+
== См. также ==
 +
*[[Байесовская классификация#Наивный байесовский классификатор|Наивный байесовский классификатор]]
 
*[[Generative Adversarial Nets (GAN)|Порождающие состязательные сети]]
 
*[[Generative Adversarial Nets (GAN)|Порождающие состязательные сети]]
 
*[[Автокодировщик]]
 
*[[Автокодировщик]]
 
*[[Вариационный автокодировщик]]
 
*[[Вариационный автокодировщик]]
 +
*[[Генерация изображения по тексту]]
  
== См. также ==
+
== Примечания ==
*[[Байесовская классификация#Наивный байесовский классификатор|Наивный байесовский классификатор(как пример простейшей порождающей модели)]]
 
 
 
 
*[https://towardsdatascience.com/generating-passwords-with-generative-models-from-probabilistic-to-deep-learning-approaches-54d41d8810e3 Примеры генерации паролей на основе исходного распределения]
 
*[https://towardsdatascience.com/generating-passwords-with-generative-models-from-probabilistic-to-deep-learning-approaches-54d41d8810e3 Примеры генерации паролей на основе исходного распределения]
 
== Примечания ==
 
 
<references/>
 
<references/>
  
Строка 36: Строка 79:
 
*[https://en.wikipedia.org/wiki/Generative_model Generative_model]
 
*[https://en.wikipedia.org/wiki/Generative_model Generative_model]
 
*[https://developers.google.com/machine-learning/gan/generative Google courses с примерами на понимание]
 
*[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.
  
 
[[Категория: Машинное обучение]]
 
[[Категория: Машинное обучение]]
 
[[Категория: Порождающие модели]]
 
[[Категория: Порождающие модели]]

Текущая версия на 19:15, 4 сентября 2022

Порождающая модель пытается генерировать рукописные 0 и 1, для этого моделирует распределение по всему пространству данных. Напротив, дискриминативная модель старается разделить данные, без необходимости точно моделировать, как объекты размещаются по обе стороны от линии.

Порождающие модели (англ. generative model) — это класс моделей, которые обучают совместное распределение[1] данных [math]p(x, y)[/math]; отсюда легко получить условное распределение [math]p(y \mid x)={p(x, y)\over p(x)}[/math], но совместное даёт больше информации и его можно использовать, например, для генерации новых фотографий животных, которые выглядят как настоящие животные.

С другой стороны, дискриминативная модель (англ. discriminative model)[2] обучает только условное распределение и может, например, отличить собаку от кошки.

Примером простейшей порождающей модели является наивный байесовский классификатор.

Классификация задачи

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

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

Порождающая модель иногда позволяет использовать обучение с частичным привлечением учителя. Пусть задача состоит в том, чтобы отличить кошек от собак на фотографиях. Обычно мало размеченных данных, на которых кошки и со­баки отмечены вручную. Основная часть задачи со­стоит в том, чтобы понять, чем разумные фотографии отличаются от слу­чайного шума. Иначе говоря, если сначала определить распределение [math]p(x)[/math], то проще обучить распределение [math]p(y \mid x)[/math], где [math]y[/math] — это один бит, отвечающий за отдельный признак, а [math]x[/math] — это вся фотография.

Вычисление плотности распределения

С математической точки зрения основная цель порождающей модели обычно состоит в максимизации функции правдоподобия: для набора данных [math]X = \{x_i\}[/math] максимизировать [math]\displaystyle \prod_i p_{model}(x_i;\theta)[/math] по параметрам модели [math]\theta[/math], т.е. найти [math]\theta^* = \underset{\theta}{\operatorname{argmax}} \displaystyle \prod_i p_{model}(x_i;\theta)[/math]

Чтобы избежать арифметического переполнения снизу[3] зачастую пользуются свойством логарифма произведения [math]\log ab = \log a+\log b[/math]. Благодаря моннотоности логарифма, его применение к обоим частям выражения не изменит параметры, при которых достигается максимум. При этом, логарифм от числа близкого к нулю будет числом отрицательным, но в абсолютном значении существенно большим чем исходное число, что делает логарифмические значения вероятностей более удобными для анализа. Что в нашем случае с вероятности очень уместно. Поэтому, мы переписываем нашу формулу с использованием логарифма.

[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]

Важен и другой взгляд на то же самое: максимизация правдоподобия эквивалентна минимизации расстояния Кульбака-Лейблера[4] между распределением [math]р[/math], которое получается из нашей модели, и распределением [math]\hat{p}_{data}[/math] — эмпирическим распределе­нием данных. Это эмпирическое распределение попросту полностью сосредоточе­но в точках из набора данных и равномерно распределено по ним, так что:

[math]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)[/math]

и минимизация этого выражения эквивалентна максимизации того, что выше.

Таксономия порождающих моделей

Таксономия порождающих моделей

Генеративные модели различаются как раз тем, как именно они строят рас­пределение [math]p(x; \theta)[/math].

Явный подход

Можно строить это распределение явно, делая вероятностные предположения, которые обычно сводятся к тому, что общее распределение [math]p(x; \theta)[/math] выражается в виде произведения тех или иных распределений.

Как правило, модели, где плотность известна явно, делают какие-то дополни­тельные предположения на структуру этих распределений.

Например, байесовские сети строят распределение из условных распре­делений [math]\mathrm P(X_1, \ldots, X_n) = \prod_{i=1}^n \mathrm P(X_i \mid \operatorname{parents}(X_i)).[/math]

Можно даже и вовсе никаких предположений не делать: любое распределение всегда раскладывается как:

[math]p(x) = \displaystyle \prod_{i} p(x_i \mid x_1, {{...}}, x_{i-1})[/math]

Так представляется модель в FVBN (fully visible belief net­works)[5], идея которых состоит в том, что с одномерными распределениями нетрудно разобраться - в ранних работах их представляли классическими моделями. А сейчас мы можем их промоделировать последовательно глу­бокими сетями, получится модель, которая сможет последовательно породить [math]х[/math] компонент за компонентом, каждый раз для порождения [math]x_i[/math] опираясь на уже порожденные [math]x_1, {{...}}, x_{i-1})[/math].

Именно эта идея лежит в основе моде­ли для работы со звуком WaveNet, разработанной Google DeepMind[6]. Существующие параметрические модели синтезирования речи[7] обычно генерируют звук, прогоняя выходной сигнал через специальные обработчики, называемые вокодерами[8].

Устройство WaveNet

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

В моделях PixelRNN[на 24.02.20 не создан] и PixelCNN[на 24.02.20 не создан] строится изображение пиксель за пикселем, слева направо и свер­ху вниз. Каждый пиксель [math]x_n[/math] порождается из условного распределе­ния [math]p(x_n \mid x_1, {{...}}, x_{n-1})[/math] а оно уже моделируется или рекуррентной сетью или сверточной.

Модель DRAW[9] последо­вательно «рисует» картинку с помощью рекуррентной сети, а механизм внимания[на 24.02.20 не создан] помогает сети в данный момент сконцентрироваться на нужной части изображе­ния.

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

Неявный подход

Основная альтернатива всему этому состоит в том, чтобы использовать неявные порождающие модели, в которых мы не пытаемся получить функцию, подсчитывающую плотность нужного распределения в каждой точке, а просто мо­делируем то, что нам от этой модели нужно. Например, если мы хотим просто научиться порождать фото­графии милых котиков, нам не так важно иметь явную функцию плотности [math]p(x)[/math], которая могла бы сказать, насколько вероятно, что перед нами котик, - вполне до­статочно просто уметь генерировать новые [math]x \sim p(x)[/math].

Сэмплирование из сложных многомерных распределений делается с помощью МСМС[10]-методов: попробуем построить мар­ковскую цепь, которая описывает случайное блуждание под графиком плотности распределения. Если достаточно долго блуждать под графиком плотности [math]p(x)[/math], можно будет считать, что полученная точка представляет собой случайную точ­ку, взятую по распределению [math]p(x)[/math]. Примером такого моделирования глубокой сетью являются порождающие стохастические сети[11].

Порождающие состязательные сети — алгоритм машинного обучения, построенный на комбинации из двух нейронных сетей: генеративная модель [math]G[/math], которая строит приближение распределения данных, и дискриминативная модель [math]D[/math], оценивающая вероятность, что образец пришел из тренировочных данных, а не сгенерированных моделью [math]G[/math]. Обучение для модели [math]G[/math] заключается в максимизации вероятности ошибки дискриминатора [math]D[/math].

См. также

Примечания

Источники информации