Генеративное моделирование. Часть 2

Почему нас интересует генерация образцов

Здравствуйте и вновь добро пожаловать на занятия по теме «Глубокое обучение без учителя, часть 2».

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

Это закономерный вопрос. Множество новичков в машинном обучении вместо того, чтобы изучать само машинное обучение, хотят немедленных ответов на следующие типичные вопросы: как применить машинное обучение для предсказания цен на акции и заработать денег, как написать программу для беспилотного автомобиля и так далее. Это хорошие вопросы, но они некорректны при изучении машинного обучения. Это всё равно, что прийти в спортзал и попросить тренера научить поднимать 200-килограммовый вес. Тренер отвечает: ну, вначале вам надо научиться поднимать 50-килограммовый вес, затем 100-килограммовый, 150-килограммовый, а после этого вы сможете поднять и 200-килограммовый. Множеству людей не нравится такое слышать, они хотят сразу поднимать 200-килограммовый вес, забывая о 150-килограммовом, о правильной диете и о ежедневных тренировках в течение целого года, – они хотят поднимать 200-килограммовый вес уже сегодня, хотя – полагаю, вы поняли из этой явной аналогии, – что все эти вещи помогают и укрепляют вас на пути к поднятию 200 килограммов. В действительности же если всего этого не делать, то поднять такой вес, вероятнее всего, будет невозможно.

Подобным же образом, если вы хотите стать мастером в машинном обучении и действительно научиться использовать его в беспилотных автомобилях и других таких же современных технологиях, вам следует изучить и другие стороны машинного обучения, а не только обучение с учителем. Неслучайно эксперты в этой области – Лекун, Бенжио, Хинтон и другие – уделяли много внимания обучению без учителя. Как мы уже видели, обучение без учителя помогает нам разработать мощный теоретический инструментарий, улучшающий нашу работу в сфере обучения с учителем и не только. Некоторые задачи обучения без учителя непосредственно поддерживают обучение с учителем и улучшают его. Именно это мы и видели, используя автокодировщики и ограниченные машины Больцмана для жадного послойного предварительного обучения нейронных сетей обучения с учителем.

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

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

Одна из возможностей – обучение с подкреплением. В нём агент обучается, опытным путём взаимодействуя со средой. В качестве упрощённого примера рассмотрим, скажем, беспилотный автомобиль. Вождение автомобиля по ровной дороге без каких-либо препятствий не составляет особых трудностей; вождение становится сложным, если на пути появляются препятствия – пешеходы, заторы, выбоины, пересечённая местность, плохая погода и так далее. Именно в таких опасных ситуациях мы хотим быть уверены, что наше беспилотное приложение знает, как правильно себя вести. В то же время такое приложение должно получить опыт из реальной жизни. Так что, нам нужно разбить миллион машин, чтобы наша программа изучила все возможные случаи? Это кажется нереальным. Так как же нам обеспечить беспилотное приложение знаниями, как вести себя в опасной ситуации? Один из способов – смоделировать подобный опыт. Вообще говоря, если бы мы были в состоянии смоделировать среду таким образом, чтобы агент мог обучиться на модели, то избежали бы необходимости действовать в реальной среде, что, как вы видели, может оказаться затратным.

Другое приложение – «полуконтролируемое» обучение. Как вы, вероятно, уже знаете, глубокое обучение, как правило, работает лучше всего при наличии большого количества помеченных данных для обучения. Конечно же, это дорого и занимает много времени – представьте себе, что вам лично нужно просмотреть миллион картинок на компьютере и пометить их соответствующими метками. В то же время мы хотим использовать обучение с учителем и иметь метки – это даёт нам задачу, которую относительно несложно решить. Кроме того, иногда нам не нужно выполнять только обучение без учителя. Следовательно, стоит задуматься над вопросом: возможно ли использовать как помеченные, так и не помеченные данные в какой-то комбинации, чтобы выполнить «полуконтролируемое» обучение?

