Обучение с подкреплением на PyTorch: сборник рецептов
Свыше 60 рецептов проектирования, разработки и развертывания самообучающихся моделей на Python
Покупка
Издательство:
ДМК Пресс
Автор:
Лю Юси (Хэйден)
Перевод:
Слинкин Алексей Александрович
Год издания: 2020
Кол-во страниц: 282
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-97060-853-1
Артикул: 748351.01.99
Доступ онлайн
В корзину
Библиотека PyTorch выходит на передовые позиции в качестве средства обучения с подкреплением (ОП) благодаря эффективности и простоте ее использования. Эта книга организована как справочник по работе с PyTorch, охватывающий широкий круг тем - от самых азов (настройка рабочей среды) до практических задач (рассмотрение ОП на конкретных примерах). Вы научитесь использовать алгоритм «многоруких бандитов» и аппроксимацию функций; узнаете, как победить в играх Atari с помощью глубоких О-сетей и как эффективно реализовать метод градиента стратегии; увидите, как применить метод ОП к игре в блэкджек, к окружающим средам в сеточном мире, к оптимизации рекламы в интернете и к игре Flappy Bird.
Издание предназначено для специалистов по искусственному интеллекту, которым требуется помощь в решении задач ОП. Для изучения материала необходимо знакомство с концепциями машинного обучения; опыт работы с библиотекой PyTorch необязателен, но желателен.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Юси (Хэйден) Лю Обучение с подкреплением на PyTorch: сборник рецептов
PyTorch 1.x Reinforcement Learning Cookbook Over 60 recipes to design, develop, and deploy self-learning AI models using Python Yuxi (Hayden) Liu BIRMINGHAM – MUMBAI
Обучение с подкреплением на PyTorch: сборник рецептов Свыше 60 рецептов проектирования, разработки и развертывания самообучающихся моделей на Python Юси (Хэйден) Лю Москва, 2020
УДК 004.85 ББК 32.971.3 Л93 Лю Ю. (Х.) Л93 Обучение с подкреплением на PyTorch: сборник рецептов / пер. с англ. А. А. Слинкина. – М.: ДМК Пресс, 2020. – 282 с.: ил. ISBN 978-5-97060-853-1 Библиотека PyTorch выходит на передовые позиции в качестве средства обучения с подкреплением (ОП) благодаря эффективности и простоте ее использования. Эта книга организована как справочник по работе с PyTorch, охватывающий широкий круг тем – от самых азов (настройка рабочей среды) до практических задач (рассмотрение ОП на конкретных примерах). Вы научитесь использовать алгоритм «многоруких бандитов» и аппроксимацию функций; узнаете, как победить в играх Atari с помощью глубоких Q-сетей и как эффективно реализовать метод градиента стратегии; увидите, как применить метод ОП к игре в блэкджек, к окружающим средам в сеточном мире, к оптимизации рекламы в интернете и к игре Flappy Bird. Издание предназначено для специалистов по искусственному интеллекту, которым требуется помощь в решении задач ОП. Для изучения материала необходимо знакомство с концепциями машинного обучения; опыт работы с библиотекой PyTorch необязателен, но желателен. УДК 004.85 ББК 32.971.3 First published in the English language under the title ‘PyTorch 1.x Reinforcement Learning Cookbook Russian language edition copyright © 2020 by DMK Press. All rights reserved. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. ISBN 978-1-83855-196-4 (англ.) Copyright © Packt Publishing 2019 ISBN 978-5-97060-853-1 (рус.) © Оформление, издание, перевод, ДМК Пресс, 2020
Содержание Об авторе ...........................................................................................................12 О рецензентах .................................................................................................13 Предисловие ....................................................................................................14 Глава 1. Приступаем к обучению с подкреплением и PyTorch ............................................................................................................19 Подготовка среды разработки .............................................................................19 Как это делается ................................................................................................20 Как это работает ...............................................................................................21 Это еще не все ...................................................................................................21 Установка OpenAI Gym .........................................................................................22 Как это делается ................................................................................................23 Как это работает ...............................................................................................23 Это еще не все ...................................................................................................23 Окружающие среды Atari .....................................................................................24 Как это делается ................................................................................................24 Как это работает ...............................................................................................27 Это еще не все ...................................................................................................28 Окружающая среда CartPole ................................................................................29 Как это делается ................................................................................................30 Как это работает ...............................................................................................32 Это еще не все ...................................................................................................32 Основы PyTorch.....................................................................................................33 Как это делается ................................................................................................33 Это еще не все ...................................................................................................36 Реализация и оценивание стратегии случайного поиска ..................................36 Как это делается ................................................................................................36 Как это работает ...............................................................................................39 Это еще не все ...................................................................................................39 Алгоритм восхождения на вершину ...................................................................41 Как это делается ................................................................................................42
Содержание Как это работает ...............................................................................................46 Это еще не все ...................................................................................................46 Алгоритм градиента стратегии ...........................................................................47 Как это делается ................................................................................................48 Как это работает ...............................................................................................51 Это еще не все ...................................................................................................52 Глава 2. Марковские процессы принятия решений и динамическое программирование .....................................................53 Технические требования ......................................................................................53 Создание марковской цепи .................................................................................54 Как это делается ................................................................................................54 Как это работает ...............................................................................................55 Это еще не все ...................................................................................................57 Создание МППР ....................................................................................................57 Как это делается ................................................................................................58 Как это работает ...............................................................................................59 Это еще не все ...................................................................................................60 Оценивание стратегии .........................................................................................60 Как это делается ................................................................................................61 Как это работает ...............................................................................................62 Это еще не все ...................................................................................................63 Имитация окружающей среды FrozenLake .........................................................66 Подготовка ........................................................................................................66 Как это делается ................................................................................................66 Как это работает ...............................................................................................68 Это еще не все ...................................................................................................69 Решение МППР с помощью алгоритма итерации по ценности ........................70 Как это делается ................................................................................................70 Как это работает ...............................................................................................72 Это еще не все ...................................................................................................73 Решение МППР с помощью алгоритма итерации по стратегиям .....................74 Как это делается ................................................................................................75 Как это работает ...............................................................................................77 Это еще не все ...................................................................................................77 Игра с подбрасыванием монеты .........................................................................78 Как это делается ................................................................................................79 Как это работает ...............................................................................................83 Это еще не все ...................................................................................................85
Содержание 7 Глава 3. Применение методов Монте-Карло для численного оценивания ......................................................................87 Вычисление π методом Монте-Карло .................................................................88 Как это делается ................................................................................................88 Как это работает ...............................................................................................89 Это еще не все ...................................................................................................90 Оценивание стратегии методом Монте-Карло ..................................................92 Как это делается ................................................................................................92 Как это работает ...............................................................................................94 Это еще не все ...................................................................................................94 Предсказание методом Монте-Карло в игре блэкджек .....................................95 Как это делается ................................................................................................96 Как это работает ...............................................................................................98 Это еще не все ...................................................................................................99 Управление методом Монте-Карло с единой стратегией ...............................101 Как это делается ..............................................................................................102 Как это работает .............................................................................................104 Это еще не все .................................................................................................106 Разработка управления методом Монте-Карло с ε-жад ной стратегией ........108 Как это делается ..............................................................................................108 Как это работает .............................................................................................111 Управление методом Монте-Карло с разделенной стратегией ......................111 Как это делается ..............................................................................................112 Как это работает .............................................................................................114 Это еще не все .................................................................................................115 Разработка управления методом Монте-Карло со взвешенной выборкой по значимости ...................................................................................116 Как это делается ..............................................................................................116 Как это работает .............................................................................................117 Это еще не все .................................................................................................118 Глава 4. TD-обучение и Q-обучение .....................................................119 Подготовка окружающей среды Cliff Walking ...................................................119 Подготовка ......................................................................................................120 Как это делается ..............................................................................................120 Как это работает .............................................................................................122 Реализация алгоритма Q-обучения...................................................................122 Как это делается ..............................................................................................123 Как это работает .............................................................................................124 Это еще не все .................................................................................................125 Подготовка окружающей среды Windy Gridworld ............................................127 Как это делается ..............................................................................................128 Как это работает .............................................................................................132
Содержание Реализация алгоритма SARSA............................................................................132 Как это делается ..............................................................................................132 Как это работает .............................................................................................134 Это еще не все .................................................................................................134 Решение задачи о такси методом Q-обучения .................................................136 Подготовка ......................................................................................................137 Как это делается ..............................................................................................137 Как это работает .............................................................................................140 Решение задачи о такси методом SARSA ..........................................................142 Как это делается ..............................................................................................142 Как это работает .............................................................................................143 Это еще не все .................................................................................................144 Реализация алгоритма двойного Q-обучения ..................................................146 Как это делается ..............................................................................................146 Как это работает .............................................................................................148 Глава 5. Решение задачи о многоруком бандите ............................150 Создание окружающей среды с многоруким бандитом ..................................150 Как это делается ..............................................................................................151 Как это работает .............................................................................................152 Решение задачи о многоруком бандите с помощью ε-жад ной стратегии .....153 Как это делается ..............................................................................................154 Как это работает .............................................................................................155 Это еще не все .................................................................................................156 Решение задачи о многоруком бандите с помощью softmax-исследования ........................................................................................156 Как это делается ..............................................................................................157 Как это работает .............................................................................................158 Решение задачи о многоруком бандите с помощью алгоритма верхней доверительной границы ....................................................................................159 Как это делается ..............................................................................................160 Как это работает .............................................................................................161 Это еще не все .................................................................................................162 Решение задачи о рекламе в интернете с помощью алгоритма многорукого бандита .........................................................................................162 Как это делается ..............................................................................................163 Как это работает .............................................................................................164 Решение задачи о многоруком бандите с помощью выборки Томпсона .......165 Как это делается ..............................................................................................166 Как это работает .............................................................................................171 Решение задачи о рекламе в интернете с помощью контекстуальных бандитов ..............................................................................................................172 Как это делается ..............................................................................................173 Как это работает .............................................................................................175
Содержание 9 Глава 6. Масштабирование с помощью аппроксимации функций ............................................................................................................177 Подготовка окружающей среды Mountain Car .................................................178 Подготовка ......................................................................................................179 Как это делается ..............................................................................................179 Как это работает .............................................................................................180 Оценивание Q-функций посредством аппроксимации методом градиентного спуска...........................................................................................180 Как это делается ..............................................................................................181 Как это работает .............................................................................................184 Реализация Q-обучения с линейной аппроксимацией функций ...................185 Как это делается ..............................................................................................185 Как это работает .............................................................................................187 Реализация SARSA с линейной аппроксимацией функций ............................188 Как это делается ..............................................................................................189 Как это работает .............................................................................................190 Пакетная обработка с применением буфера воспроизведения опыта ..........191 Как это делается ..............................................................................................192 Как это работает .............................................................................................194 Реализация Q-обучения с аппроксимацией функций нейронной сетью .......195 Как это делается ..............................................................................................195 Как это работает .............................................................................................197 Решение задачи о балансировании стержня с помощью аппроксимации функций ..............................................................................................................198 Как это делается ..............................................................................................198 Как это работает .............................................................................................199 Глава 7. Глубокие Q-сети в действии ....................................................200 Реализация глубоких Q-сетей ............................................................................200 Как это делается ..............................................................................................201 Как это работает .............................................................................................204 Улучшение DQN с помощью воспроизведения опыта .....................................206 Как это делается ..............................................................................................207 Как это работает .............................................................................................209 Реализация алгоритма Double DQN ..................................................................210 Как это делается ..............................................................................................211 Как это работает .............................................................................................214 Настройка гиперпараметров алгоритма Double DQN для среды CartPole ................................................................................................................215 Как это делается ..............................................................................................216 Как это работает .............................................................................................217 Реализация алгоритма Dueling DQN .................................................................218 Как это делается ..............................................................................................219 Как это работает .............................................................................................220
Содержание Применение DQN к играм Atari .........................................................................221 Как это делается ..............................................................................................223 Как это работает .............................................................................................226 Использование сверточных нейронных сетей в играх Atari ...........................227 Как это делается ..............................................................................................227 Как это работает .............................................................................................230 Глава 8. Реализация методов градиента стратегии и оптимизация стратегии ..........................................................................232 Реализация алгоритма REINFORCE ...................................................................232 Как это делается ..............................................................................................233 Как это работает .............................................................................................236 Реализация алгоритма REINFORCE с базой ......................................................238 Как это делается ..............................................................................................238 Как это работает .............................................................................................241 Реализация алгоритма исполнитель–критик ...................................................242 Как это делается ..............................................................................................243 Как это работает .............................................................................................246 Решение задачи о блуждании на краю обрыва с помощью алгоритма исполнитель–критик ..........................................................................................248 Как это делается ..............................................................................................248 Как это работает .............................................................................................251 Подготовка непрерывной окружающей среды Mountain Car ..........................252 Как это делается ..............................................................................................253 Как это работает .............................................................................................254 Решение непрерывной задачи о блуждании на краю обрыва методом A2C .......................................................................................................254 Как это делается ..............................................................................................254 Как это работает .............................................................................................257 Это еще не все .................................................................................................259 Решение задачи о балансировании стержня методом перекрестной энтропии .............................................................................................................260 Как это делается ..............................................................................................260 Как это работает .............................................................................................262 Глава 9. Кульминационный проект – применение DQN к игре Flappy Bird .........................................................................................264 Подготовка игровой среды ................................................................................264 Подготовка ......................................................................................................265 Как это делается ..............................................................................................265 Как это работает .............................................................................................269
Содержание 11 Построение глубокой Q-сети для игры Flappy Bird ..........................................269 Как это делается ..............................................................................................270 Как это работает .............................................................................................272 Обучение и настройка сети ................................................................................273 Как это делается ..............................................................................................273 Как это работает .............................................................................................275 Развертывание модели и игра ...........................................................................276 Как это делается ..............................................................................................276 Как это работает .............................................................................................277 Предметный указатель ..............................................................................278
Об авторе Юси (Хэйден) Лю – опытный специалист по обработке данных, специализирующийся на разработке моделей и систем машинного и глубокого обучения. Он работал в различных предметных областях, применяя свои познания в обуче нии с подкреплением. С удовольствием преподает и является автором ряда книг по машинному обучению. Его первая книга «Python Machine Learning By Example» была бестселлером Amazon в Индии в 2017 и 2018 годах. Его перу принадлежат также книги «R Deep Learning Projects» и «Hands-On Deep Learning Architectures with Python», опубликованные издательством Packt. Во время работы над магистерской диссертацией в Торонтском университете написал пять работ, опубликованных в изданиях IEEE и сборниках докладов на конференциях.
О рецензентах Грег Уолтерс занимается компьютерами и программированием с 1972 года. Отлично владеет языками Visual Basic, Visual Basic .NET, Python и SQL (диалектами MySQL, SQLite, Microsoft SQL Server, Oracle), C++, Delphi, Modula-2, Pascal, C, ассемблером 80x86, COBOL и Fortran. Обучает программированию, через его руки прошло множество людей, которых он учил таким продуктам, как MySQL, Open Database Connectivity, Quattro Pro, Corel Draw!, Paradox, Microsoft Word, Excel, DOS, Windows 3.11, Windows for Workgroups, Windows 95, Windows NT, Windows 2000, Windows XP и Linux. Сейчас на пенсии и в свободное время музицирует и обожает готовить, но всегда готов поработать фрилансером над разными проектами. Роберт Мони работает над докторской диссертацией в Будапештском университете технологии и экономики (BME), а также является экспертом по глубокому обучению в Континентальном центре компетенций по глубокому обучению в Будапеште. Руководит проектом, направленным на поддержку студенческих исследований в области глубокого обучения и разработки беспилотных автомобилей. Тема его исследований – глубокое обучение с подкреплением в сложных окружающих средах, а конечная цель – применение этой технологии к беспилотным транспортным средствам.
Предисловие Всплеск интереса к обучению с подкреплением (ОП) объясняется тем, что это революционный подход к автоматизации посредством обучения тому, какие действия следует предпринимать в окружающей среде, чтобы максимизировать полное вознаграждение. Эта книга представляет собой введение в важные концепции обучения с подкреплением и реализации его алгоритмов с применением библиотеки PyTorch. В каждой главе рассматривается какой-то один метод ОП и его применения в промышленности. Рецепты, содержащие практические примеры, помогут вам обогатить свои знания и навыки в области ОП, в том числе динамическое программирование, методы Монте-Карло, методы на основе временных различий, Q-обучение, решение задачи о многоруком бандите, аппроксимация функций, глубокие Q-сети, методы градиента стратегии. Интересные и легкие для усвоения примеры – игры Atari, блэкджек, сеточный мир, реклама в интернете, машина на горе, игра Flappy Bird – не позволят вам заскучать. Прочитав книгу, вы будете уверенно владеть распространенными алгоритмами обучения с подкреплением и научитесь применять их к решению различных практических задач. ПредПолагаемая аудитория Специалисты по машинному обучению, по обработке данных и искусственному интеллекту, которым нужна помощь в решении задач ОП. Предполагается предварительное знакомство с концепциями машинного обучения, опыт работы с библиотекой PyTorch необязателен, но желателен. Структура книги Глава 1 «Приступаем к обучению с подкреплением и PyTorch» – отправная точка, с которой начинается путешествие в мир обучения с подкреплением и PyTorch. Мы настроим рабочую среду и OpenAI Gym и познакомимся с окружающими средами для экспериментов с ОП, включая CartPole и игры Atari. Здесь же будет рассмотрена реализация таких базовых алгоритмов, как случайный поиск, восхождение на вершину и градиент стратегии. В конце главы будет дан краткий обзор PyTorch. Глава 2 «Марковский процесс принятия решений и динамическое программирование» начинается с создания марковской цепи и марковского процесса принятия решений (МППР) – понятия, которое лежит в основе большинства алгоритмов обучения с подкреплением. Затем мы рассмотрим два подхода
Структура книги 15 к решению МППР – итерация по ценности и итерация по стратегиям. Мы ближе познакомимся с МППР и уравнением Беллмана, попрактиковавшись в оценивании стратегии. Также будет продемонстрировано решение интересной игры с подбрасыванием монеты. И в конце мы покажем, как с помощью динамического программирования масштабировать обучение. Глава 3 «Применение методов Монте-Карло для численного оценивания» посвящена методам Монте-Карло. Для начала мы оценим, чему равно число π. Затем рассмотрим алгоритм с единой стратегией – управление методом Монте-Карло первого посещения – и несколько алгоритмов с разделенной стратегией на основе методов Монте-Карло. Также будут рассмотрены ε-жад ная стратегия и взвешенная выборка по значимости. Глава 4 «TD-обучение и Q-обучение» начинается с подготовки двух окружающих сред: блуждание на краю обрыва и ветреный сеточный мир, которые понадобятся для исследования обучения на основе временных различий (TDобучения) и Q-обучения. Мы научимся выполнять предсказания с помощью TD-обучения и обсудим Q-обучение как пример алгоритма с разделенной стратегией и SARSA как пример алгоритма с единой стратегией. Мы также сформулируем задачу о такси и покажем, как ее решать с помощью алгоритмов Q-обучения и SARSA. И наконец, будет рассмотрен алгоритм двойного Q-обуче ния. В главе 5 «Решение задачи о многоруком бандите» рассматривается алгоритм многорукого бандита – пожалуй, один из самых популярных в обучении с подкреплением. Мы покажем четыре подхода к решению этой задачи: ε-жадная стратегия, исследование с помощью функции softmax, алгоритм верхней доверительной границы и алгоритм на основе выборки Томпсона. Мы также поговорим о рекламе в интернете и продемонстрируем ее решение с помощью алгоритма многорукого бандита. Напоследок разработаем более сложный алгоритм контекстуального бандита и применим его к решению задачи об оптимизации показа рекламных объявлений. Глава 6 «Масштабирование с помощью аппроксимации функций» посвящена аппроксимации. Мы начнем с подготовки окружающей среды Mountain Car. Объясним, чем аппроксимация функций лучше табличного поиска, и научимся включать аппроксимацию в уже известные алгоритмы Q-обучения и SARSA. Также будет рассмотрена техника пакетного обучения с использованием буфера воспроизведения опыта. И наконец, мы покажем, как, воспользовавшись полученными знаниями, решить задачу о балансировании стержня на тележке. В главе 7 «Глубокие Q-сети в действии» рассматривается алгоритм глубокой Q-сети (DQN), который считается одним из наиболее передовых методов обуче ния с подкреплением. Мы разработаем модель DQN и объясним два принципа, лежащих в основе ее работы: буфер воспроизведения и целевая сеть. Для решения игр Atari мы покажем, как интегрировать в DQN сверточную нейронную сеть. Будут рассмотрены два варианта DQN: Double DQN и Dueling DQN. Мы также опишем точную настройку алгоритма Q-обучения, взяв в качестве примера Double DQN. Глава 8 «Реализация методов градиента стратегии и оптимизация стратегии» посвящена методам градиента стратегии и начинается с реализации алгоритма REINFORCE. Затем мы разработаем алгоритм REINFORCE с базой для
Предисловие решения задачи о блуждании на краю обрыва. Мы также реализуем алгоритм исполнитель–критик и применим его к решению той же задачи. Чтобы масштабировать детерминированный алгоритм градиента стратегии, воспользуемся приемами, заимствованными из DQN, и разработаем алгоритм глубокого детерминированного градиента стратегии. Ради интереса мы применим метод перекрестной энтропии, чтобы обучить агента балансированию стержня. И наконец, поговорим о том, как масштабировать алгоритм градиента стратегии с помощью асинхронного метода исполнитель–критик и нейронных сетей. В главе 9 «Кульминационный проект – применение DQN к игре Flappy Bird» мы рассмотрим, как методами обучения с подкреплением можно воспользоваться в игре Flappy Bird. Мы применим все полученные знания, чтобы создать интеллектуального бота. Затем настроим параметры модели и развернем ее. И посмотрим, как долго птица сможет продержаться в воздухе. графичеСкие выделения В этой книге для выделения семантически различной информации применяются различные стили. Ниже приведены примеры стилей с пояснениями. Код в тексте: фрагменты кода, имена таблиц базы данных, папок и файлов, URL-адреса, данные, введенные пользователем, адреса в Twitter, например: «Слово пустая не означает, что значения всех элементов равны Null». Отдельно стоящие фрагменты кода набраны так: >>> def random_policy(): ... action = torch.multinomial(torch.ones(n_action), 1).item() ... return action Текст, который вводится на консоли или выводится на консоль, напечатан следующим образом: conda install pytorch torchvision -c pytorch Новые термины, важные слова и слова на экране набраны полужирным шрифтом. Так же выделяются элементы интерфейса, например пункты меню и поля в диалоговых окнах. Например: «Этот подход называется случайным поиском, потому что вес в каждом испытании выбирается случайно в надежде, что при большом числе испытаний будет найден наилучший вес». Предупреждения и важные замечания оформлены так. Советы и рекомендации выглядят так. разделы В этой книге повторяются одни и те же заголовки разделов: Подготовка, Как это делается, Как это работает, Это еще не все и См. также. Опишем их назначение.
Список опечаток 17 Подготовка В этом разделе объясняется, чего ожидать от рецепта, как подготовить программную среду и выполнить все прочие предварительные условия. Как это делается Выполнение рецепта по шагам. Как это работает Подробное объяснение того, что происходило на каждом шаге, описанном в предыдущем разделе. Это еще не все Дополнительная информация, относящаяся к рецепту. См. также Ссылки на другую полезную информацию. отзывы и Пожелания Мы всегда рады отзывам наших читателей. Расскажите нам, что вы думаете об этой книге – что понравилось или, может быть, не понравилось. Отзывы важны для нас, чтобы выпускать книги, которые будут для вас максимально полезны. Вы можете написать отзыв прямо на нашем сайте www.dmkpress.com, зайдя на страницу книги, и оставить комментарий в разделе «Отзывы и рецензии». Также можно послать письмо главному редактору по адресу dmkpress@gmail. com, при этом напишите название книги в теме письма. Если есть тема, в которой вы квалифицированы, и вы заинтересованы в написании новой книги, заполните форму на нашем сайте http://dmkpress.com/ authors/publish_book/ или напишите в издательство: dmkpress@gmail.com. СПиСок оПечаток Хотя мы приняли все возможные меры для того, чтобы удостовериться в качестве наших текстов, ошибки все равно случаются. Если вы найдете ошибку в одной из наших книг – возможно, ошибку в тексте или в коде, – мы будем очень благодарны, если вы сообщите нам о ней. Сделав это, вы избавите других читателей от расстройств и поможете нам улучшить последующие версии данной книги. Если вы найдете какие-либо ошибки в коде, пожалуйста, сообщите о них главному редактору по адресу dmkpress@gmail.com, и мы исправим это в следующих тиражах.
Доступ онлайн
В корзину