Про книгу «Глубокое обучение. Погружение в мир нейронных сетей»

Некоторое время назад мне захотелось получше разобраться с тем, как устроены современные нейронные сети. До этого мои знания о них были на уровне 60-70-х годов прошлого века. Я имел какое-то представление о многослойных перцептронах, функциях активации в виде сигмоида, алгоритме обратного распространения ошибки и, кажется, все. При этом некоторые книги, которые мне довелось полистать, тяготели к двум крайностям. Либо это были чисто математические работы для математиков, либо книги в стиле «берем библиотеку X, импортируем функцию Y, все работает». Хотелось почитать книгу, после которой можно было бы более осмысленно использовать какую-нибудь библиотеку вроде TensorFlow, понимая, каким образом построить архитектуру сети. В этот момент мне попалась книга трех авторов: С. Николенко, А. Кадурина и Е. Архангельской под названием «Глубокое обучение. Погружение в мир нейронных сетей». Полистав ее, я увидел, что формулы в ней присутствуют, но кроме формул есть еще много текста и картинок со схемами, и даже код встречается. В общем, решил я почитать эту книгу.

В принципе, эта книга мое любопытство на первоначальном этапе изучения нейронок удовлетворила. Несмотря на ее не самый большой размер (чуть больше 450 страниц), читал я ее долго. Хотя текст написан прям очень живым языком с веселыми эпиграфами и большим количеством интересных не относящихся к основной теме сносок, авторы описывают достаточно серьезные с математической точки зрения вопросы и способы их решения. Из двух перечисленных ранее крайностей эта книга скорее тяготеет к теоретическому полюсу, и несмотря на наличие примеров с кодом на Python, в которых используются библиотеки TensorFlow и Keras, это не учебник по этим библиотекам — чтобы с ними разобраться, надо будет почитать что-нибудь еще. Но вот структуры нейронных сетей под разные задачи описываются очень подробно. Авторы стараются рассказать про них сначала обычным языком, а потом математически.

Надо сразу предупредить, что хотя книга, которая мне досталась, переиздана в 2024 году, основной текст ее был написан в далеких по меркам современного ИИ-строения 2016-17 годах. Но в то время нейронка от Гугла уже обыграла чемпиона мира по игре в Го, этому в книге посвящена отдельная глава. Кроме того, в книге упоминаются несколько раз работы знаменитого нейростроителя Яна ЛеКуна, который долгое время (до конца 2025 года) занимал пост Chief AI Scientist в одной запрещенной у нас компании, разрабатывающей одну запрещенную у нас соц. сеть.

Давайте теперь пройдемся по содержанию книги. Пропустим вводную главу, в которой даются основные термины, касающиеся нейронных сетей и описывается современное на момент написания книги состояние науки о нейронных сетях.

Вторая глава только подводит нас к нейронным сетям, вводя понятия, которые затем будут использоваться практически во всех главах. Начинается эта глава с теории вероятности и теоремы Байеса, которая красной нитью в том или ином виде будет проходить через всю книгу. Далее в этой же главе рассказывается о методе градиентного спуска для оптимизации и применение его для решения задачи регрессии. Здесь же рассказывается о проблеме переобучения и регуляризации. Потом авторы постепенно от задачи регрессии подбираются к задаче классификации, вводят понятие «расстояние Кульбака — Лейбнера» и после некоторых математических преобразований образуется функция сигмоида. Причем что интересно, в этой главе еще ничего не говорится о нейронных сетях непосредственно, только появляются компоненты, из которых потом они будут составляться. Эта глава полностью математическая, но при желании через формулы продраться можно; все они поясняются менее формальным человеческим языком. Здесь же вводится понятие граф вычислений и дифференцирование на нем, что является основой библиотек TensorFlow и Keras. В конце этой главы коротко на несколько страниц описываются основные концепции этих библиотек.

Разумеется, говоря про основы нейронных сетей, нельзя обойти стороной перцептроны. С них все началось, и им посвящена третья глава. В этой главе дается не только структурная схема простейшей нейронной сети, но и приводится ее строгое математическое описание в матричном виде. Затем приводятся различные функции активации и говорится, чем они отличаются с точки зрения обучения сети и когда функция лучше другой. После этого вводится понятие глубокой нейронной сети с несколькими слоями нейронов. Заканчивается глава стандартным примером распознавания рукописных цифр с использованием библиотеки TensorFlow. Данные для обучения берутся из набора данных MNIST, который прилагается к TensorFlow и используется как минимально необходимая проверка при обучении сети что-то распознавать.

