глубокое обучение с подкреплением alphago и другие технологии pdf
Книга «Глубокое обучение с подкреплением. AlphaGo и другие технологии»
Привет, Хаброжители! Мы издали книгу Максима Лапаня shmuma, это — подробное руководство по новейшим инструментам глубокого обучения с подкреплением и их ограничениям. Мы реализуем и проверим на практике методы кросс-энтропии и итерации по ценностям (Q-learning), а также градиенты по стратегиям.
Для экспериментов используются самые разные среды обучения с подкреплением (RL), начиная с классических CartPole и GridWorld и заканчивая эмуляторами Atari и средами непрерывного управления (на основе PyBullet и RoboSchool). Множество примеров основано на нестандартных средах, в которых мы с нуля разработаем модель окружения.
Для кого эта книга
Основная целевая аудитория — люди, которые обладают знаниями о машинном обучении и хотят на практике разобраться в том, что такое обучение с подкреплением. Читатель должен быть знаком с языком Python и основами глубокого и машинного обучения. Дополнительным плюсом будет знание статистики, но это не абсолютно необходимо для понимания большинства материала.
Глава 1 «Что такое обучение с подкреплением» — это введение в обучение с подкреплением и представление основных формальных моделей.
Глава 2 «OpenAI Gym» ознакомит читателя с практическим аспектом обучения с подкреплением с помощью библиотеки Gym с открытым исходным кодом.
Глава 3 «Глубокое обучение с помощью PyTorch» представляет собой краткий обзор библиотеки PyTorch.
Глава 4 «Метод кросс-энтропии» расскажет об одном из простейших методов обучения с подкреплением, помогая получить общее понимание проблем и методик данной области.
Глава 5 «Динамическое программирование и уравнение Беллмана» — это введение в семейство методик обучения с подкреплением с оценкой состояния.
Глава 6 «Глубокие Q-сети» описывает DQN — расширение базовых методов оценки состояний, которые позволяют работать над сложными средами.
Глава 7 «Расширения для DQN» дает детальный обзор современных расширений метода DQN, обеспечивающих бˆольшие стабильность и сходимость в сложных средах.
Глава 8 «Торговля акциями с использованием обучения с подкреплением» — это первый практический проект, в котором метод DQN применен к торгам на бирже.
Глава 9 «Градиенты по стратегиям» рассматривает другое семейство методов RL на основе оптимизации стратегии.
Глава 10 «Метод актора-критика» описывает один из наиболее широко используемых методов в RL.
Глава 11 «Асинхронный метод актора-критика» расширяет метод актора-критика взаимодействием с параллельными средами, чтобы улучшить стабильность и сходимость.
Глава 12 «Тренировка чат-ботов с помощью обучения с подкреплением» — второй проект, в котором методы обучения с подкреплением применены к задачам NLP.
Глава 13 «Веб-навигация» — еще один большой проект с применением обучения с подкреплением к навигации по веб-страницам; в нем использован набор задач MiniWoB.
Глава 14 «Непрерывное пространство действий» описывает специфику сред с использованием непрерывного пространства действий.
Глава 15 «Доверительные области — TRPO, PPO и ACKTR» — это еще одна глава о непрерывных пространствах действий, описывающая набор методов доверительной области.
Глава 16 «Оптимизация методом черного ящика в RL» показывает другой набор методов, не использующих градиенты в явном виде.
Глава 17 «Методы, основанные на моделях среды: воображение» представляет основанный на моделях подход к RL с использованием результатов последних исследований о воображении в RL.
Глава 18 «AlphaGo Zero» описывает метод AlphaGo Zero в применении к игре Connect Four.
Обучение seq2seq
Все это очень интересно, но как связано с RL? Связь заключается в процессе обучения модели seq2seq. Но прежде, чем перейти к современным подходам RL к проблеме, мы должны сказать пару слов о стандартном способе обучения.
Обучение с использованием максимального правдоподобия
Представьте, что нужно создать систему машинного перевода с одного языка (скажем, французского) на другой (английский), используя seq2seq. У нас есть хороший, большой набор предложений, переведенных с французского на английский, на которых мы собираемся обучать нашу модель. Как это сделать?
Чтобы начать декодирование, мы передаем закодированное представление во входное скрытое состояние декодировщика с токеном в качестве сигнала для начала процесса. На данном этапе декодировщик должен вернуть первый токенпереведенногопредложения. Однако в начале обучения, когда кодировщик и декодировщик инициализируются случайными весами, выход декодировщика будет случайным, и наша цель заключается в том, чтобы подтолкнуть его к правильному преобразованию с помощью стохастического градиентного спуска (SGD).
Традиционный подход состоит в том, чтобы рассматривать эту проблему как задачу классификации, когда декодировщику необходимо вернуть распределение вероятностей по токенам в текущей позиции декодированного предложения. Обычно это делается преобразованием выходных данных декодировщика с использованием неглубокой (1–2 слоя) полносвязной сети, возвращающей вектор, длина которого равна размеру нашего словаря. Затем мы берем это распределение вероятностей и стандартные потери для задач классификации — перекрестную энтропию (известную также как потери максимального правдоподобия).
Выражение для потерь в предыдущем примере будет рассчитываться следующим образом:
Поскольку и кодировщик, и декодировщик — это дифференцируемые НС, мы можем применить алгоритм обратного распространения к ошибке, чтобы принудить их обоих лучше классифицировать этот пример в будущем, тем же способом, каким обучаем, например, классификатор изображений.
К сожалению, предыдущая процедура решает проблему обучения 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, рассмотрим их оба с математической точки зрения. Оценка максимального правдоподобия означает максимизацию суммы путем подстройки параметра модели, что является тем же самым, что и минимизация расстояния Кульбака — Лейблера между распределением вероятности данных и распределением вероятности, параметризованным моделью, которое может быть записано как максимизация выражения
В то же время целью метода REINFORCE является максимизация выражения Связь очевидна, и разница между ними заключается только в масштабном коэффициенте перед логарифмом и способе выбора действий, которые являются токенами в нашем словаре.
На практике REINFORCE для обучения seq2seq может быть записан в виде следующего алгоритма.
1. Для каждого примера в обучающем наборе данных получить закодированное представление E, используя кодировщик.
2. Инициализировать текущий токен специальным значением T = ».
3. Инициализировать выходную последовательность пустой последовательностью Out = [].
6. Оценить градиенты
7. Обновить модель с помощью SGD.
8. Повторять до достижения сходимости.
Самокритичное обучение на последовательностях
Описанный подход, несмотря на свои положительные стороны, сопряжен с рядом сложностей. Обучаться с нуля практически бесполезно. Даже для простых диалогов выходная последовательность обычно содержит минимум пять слов, каждое из которых взято из словаря в несколько тысяч слов. Число различных фраз, состоящих из пяти слов со словарем из 1000 слов, равно 51000, что немного меньше, чем 10700. Таким образом, вероятность получения правильного ответа в начале обучения, когда веса для кодировщика и декодировщика являются случайными, ничтожно мала. Чтобы справиться с этим, можно объединить подходы, основанные на максимальном правдоподобии и RL, и предварительно обучить модель с показателем максимального правдоподобия (переключение между обучением, управляемым учителем, и обучением по цепочке), а после того, как она достигнет некоторого уровня качества, переключиться на метод REINFORCE для тонкой настройки. В общем, это можно рассматривать как единый подход к сложным задачам RL, когда большое пространство действий делает невозможным старт с агентом, чье поведение случайно, поскольку вероятность того, что такой агент случайно достигнет цели, незначительна. Существует множество исследований, посвященных включению сгенерированных извне примеров в процесс обучения RL, и в них в качестве одного из подходов называют предварительное обучение с использованием максимальных правдоподобий на правильных действиях.
Еще одна проблема с методом REINFORCE — высокая дисперсия градиентов, которую мы обсуждали в главе 10. Как вы, наверное, помните, для решения этой проблемы был применен метод актора-критика (A2C), который использовал специальную оценку ценности состояния в качестве дисперсии. Таким образом, мы можем применить метод A2C, конечно, расширив декодировщик другим выходом и вернув оценку ценности BLEU, учитывая декодированную последовательность, однако существует более удачный подход. В работе Self-Critical Sequence Training for Image Captionings, опубликованной С. Ренье (S. Rennie), Е. Марчереттом (E. Marcherett) и другими в 2016 году, был предложен лучший подход.
Авторы статьи применили декодировщик в режиме argmax для генерации последовательности, которая затем использовалась для вычисления параметра сход ства типа BLEU или аналогичного. Переключение в режим argmax делает процесс декодирования полностью детерминированным и обеспечивает базу для градиентов по стратегиям REINFORCE в формуле:
В следующем разделе мы реализуем и обучим простой чат-бот из набора диалогов, взятых из фильмов.
Об авторе
Максим Лапань — энтузиаст глубокого обучения и независимый эксперт. На протяжении 15 лет он занимается разработкой программного обеспечения и системной архитектуры, включая разработку низкоуровневых драйверов ядра Linux, а также оптимизацию производительности и архитектуры распределенных приложений, работающих на тысячах серверов. Имея обширный опыт работы в сферах больших данных, машинного обучения и больших распределенных систем, он обладает талантом объяснять сложные вещи простыми словами и на живых примерах. В данный момент в сферу его интересов входят практические приложения глубокого обучения, такие как глубокая обработка естественного языка и глубокое обучение с подкреплением.
Максим живет в Москве (Российская Федерация) с семьей и работает в израильском стартапе в должности старшего разработчика NLP (Natural Language Processing — обработка естественного языка).
О редакторах
Басем О. Ф. Алижла (Basem O. F. Alijla) получил степень кандидата наук по интеллектуальным системам в USM (Малайзия) в 2015 году. В данный момент преподает на кафедре разработки программного обеспечения Исламского университета сектора Газа (Палестина). Он автор нескольких технических работ, опубликованных в журналах и представленных на международных конференциях. Сейчас в круг его интересов входят оптимизация, машинное обучение и извлечение данных (Data mining).
Олег Васильев — специалист в области информатики и инженерии данных. Участвовал в разработке программы «Прикладная математика и информатика» для Национального исследовательского университета «Высшая школа экономики» (Москва), в частности раздела о распределенных системах. Принимал участие в разработке Git-course, Practical_RL и Practical_DL, преподавал в Высшей школе экономики и Школе анализа данных «Яндекса» (YSDA). Ранее Олег был научным сотрудником в Dialog Systems Group и Yandex. В данный момент он занимает должность вице-президента по управлению инфраструктурой в GoTo Lab — образовательной корпорации, а также сотрудничает с Digital Contract в качестве инженера-программиста.
Михаил Юрушкин — кандидат математических наук, трудится в области прикладной математики. В сферу его исследований входят высокопроизводительные вычисления и оптимизация разработки компиляторов. Он участвовал в разработке современной системы оптимизации параллельной компиляции. Михаил — старший преподаватель Южного федерального университета (Ростов-на-Дону, Россия). Он ведет курсы глубокого обучения, в частности на тему компьютерного зрения и NLP. Михаил восемь лет занимался кросс-платформенной нативной разработкой на С++, машинным обучением (ML) и глубоким обучением (DL). Сейчас он является консультантом в сферах ML/DL.
Для Хаброжителей скидка 25% по купону — Глубокое обучение
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
«Глубокое обучение с подкреплением. AlphaGo и другие технологии»: анонс книги
У нас доступна для предзаказа одна из лучших книг по обучению с подкреплением, в оригинале именуемая «Deep Reinforcement Learning Hands-on» под авторством Максима Лапаня. Вот как будет выглядеть обложка русского перевода:
Чтобы вы могли оценить краткое содержание книги, предлагаем вам перевод обзора, написанного автором к выходу оригинала.
Я – энтузиаст-самоучка, увлекающийся глубоким обучением. Поэтому, когда со мной связались представители издательства «Packt», предложившие написать практичную книгу о современном состоянии глубокого обучения с подкреплением, мне было немного боязно, но после некоторых колебаний я согласился, оптимистично предполагая: «о, будет же интересный опыт».
Не скажу, что эта работа далась мне как легкая прогулка, конечно нет. Никаких тебе выходных, никакого свободного времени, постоянный страх «сморозить глупость» и погоня за дедлайнами по каждой главе (две недели на главу и код примеров). Однако, в целом все прошло позитивно и очень интересно.
Прежде чем кратко описать содержание каждой главы, давайте опишу вам идею всей книги.
Когда я начал экспериментировать в области RL более четырех лет назад, в моем распоряжении были следующие источники информации:
Может быть, что-то еще было, но важнейшими источниками информации были именно эти. Все они очень далеки от практики:
В то же время, меня очень зацепила статья DeepMind (“Нейронная сеть может по пикселям обучиться играть в игры Atari! ВАУ!”), и я чувствовал, что за этой сухой теорией скрывается огромная практическая ценность. Итак, я потратил очень много времени на изучение теории, реализуя различные методы и занимаясь их отладкой. Как вы, вероятно, догадываетесь, это было непросто: можно потратить пару недель на оттачивание метода, а затем обнаружить, что ваша реализация неверна (или, того хуже, вы неправильно поняли формулу). Я не считаю такое обучение тратой времени – напротив, я думаю, что это самый правильный способ изучить что-либо. Однако, на это требуется масса времени.
Два года спустя, когда я приступил к работе над текстом, моя основная цель была такова: дать основательную практичную информацию по методам RL читателю, который только знакомится с этой увлекательной дисциплиной – как я когда-то.
Теперь немного о книге. Она ориентирована прежде всего на практику, причем, я постарался свести к минимуму объем теории и формул. Ключевые формулы в ней есть, но доказательства не приводится. В основном я стараюсь дать интуитивное понимание происходящего, не стремясь максимальной строгости изложения.
В то же время, предполагается, что читатель обладает базовыми знаниями глубокого обучения и статистики. В книге есть глава с обзором библиотеки PyTorch (так как все примеры даны с использованием PyTorch), но эту главу нельзя считать самодостаточным источником информации по нейронным сетям. Если вы раньше никогда не слышали о функциях потерь и активации – начните с изучения других книг, сегодня их много. (Прим. пер.: например, книга «Глубокое обучение»).
В моей книге вы найдете массу примеров различной сложности, начиная с самых простых (метод CrossEntropy в среде CartPole содержит
100 строк на python), заканчивая немаленькими проектами, например, изучением AlphGo Zero или агента RL для торговли на бирже. Код примеров полностью выложен на GitHub, всего там более 14k строк кода на Python.
Книга состоит из 18 глав, охватывающих наиболее важные аспекты современного глубокого обучения с подкреплением:
Вот и все! Надеюсь, книга вам понравится.
Книга «Глубокое обучение с подкреплением на Python. OpenAI Gym и TensorFlow для профи»
Отрывок. Генерирование текстов песен посредством LSTM RNN
А теперь посмотрим, как использовать LSTM для генерирования текстов песен Зейна Малика. Набор данных с текстами песен Зейна можно загрузить по адресу https://github.com/sudharsan13296/Hands-On-Reinforcement-Learning-With-Python/blob/master/07.%20Deep%20Learning%20Fundamentals/data/ZaynLyrics.txt.
Работа начинается с импортирования необходимых библиотек:
Затем читается файл с текстами песен:
Убедимся в том, что данные были успешно загружены:
Теперь все символы сохраняются в переменной all_chars:
Количество уникальных символов сохраняется в unique_chars:
А общее количество символов сохраняется в переменной total_chars:
Сначала мы присвоим каждому символу индекс. char_to_ix будет содержать отображение символа на индекс, а ix_to_char — отображение индекса на символ:
Затем определяется функция generate_batch, которая генерирует входные и целевые значения. Целевые значения равны сдвигу входного значения, умноженному на i.
Например, если input = [12,13,24] со значением сдвига 1, то целевые значения будут равны [13,24]:
Мы определим длину последовательности, скорость обучения и количество узлов, которое равно числу нейронов:
Построим LSTM RNN. TensorFlow предоставляет функцию BasicLSTMCell() для построения ячеек LSTM; вы должны задать количество единиц в ячейке LSTM и тип используемой функции активации.
Итак, мы создаем ячейку LSTM и строим сеть RNN с этой ячейкой при помощи функции tf.nn.dynamic_rnn(), которая возвращает выход и значение состояния:
Теперь создадим заместителя для входа X и цели Y:
Преобразуем X и Y в int:
Также создадим onehot-представления для X и Y:
Получим выходы и состояния от RNN вызовом функции build_rnn:
Инициализируем веса и смещение:
Вычислим выход, умножая выход на веса и прибавляя смещение:
Теперь выполним softmax-активацию и получим вероятности:
Потеря cross_entropy будет вычислена в следующем виде:
Наша цель — минимизация потери, поэтому мы выполним обратное распространение для сети и проведем градиентный спуск:
Затем будет определена вспомогательная функция predict, которая даст индексы следующего прогнозируемого символа в соответствии с моделью RNN:
Затем будет задан размер пакета batch_size, количество пакетов и количество эпох, а также величина сдвига shift для генерирования пакета:
Наконец, мы создаем сеанс TensorFlow и строим модель:
Как видно из результатов, в исходной эпохе выход состоит из случайных символов, но по мере обучения результаты улучшаются:
Об авторе
Судхарсан Равичандиран — специалист по обработке и анализу данных, горячий поклонник искусственного интеллекта и видеоблогер. Он получил степень бакалавра в области computer science в Университете Анны и занимается исследованиями практической реализации глубокого обучения и обучения с подкреплением, включая обработку естественных языков и компьютерное зрение. Ранее работал внештатным веб-дизайнером и разработчиком, участвовал в создании ряда сайтов, отмеченных наградами. В настоящее время принимает участие в проектах с открытым кодом и часто отвечает на вопросы на Stack Overflow.
О научных редакторах
Суджит Пал (Sujit Pal) — руководитель технических исследований в Elsevier Labs, группы разработки новейших технологий компании Reed-Elsevier Group. Занимается исследованиями в области семантического поиска, обработки естественных языков, машинного и глубокого обучения. В Elsevier работал над несколькими инициативными проектами, включая оценку и совершенствование качества поиска, классификацию изображений и выявление дубликатов, аннотацию и разработку антологий медицинских и научных текстов. Он написал книгу о глубоком обучении совместно с Антонио Галли (Antonio Gulli) и пишет о технологиях в своем блоге Salmon Run.
Сурьядипан Рамамурти (Suriyadeepan Ramamoorthy) — исследователь искусственного интеллекта и инженер из AI researcher and engineer в Пондичерри (Индия). Основная тематика его работ — понимание естественных языков и формирование рассуждений. Он активно пишет в блоге, посвященном глубокому обучению. В SAAMA Technologies он применяет расширенные методы глубокого обучения для анализа биомедицинских текстов. Являясь ярым сторонником свободно распространяемого ПО, активно участвует в проектах по его разработке в сообществе FSFTN. Также интересуется коллективными сетями, визуализацией данных и творческим программированием.
Для Хаброжителей скидка 25% по купону — Python
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.