Ещё одно применение – работа с мультимодальными распределениями. Мы уже видели, что можем значительно улучшить генерацию изображений цифр путём моделирования их как мультимодальных гауссовых распределений. Нейронные сети также способны моделировать мультимодальные распределения, а генеративно-состязательные сети, как вы увидите, особенно в этом хороши. Таким образом, суть в том, что когда мы используем обычную функцию ошибок вроде квадрата ошибок, нейронная сеть пытается выделить центр всех действительных целевых переменных одновременно, а в итоге получается размытое изображение. Результаты можно увидеть на следующих изображениях (см. слайд). Задача – постараться спрогнозировать следующий кадр в видео. Левое изображение – то, что есть на самом деле, среднее – то, что получается при использовании квадрата ошибок в качестве функции затрат, а правое – то, что получается при использовании состязательного обучения.

Следующее применение вы, вероятно, видели в фильмах, где часто встречаются случаи, когда у нас есть некоторое размытое изображение, а мы хотим программным путём сделать его чётче. Долгое время у нас были подобные алгоритмы, однако не все они воспроизводят реалистичные изображения в высоком качестве. Это так называемая повышающая дискретизация, или другими словами, преобразование маленького изображения в большее, чем исходное.

Об ещё одном применении я говорил во введении к этому курсу – создание произведений искусства. Обычно науку считают противоположностью искусства, однако может быть, что искусство будущего будет создавать ИИ, а не люди. Возможно, оно будет даже лучше, чем то, на что способны люди, – по крайней мере, ИИ будет в состоянии создавать всё это быстрее и эффективнее людей. Представьте себе топ-40 музыкальных хитов, где даже исполнителем не является человек! Истина в том, что ни одна из профессий не застрахована от прихода в неё ИИ.

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

А вот и ещё один пример из моих собственных курсов. Цель – создать нечто реалистичное. В курсе по обработке естественных языков мы делали проект по созданию синонимайзера текста. Это, а также написание статей вообще – это нечто вроде святого Грааля – оно навсегда изменит отрасль, если содержание окажется возможным писать автоматически. Задумайтесь: вы проходите этот курс, потому что он создан человеком, способным вас чему-то научить; вы также, вероятно, каждый день просматриваете два-три сайта, чтобы узнать новости. Не покажется ли странным, что вся полученная вами информация на самом деле исходила от робота? Что, если робот создал этот курс? А что, если машина окажется способной овладеть вашим вниманием и даже больше – убедить вам потратить деньги или поделиться чем-либо с друзьями? Что, если телешоу, фильмы, журналы и так далее – все они созданы роботами и специально нацелены на вашу личность, чтобы вы привыкли к ним и тратили время и деньги, желая продолжения? Это же мечта маркетологов!

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

Именно такую возможность дают нам вариационные автокодировщики и в особенности генеративно-состязательные сети. Это не значит, что прежде мы не встречались с генеративным моделированием, – мы всегда были в состоянии генерировать образцы, однако их качество не обязательно было удовлетворительным. Что интересно в генеративно-состязательных сетях – так это то, что качество создаваемых ими образов исключительно высоко, а с теоретической точки зрения они используют новейший метод обучения, который называется состязательным обучением и который ранее не рассматривался.

Так что проявите интерес, ведь глубокое обучение увлекательно и даёт замечательные результаты! И перестаньте полагать, что всё, что не решает вашу задачу по прогнозированию цен на акции, бесполезно.

Нейронная сеть и автокодировщик. Обзор

Сделаем краткий обзор нейронных сетей и в особенности автокодировщиков, чтобы подготовиться к упражнению-разминке в Theano и Tensorflow. Обратите внимание, что это лишь обзор, а не расширенное описание, здесь не будет никаких примеров, так что если вы не понимаете, что здесь обсуждается, пожалуйста, разберитесь, прежде чем двигаться дальше.

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

Если проводится двоичная классификация, то исходящая вероятность p(y = 1|x) – это вероятность того, что x относится к классу 1, а не классу 0.

Нейронная же сеть – это просто несколько наборов логистических регрессий:

Если проводится двоичная классификация, то исходящая вероятность p(y = 1|x) – это вероятность того, что x относится к классу 1, а не классу 0.

Нейронная же сеть – это просто несколько наборов логистических регрессий:

