«Большая часть обучения людей и животных - это обучение без учителя. Если бы интеллект был пирогом, то неконтролируемое обучение было бы пирогом [базовым], контролируемое обучение было бы вишенкой на торте, а обучение с подкреплением было бы вишенкой на торте. Мы умеем делать глазурь и вишню, но не умеем делать торт ».

Директор отдела исследований искусственного интеллекта в Facebook профессор Ян ЛеКанн неоднократно упоминает эту аналогию в своих выступлениях. Под обучением без учителя он ссылается на «способность машины моделировать окружающую среду, предсказывать возможное будущее и понимать, как устроен мир, наблюдая за ним и действуя в нем».

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

Вариационные автоэнкодеры (VAE) позволяют формализовать эту проблему в рамках вероятностных графических моделей, в которых мы максимизируем нижнюю границу логарифмической вероятности данных. В этом посте мы рассмотрим недавно разработанную архитектуру Adversarial Autoencoders, которая вдохновлена ​​VAE, но дает нам больше гибкости в том, как мы отображаем наши данные в скрытое измерение (если это неясно на данный момент, не беспокойтесь , мы вернемся к этой идее позже). Одна из самых интересных идей о состязательных автоэнкодерах заключается в том, как наложить предварительное распределение на выходные данные нейронной сети с помощью состязательного обучения.

Если вы хотите познакомиться с кодом Pytorch, посетите репозиторий GitHub. В этом посте мы сначала рассмотрим предысторию шумоподавления автоэнкодеров и вариационных автоэнкодеров, а затем перейдем к Состязательным автоэнкодерам, реализации Pytorch, последующей процедуре обучения и некоторым экспериментам по распутыванию и полу-контролируемому обучению. используя набор данных MNIST.

Фон

Автоэнкодеры с шумоподавлением (dAE)

Самая простая версия автоэнкодера - это та, в которой мы обучаем сеть восстанавливать входные данные. Другими словами, мы хотели бы, чтобы сеть каким-то образом узнала функцию идентичности $ f (x) = x $. Чтобы эта проблема не была тривиальной, мы налагаем на сеть условие, чтобы она проходила через промежуточный слой (скрытое пространство), размерность которого намного ниже размерности входных данных. При этом узком месте сеть должна сжимать входную информацию. Таким образом, сеть делится на две части: кодировщик получает входные данные и создает их скрытое или скрытое представление, а декодер берет это промежуточное представление и пытается восстановить ввод. Потеря автоэнкодера называется потерей реконструкции и может быть определена просто как квадрат ошибки между входной и сгенерированной выборками:

Еще одна широко используемая потеря реконструкции для случая, когда вход нормализован до диапазона [0,1] ^ N, - это потеря кросс-энтропии.

Вариационные автоэнкодеры (VAE)

Вариационные автоэнкодеры накладывают второе ограничение на способ построения скрытого представления. Теперь скрытый код имеет предварительное распределение, определенное схемой p (x). Другими словами, кодировщик не может свободно использовать все скрытое пространство, но должен ограничивать создаваемые скрытые коды, чтобы они были вероятными при этом предварительном распределении p (x). Например, если предварительное распределение скрытого кода является распределением Гаусса со средним значением 0 и стандартным отклонением 1, то создание скрытого кода со значением 1000 будет действительно маловероятным.

Это можно рассматривать как второй тип регуляризации количества информации, которая может храниться в скрытом коде. Преимущество этого заключается в том, что теперь мы можем использовать систему в качестве генеративной модели. Чтобы создать новую выборку, которая поступает из распределения данных p (x), нам просто нужно взять выборку из p (z) и пропустить этот образец через декодер, чтобы восстановить a новое изображение. Если это условие не наложено, то скрытый код может свободно распределяться по скрытому пространству, и, следовательно, невозможно произвести выборку действительного скрытого кода для получения вывода прямым способом.

