Новости

29.06.2020

Книга «Глубокое обучение с подкреплением. AlphaGo и другие технологии»

Для экспериментов используются самые разные среды обучения с подкреплением (RL), начиная с классических CartPole и GridWorld и заканчивая эмуляторами Atari и средами непрерывного управления (на основе PyBullet и RoboSchool). Множество примеров основано на нестандартных средах, в которых мы с нуля разработаем модель окружения.


Для кого эта книга


Основная целевая аудитория — люди, которые обладают знаниями о машинном обучении и хотят на практике разобраться в том, что такое обучение с подкреплением. Читатель должен быть знаком с языком Python и основами глубокого и машинного обучения. Дополнительным плюсом будет знание статистики, но это не абсолютно необходимо для понимания большинства материала.

 

Обучение seq2seq


Все это очень интересно, но как связано с RL? Связь заключается в процессе обучения модели seq2seq. Но прежде, чем перейти к современным подходам RL к проблеме, мы должны сказать пару слов о стандартном способе обучения.

Обучение с использованием максимального правдоподобия


Представьте, что нужно создать систему машинного перевода с одного языка (скажем, французского) на другой (английский), используя seq2seq. У нас есть хороший, большой набор предложений, переведенных с французского на английский, на которых мы собираемся обучать нашу модель. Как это сделать?

Фаза кодирования очевидна: мы применяем кодировщик к первому предложению в обучающей паре, создавая его закодированное представление. Естественным кандидатом на это представление будет скрытое состояние, возвращаемое из последнего применения RNN. На этапе кодирования мы игнорируем выход RNN, принимая во внимание только скрытое состояние из последнего применения RNN. А также расширяем предложение специальным токеном , который сигнализирует кодировщику об окончании предложения. Этот процесс показан на рис. 12.4.

 

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

Традиционный подход состоит в том, чтобы рассматривать эту проблему как задачу классификации, когда декодировщику необходимо вернуть распределение вероятностей по токенам в текущей позиции декодированного предложения. Обычно это делается преобразованием выходных данных декодировщика с использованием неглубокой (1–2 слоя) полносвязной сети, возвращающей вектор, длина которого равна размеру нашего словаря. Затем мы берем это распределение вероятностей и стандартные потери для задач классификации — перекрестную энтропию (известную также как потери максимального правдоподобия).

С первым токеном в декодированной последовательности, который должен порождаться токеном , заданным на входе, все ясно, но как насчет остальной части последовательности? Здесь есть два варианта. Первый — подача токенов из сопоставляемого предложения. Например, если у нас есть тренировочная пара Je ne mange pas six jours –> I haven't eaten for six days, мы подаем токены (I, haven’t, eaten…) в декодировщик и затем используем потери на перекрестную энтропию между выводом RNN и следующим токеном в предложении. Этот режим обучения называется управляемым учителем (teacher forcing), и на каждом шаге мы вводим токен из правильного перевода, запрашивая у RNN корректный следующий токен. Данный процесс показан на схеме (рис. 12.5).

 

 

Выражение для потерь в предыдущем примере будет рассчитываться следующим образом:

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

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

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

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

Чтобы не допустить этого, существует второй подход к обучению seq2seq, называемый обучением по цепочке (curriculum learning). Этот метод использует те же самые потери на перекрестную энтропию, но вместо передачи полной целевой последовательности в качестве входных данных декодировщика мы просто просим его декодировать последовательность таким же образом, каким собираемся применять ее после обучения. Данный процесс иллюстрируется на следующей схеме (рис. 12.6). Это добавляет надежности декодировщику, что дает лучший результат при практическом применении модели.

 

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

Оценка Bilingual evaluation understudy


Прежде чем перейти к основной теме этой главы (RL для seq2seq), нам нужно ввести параметр, применяемый для сравнения качества вывода машинного перевода и обычно используемый в задачах NLP. Параметр Bilingual evaluation understudy (BLEU) является одним из стандартных способов сравнения выходной последовательности, создаваемой машиной, с некоторым набором опорных выходов. Он позволяет задействовать несколько эталонных выходов (одно предложение может быть переведено различными способами) и, по сути, вычисляет соотношение униграмм, биграмм и т. д., которые совместно используются полученными выводами и ссылочными предложениями.

Существуют и другие альтернативы, такие как CIDEr и ROGUE. В этом примере мы применяем BLEU, реализованный в библиотеке nltk из Python (пакет nltk.translate.bleu_score).

RL в seq2seq


RL и порождение текста могут выглядеть очень разными, но между ними есть точки соприкосновения, которые можно использовать для улучшения качества обученных моделей seq2seq. Первое, на что следует обратить внимание, — то, что наш декодировщик выводит распределение вероятностей на каждом шаге, что очень похоже на модели на основе градиентов по стратегиям. С этой точки зрения декодировщик можно рассматривать как агента, пытающегося решить, какой токен создавать на каждом этапе. У подобной интерпретации процесса декодирования существует несколько преимуществ.

Прежде всего, рассматривая процесс декодирования как стохастический, мы можем автоматически учитывать несколько целевых последовательностей. Например, услышав «Привет! Как дела?», мы можем ответить множеством способов, и все они верны. Оптимизируя показатель максимального правдоподобия, наша модель попытается выучить что-то среднее для всех этих ответов, но среднее для предложений «Все в порядке, спасибо!» и «Не очень хорошо» не обязательно будет осмысленной фразой. Возвращая распределение вероятностей и выбирая из него следующий токен, наш агент потенциально мог бы научиться создавать все возможные варианты, вместо того чтобы учиться какому-то усредненному ответу.

Вторым преимуществом является оптимизация интересующего показателя. При обучении с использованием максимального правдоподобия мы сводим к минимуму перекрестную энтропию между созданными и взятыми из эталона токена ми, но при машинном переводе и решении многих других задач NLP нас не особо волнует максимальное правдоподобие: мы хотим максимизировать оценку BLEU полученной последовательности. К сожалению, оценка BLEU недифференцируема, поэтому мы не можем использовать ее как ошибку в алгоритме обратного распространения. Однако такие методы PG, как REINFORCE (см. главу 9), работают даже тогда, когда вознаграждение недифференцируемо: мы просто увеличиваем вероятности для успешных эпизодов и уменьшаем для неудачных.

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

 

Для того чтобы понять, как переключить обучение с максимального правдоподобия на сценарий RL, рассмотрим их оба с математической точки зрения. Оценка максимального правдоподобия означает максимизацию суммыimage путем подстройки параметра модели, что является тем же самым, что и минимизация расстояния Кульбака — Лейблера между распределением вероятности данных и распределением вероятности, параметризованным моделью, которое может быть записано как максимизация выражения image

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

 

С полным содержанием статьи можно ознакомиться на сайте "Хабрахабр": https://habr.com/ru/company/piter/blog/507830/


Комментарии: 0

Пока нет комментариев


Оставить комментарий






CAPTCHAОбновить изображение

Наберите текст, изображённый на картинке

Все поля обязательны к заполнению.

Перед публикацией комментарии проходят модерацию.