Эти уравнения описывают L-слойную нейронную сеть. Каждую строку можно рассматривать как отдельную логистическую регрессию. В таком случае f может быть любой нелинейной функцией активации, например сигмоидой, гиперболическим тангенсом, усечённым линейным преобразованием и так далее. В наши дни довольно типичным выбором по умолчанию является усечённое линейное преобразование relu. На выходе же мы имеем различные функции g, в зависимости от того, какого рода задачу мы пытаемся решить. Так, для задач регрессии g является тождеством: g(v) = v, так что последний слой похож на слой линейной регрессии. Для задач двоичной классификации она является сигмоидой, которую мы часто будем использовать в этом курсе, а для задач мультиклассовой классификации g является функцией softmax, которую мы, скорее всего, в данном курсе использовать не будем.

Нейронные сети, как правило, используются для обучения с учителем, под которым понимаются задачи классификации или регрессии. В этом случае мы должны создать две главные функции – fit (приспособление) и predict (предсказание). Предсказать – это значит перейти от x к y: если есть заданное x, то каким будет прогнозное значение y? Приспособление же означает корректировку весовых коэффициентов таким образом, чтобы в учебных данных прогнозы были как можно ближе к правильным ответам (целевым переменным). Мы знаем, как делать предсказание, ведь я только что дал уравнения для этого; приспособление – вот где в нейронных сетях выполняется большая часть работы. Основным нашим инструментом для приспособления является так называемый градиентный спуск. Чтобы он работал, мы создаём функцию затрат – обозначим её через J – и «двигаем» параметры модели в направлении градиента J, что логично, поскольку градиент указывает нам направление самого быстрого спуска. Если представить J в виде чаши, то наша цель – как можно быстрее достичь её дна. Как видите, градиентный спуск является ключевым компонентом всех алгоритмов, которые вы изучите в данном курсе, да и машинного обучения в целом.

Один из по-настоящему простых способов использовать нейронную сеть – использовать библиотеку Sci-Kit Learn. Она имеет стандартный API – функции fit(X, Y) для обучения и predict(X) для предсказания. Забавно, но я помню одного разработчика Sci-Kit Learn, который возражал против включения нейронных сетей в библиотеку, ведь на самом деле они не являются моделью типа «подключи и работай», как метод случайного леса. Я тоже привык получать этот вопрос, в основном от новичков: почему бы просто не дать нам API, зачем нам учить эти производные? Простой ответ заключается в том, что нельзя просто «подключить и работать» для эффективного использования глубокого обучения – вы не можете просто «подключить и работать», а должны принимать разумные решения, основанные на принципах работы нейронных сетей. По-моему, смешно, что наконец-то у нас всё-таки появился API в библиотеке Sci-Kit Learn для нейронных сетей. Однако предположим, что вы хотите создать вариационный автокодировщик или генеративно-состязательную сеть. И разумеется, библиотека Sci-Kit Learn вам в этом всё равно не поможет.

Этот курс посвящён нейронным сетям для обучения без учителя, а одна из простейших нейронных сетей для обучения без учителя, которую мы в состоянии создать, называется автокодировщиком. Итак, что же такое автокодировщик? Ключевой тут является приставка «авто», означающая «само». Другими словами, это нейронная сеть, которая просто предсказывает собственные входные данные, так что вместо стандартной функции fit(X, Y) у нас идёт fit(X, X) – весьма простая идея.

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

С другой стороны, любопытно и то, что построение автокодировщика с размером скрытого слоя, превышающим размер входного, всё ещё приводит к желаемым результатам. Можно допустить, что если у нас есть N скрытых слоёв и N учебных примеров, то нейронная сеть может просто научиться копировать учебные данные, что приведёт к серьёзной переобученности, однако исследования показали, что этого не происходит.

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

Ещё одно применение автокодировщиков – совершение предварительного обучения без учителя, что, как было показано, приносит пользу для обучения с учителем – мы рассматривали это в предыдущем курсе. Впрочем, способ выполнения этой задачи не имеет отношения к данному курсу, и вам нет нужды знать о нём, это лишь пример того, как можно использовать нейронную сеть, которая просто учится прогнозировать собственные входные данные. Иногда полезность такого рода применения не всегда очевидна.

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

Андрей Никитенко
Андрей Никитенко
Задать вопрос эксперту
Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Share via
Copy link