Чтобы усилить это свойство, к функции потерь добавляется второй член в форме расхождения Кульбака-Либлера (KL) между распределением, созданным кодировщиком, и предыдущим распределением. Поскольку VAE основан на вероятностной интерпретации, используемые потери при реконструкции представляют собой потери кросс-энтропии, упомянутые ранее. Собирая это вместе, мы имеем

or

Где $ q (z | x) $ - кодировщик нашей сети, а $ p (z) $ - априорное распределение, наложенное на скрытый код. Теперь эту архитектуру можно совместно обучать с помощью обратного распространения ошибки.

Состязательные автоэнкодеры (AAE)

AAE как генеративная модель

Одним из основных недостатков вариационных автокодировщиков является то, что интеграл от члена KL-дивергенции не имеет аналитического решения в замкнутой форме, за исключением нескольких распределений. Кроме того, непросто использовать дискретные распределения для скрытого кода z. Это связано с тем, что обратное распространение через дискретные переменные, как правило, невозможно, что затрудняет эффективное обучение модели. Один из способов сделать это в настройке VAE был представлен здесь.

Состязательные автоэнкодеры вообще избегают использования дивергенции KL, используя состязательное обучение. В этой архитектуре новая сеть обучается избирательно предсказывать, исходит ли выборка из скрытого кода автокодировщика или из предшествующего распределения p (z), определенного пользователем. Потери кодера теперь складываются из потерь восстановления плюс потери, заданные сетью дискриминатора.

На изображении схематично показано, как работают AAE, когда мы используем гауссовский априор для скрытого кода (хотя подход является общим и может использовать любое распределение). Верхний ряд эквивалентен VAE. Сначала отрисовывается выборка z в соответствии с схемой генератора q (z | x), затем эта выборка отправляется в декодер, который генерирует x ’из z. Потери при реконструкции вычисляются между x и x ’, и градиент распространяется обратно через p и q соответственно, а его веса обновляются.

Рисунок 1. Базовая архитектура AAE. Верхний ряд - это автоэнкодер, а нижний ряд - состязательная сеть, которая заставляет выходные данные кодировщика следовать распределению p (z).

В части состязательной регуляризации дискриминатор получает z, распределенные как q (z | x) и z ’, взятые из истинного априорного p (z), и присваивает вероятность каждому из приходов из p (z). Понесенные потери передаются через дискриминатор для обновления его весов. Затем процесс повторяется, и генератор обновляет свои параметры.

Теперь мы можем использовать потери, понесенные генератором состязательной сети (который является кодировщиком автокодировщика), вместо расхождения KL, чтобы он научился создавать выборки в соответствии с распределением p (z). Эта модификация позволяет нам использовать более широкий набор дистрибутивов в качестве априорных для скрытого кода.

Потеря дискриминатора составляет

("Участок")

где m - размер минипакета, z генерируется кодировщиком, а z ’- это выборка из истинного априорного значения.

Для состязательного генератора мы имеем

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

Определение сети

Прежде чем перейти к процедуре обучения, используемой для этой модели, мы рассмотрим, как реализовать то, что у нас есть на данный момент, в Pytorch. Для сетей кодера, декодера и дискриминатора мы будем использовать простые нейронные сети прямого распространения с тремя 1000 уровнями скрытого состояния с нелинейными функциями ReLU и выпадением с вероятностью 0,2.

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

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

Порядок обучения

Процедура обучения этой архитектуры для каждого мини-пакета выполняется следующим образом:

1) Проложите прямой путь через часть кодера / декодера, вычислите потери при реконструкции и обновите параметры сетей кодера Q и декодера P.

2) Создайте скрытое представление z = Q (x) и возьмите образец z 'из предыдущего p (z), прогоните каждое через дискриминатор и вычислите оценку, присвоенную каждому (D (z ) и D (z ')).

3) Вычислите потери в дискриминаторе и передайте их обратно через сеть дискриминатора, чтобы обновить его веса. В коде

4) Вычислите потери в сети генератора и соответствующим образом обновите сеть Q.

Создание изображений