В следующей, четвертой главе, описываются проблемы обучения. Это очень важная глава, в которой вводятся алгоритмы и приемы, которые затем будут использоваться во многих последующих главах. Проблем при обучении сети возникает несколько. Одна из них заключается в том, что количество весов, которые нужно подбирать с помощью алгоритма оптимизации, становится слишком много и в то же время может возникнуть проблема переобучения, когда полученная в процессе обучения аппроксимирующая функция будет слишком хорошо описывать обучающую выборку, но давать большую ошибку на новых данных. В этой главе перечисляются разные приемы, как этого избежать, включая регуляризацию и дропаут — подход, когда при обучении нейроны с некоторой вероятностью исключаются из сети во время очередной итерации обучения. В этой же главе рассматривается вопрос о том, какими значениями инициализировать веса перед процессом обучения. Можно, например, использовать предобучение, когда сначала сеть учится сама без учителя, а только затем ее начинать учить алгоритмом обучения с учителем. Затем описывается идея нормализации по мини-батчам (batch normalization), суть которого заключается в том, чтобы на каждом шаге градиентного метода при учете коррекции каждого веса использовать не одну, а сразу несколько выборок из исходных данных. После этого приводится еще несколько модификаций алгоритма градиентного спуска, которые можно использовать при обучении сети.

Затем в следующей главе авторы начинают рассказывать про сверточные нейронные сети, которые используются в первую очередь при обработке изображений.Такие сети позволяют обобщать изображения при обучении и затем при работе компенсировать искажения изображений — поворот, положение объекта, растяжение, наложение шумов и изменение цветов. Такие сети являются одними из самых глубоких, они могут насчитывать десятки и сотни уровней нейронов. Интересно, что в развитии таких сетей в 80-х годах прошлого века участвовал уже упоминавшийся выше Ян ЛеКун. В этом посте я даже не буду пытаться пересказать принципы работы такой сети, но в книге это все расписано очень подробно с поясняющими картинками, математическими формулами и кусками кода. В этой же главе рассказывается про автокодировщики — блок нейронной сети, который занимается выделением признаков из исходных данных. Это нужно, чтобы понизить размерность входных данных для обучения основной сети, чтобы ее обучать на не таких огромных исходных данных, а на признаках, которые были извлечены из этих данных и имеют меньшую размерность.

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

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

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

В девятой главе рассматриваются алгоритмы обучения нейронных сетей без учителя или обучению с подкреплением. Именно таким образом, например, нейронные сети учатся играть в игры, а затем обыгрывать чемпионов по шахматам и по игре в го (модель AlphaGo от компании DeepMind, дочерней компании Google). Про архитектуру AlphaGo в этой главе написано достаточно подробно со ссылками на официальные статьи.

А последняя глава самая хардкорная, с большим количеством формул. Авторы намеренно ее оставили тяжелой для восприятия, чтобы показать, в каком стиле пишутся современные статьи на тему машинного обучения. Главная тема этой главы — применение теоремы Байеса в нейронных сетях и нейронные сети со скрытыми переменными.

Если завершать разговор о книге «Глубокое обучение», то я бы сказал, что это очень неплохой учебник для тех, кто хочет пойти в сторону изучения и создания нейронных сетей для различных задач. Упор сделан скорее на академический подход с математическим обоснованием различных архитектур сетей. В книге огромное количество ссылок на статьи про нейронные сети, машинное обучение и все, что с этим связано. Некоторые алгоритмы упоминаются вскользь, а некоторые описываются достаточно подробно, и как правило всегда даются ссылки на то, что еще можно почитать по описываемой теме. Список литературы в конце книги включает в себя почти 600 пунктов.

Но при этом даже если пропускать математические выкладки, книга дает хорошее понимание, как строятся современные нейронные сети под различные задачи. Причем все начинается с основ и движется в сторону усложнения. Для глубокого понимания описываемых моделей эту книгу надо читать внимательно, возможно, не один раз, периодически вспоминая, что было сказано ранее. Я, например, на последних главах уже начал терять нить повествования, потому что термины вроде знакомые, помню, что про них читал в предыдущих главах, но что это такое уже выветрилось из головы. Это не та книга, которую можно читать в транспорте по дороге на работу. И хотя в книге имеются примеры создания нейронок с использованием TensorFlow и Keras, в книге это не главное, и это не учебник по этим библиотекам.

Но в целом книга достаточно интересная, мне она понравилась.

PS. Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.

Пожалуйста, оцените запись

УжасноПлохоТак себеХорошоОтлично (Количество голосов: 3, средняя оценка: 5,00)
Загрузка...

Leave a comment