Теперь мы пытаемся визуализировать, как AAE кодирует изображения в двумерное гауссовское латентное представление со стандартным отклонением 5. Для этого мы сначала обучаем модель с двумерным скрытым состоянием. Затем мы генерируем однородные точки в этом скрытом пространстве от (-10, -10) (верхний левый угол) до (10,10) (нижний правый угол) и пропускаем их через сеть декодера.

AAE для изучения распутанных представлений

Идеальным промежуточным представлением данных было бы такое, которое фиксирует лежащие в основе причинные факторы вариации, которые породили наблюдаемые данные. Йошуа Бенжио и его коллеги отмечают в этой статье, что мы хотели бы, чтобы наши представления разделяли факторы вариации. Различные объясняющие факторы данных имеют тенденцию меняться независимо друг от друга во входном распределении . Они также упоминают самый надежный подход к изучению функций - выделить как можно больше факторов, отбрасывая как можно меньше информации о данных.

В случае данных MNIST (которые представляют собой большой набор данных из рукописных цифр) мы можем определить два основных причинных фактора: с одной стороны, у нас есть генерируемое число, а с другой - стиль или способ написания. Это.

Контролируемый подход

В этой части мы идем на шаг дальше, чем предыдущая архитектура, и пытаемся наложить определенную структуру в скрытый код z. В частности, мы хотим, чтобы архитектура могла отделять информацию о классе от стиля трассировки в полностью контролируемом сценарии. Для этого мы расширяем предыдущую архитектуру до той, что изображена на рисунке ниже. Мы разбиваем скрытое измерение на две части: первая z аналогична той, что была у нас в предыдущем примере; вторая часть скрытого кода теперь представляет собой горячий вектор y, указывающий идентичность числа, передаваемого в автокодировщик.

В этой настройке декодер использует горячий вектор y и скрытый код z для восстановления исходного изображения. Кодировщику остается задача кодировать информацию о стиле в z. На изображении ниже мы видим результат обучения этой архитектуры с 10 000 помеченных образцов MNIST. На рисунке показаны восстановленные изображения, в которых для каждой строки скрытый код z фиксируется на конкретном значении, а метка класса y находится в диапазоне от 0 до 9. Фактически стиль сохраняется по столбцам.

Полу-контролируемый подход

В нашем последнем эксперименте мы ищем альтернативу для получения аналогичных результатов распутывания для случая, когда у нас есть только несколько образцов помеченной информации. Мы можем изменить предыдущую архитектуру так, чтобы AAE создавал скрытый код, составленный путем конкатенации вектора y, указывающего класс или метку (с использованием Softmax), и непрерывной скрытой переменной z (с использованием линейного слоя). Поскольку мы хотим, чтобы вектор y вел себя как горячий вектор, мы заставляем его следовать категориальному распределению, используя вторую враждебную сеть с дискриминатором Dcat. Теперь кодировщиком является q (z, y | x). Декодер использует как метку класса, так и непрерывный скрытый код для восстановления изображения.

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

Стоит отметить, что теперь мы не только можем генерировать изображения с меньшим количеством помеченной информации, но также можем классифицировать изображения, для которых у нас нет ярлыков, глядя на скрытый код y и выбирая тот, который имеет наибольшее значение. При текущих настройках потеря классификации составляет около 3% при использовании 100 помеченных образцов и 47 000 немаркированных.

Об обучении GPU

Наконец, мы сделаем небольшое сравнение времени обучения для этого последнего алгоритма на двух разных графических процессорах и ЦП на платформе Paperspace. Несмотря на то, что эта архитектура не очень сложна и состоит из нескольких линейных слоев, время обучения значительно сокращается при использовании ускорения графического процессора. Время обучения 500 эпох сокращается с почти 4 часов на CPU до примерно 9 минут при использовании Nvidia Quadro M4000 и до 6 минут на Nvidia Quadro P5000.

Больше материала

Чтобы попробовать облачный GPU сегодня, зарегистрируйтесь здесь.

Первоначально опубликовано на blog.paperspace.com 20 марта 2017 г.