Глубокое обучение на Python: краткое содержание и выводы

Примечание-спойлер: обязательно приобретите себе экземпляр этой книги, если вовлечены в сферу data science, ML, DL. Хотел разбить на несколько частей, но лучше оставить один лонгрид.

Книга Франсуа Шолле «Глубокое обучение на Python» написана для людей с опытом программирования на Питоне, желающих начать знакомство с технологиями глубокого обучения. Будет интересна и полезна специалистам по обработке и анализу данных, специалистам по машинному обучению и тем, кто хочет освоить фреймворк Keras.

Книга состоит из 2 частей. Первая часть – обобщенное введение в глубокое обучения (даются определения и объясняются основные понятия).

Глава 1 формирует контекст и знакомит с основными понятиями ИИ, машинного и глубокого обучения.

Глава 2 знакомит с базовыми идеями, необходимыми для освоения глубокого обучения: тензоры, операции с тензорами, градиентный спуск и обратное распространение ошибки.

Глава 3 включает в себя все необходимое, чтобы начать работу с нейронными сетями: введение в Keras, руководство по настройке рабочей станции, примеры с подробными объяснениями.

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

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

Глава 5 рассматривает ряд практических примеров распознавания образов с особым вниманием к классификации изображений.

Глава 6 знакомит с практическими методами обработки последовательностей данных, таких как текст и временные ряды.

Глава 7 включает в себя продвинутые приемы создания современных моделей глубокого обучения.

Глава 8 объясняет генеративные, или порождающие, модели – модели глубокого обучения, способные создавать изображения и текст, причем иногда результат получается на удивление художественным.

Глава 9 посвящена закреплению всего и описанию перспектив.

1. Что такое глубокое обучение

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

А машинном обучении система обучается, а не программируется явно. МО выявляет правила решения задач обработки данных по примерам ожидаемых результатов.

Глубокое обучение – это особый раздел машинного обучения: новый подход к поиску представления данных, делающих упор на изучение последовательных слоев (или уровней) все более значимых представлений. Под глубиной в глубоком обучении не подразумевается более глубокое понимание, достигаемое этим подходом; идея заключается в многослойном представлении. Количество слоев, на которые делится модель данных, называется глубиной модели. Другими подходящими названиями для глубокого обучения могли бы служить: многослойное обучение или иерархическое обучение.

С технической точки зрения глубокое обучение – это многоступенчатый способ представления данных.

Первое успешное практическое применение нейронных сетей датируется 1989 годом, когда Ян Лекун в Bell Labs объединил ранние идеи сверточных нейронных сетей и обратного распространения ошибки и применил их для решения задачи распознавания рукописных цифр.

Отличительная черта глубокого обучения: DL позволяет автоматизировать важнейший шаг в машинном обучении – конструирование признаков.

Методика глубокого обучения обладает 2 важными характеристиками: она поэтапно, послойно конструирует все более сложные представления и совместно исследует промежуточные представления, благодаря чему каждый слой обновляется в соответствии с потребностями представления соя выше и потребностями слоя ниже.

На Kaggle главенствуют 2 подхода – метод градиентного бустинга (для структурированных данных) и глубокое обучение (для решения задач распознавания, таких как классификация изображений). Те, кто практикует первый подход, почти всегда используют библиотеку XGBoost. Кто использует глубокое обучение – библиотеку Keras. В техническом плане это означает, что вы должны владеть 2 библиотеками – XGBoost и Keras.

Глубоким обучением (и машинным обучением в целом) движут 3 технические силы:

• Оборудование;
• Наборы данных и тексты;
• Алгоритмические достижения.

Свойства глубокого обучения:

1. Простота – глубокое обучение избавляет от необходимости конструировать признаки, заменяя сложные, противоречивые и тяжелые конвейеры простыми обучаемыми моделями, которые обычно строятся с использованием 5-6 тензорных операций.
2. Масштабируемость – глубокое обучение легко поддается распараллеливанию на GPU или TPU (буква T означает Tensor). Кроме того, обучение моделей можно производить итеративно, на небольших пакетах данных, что дает возможность проводить обучение на наборах данных произвольного размера.
3. Гибкость и готовность к многократному использованию – в отличие от многих предшествовавших подходов, модели глубокого обучения могут обучаться на дополнительных данных без полного перезапуска, что делает их пригодными для непрерывного и продолжительного обучения. Кроме того, обучаемые модели можно перенацеливать и использовать многократно: например, модель, обученную классификации изображений, можно включить в конвейер обработки видео.

2. Математические основы нейронных сетей

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

Чтобы подготовить нейросеть к обучению, нужно настроить 3 параметра:
1. Функцию потерь, которая определяет, как сеть должна оценивать качество своей работы на обучающих данных и, соответственно, как корректировать ее в правильном направлении;
2. Оптимизатор – механизм, с помощью которого сеть будет обновлять себя, опираясь на наблюдаемые данные и функцию потерь;
3. Метрики для мониторинга на этапах обучения и тестирования – здесь нас будет интересовать только точность.

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

Тензор, содержащий единственное число, называется скаляром (или тензором нулевого ранга).

Одномерный массив чисел называют вектором или тензором первого ранга. Массив вектором – это матрица или двумерный тензор.

Тензор определяется 3 ключевыми атрибутами:
1. Количество осей (ранг) – например, трехмерных тензор имеет три оси, а матрица – две.
2. Форма – кортеж целый чисел, описывающих количество измерений на каждой оси тензора. Например, трехмерный тензор имеет форму (3,3,5), матрица (3,5), вектор (5,), скаляр – пустую форму ().
3. Тип данных (обычно в библиотеках Python ему дается имя dtype) – это тип данных, содержащийся в тензоре (например, float32, unit8, float64).

Примеры тензоров с часто встречающимися данными:
• Векторные данные – двумерные тензоры с формой (образцы, признаки);
• Временные ряды или последовательности – трехмерные тензоры с формой (образцы, метки_времени, признаки);
• Изображения – четырехмерные тензоры с формой (образцы, высота, ширина, цвет) или с формой (образцы, цвет, высота, ширина);
• Видео – пятимерные тензоры с формой (образцы, кадры, высота, ширина, цвет) или с формой (образцы, кадры, цвет, высота, ширина).

Операции с тензорами: поэлементные операции (relu и сложение), скалярное произведение тензоров, изменение формы тензора (например, транспонирование).

Градиент – производная операции с тензором, обобщение понятия производной на функции с многомерными входными данными, т.е. на функции, принимающие на входы тензоры.

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

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

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

3. Начало работы с нейронными сетями

Обучение нейронных сетей сосредоточено на следующих объектах:
• Слоях, которые объединяются в сеть;
• Исходных данных и соответствующих им целях;
• Функции потерь, которая определяет сигнал обратной связи, используемый для обучения;
• Оптимизаторе, определяющем, как происходит обучение.

В примерах используется фреймворк Keras – библиотека уровня модели, предоставляющая высокоуровневые строительные блоки для конструирования моделей глубокого обучения. К Keras можно подключить несколько разных низкоуровневых библиотек (Tensorflow, Theano, CNTK).

Типичный процесс использования Keras:
1. Определяются обучающие данные: входные и целевые тензоры.
2. Определяются слои сети (модель), отображающие входные данные в целевые.
3. Настраивается процесс обучения выбором функции потерь, оптимизатора и некоторых параметров для мониторинга.
4. Выполняются итерации по обучающим данным вызовом метода fit() модели.

Приводится пример: классификация отзывов к фильмам (пример бинарной классификации).

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

Стек слоев Dense с функцией активации relu способен решать широкий круг задач (включая классификацию эмоциональной окраски) и чаще всего используется именно эта комбинация.

В задаче бинарной классификации (с 2 выходными классами) в конце вашей нейросети должен находиться слой Dense с одним нейроном и функцией активации sigmoid: результатом работы должно стать скалярное значение в диапазоне между 0 и 1, представляющее собой вероятность.

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

В общем случае оптимизатор rmsprop является наиболее подходящим выбором для любого типа задач.

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

Приводится пример классификации новостных лент (пример классификации в несколько классов).

Если вы пытаетесь классифицировать образцы данных по N классам, сеть должна завершаться слоем Dense размера N.

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

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

Метки в многоклассовой классификации можно обрабатывать 2 способами:
• Кодировать метки с применением метода кодирования категорий (также известного как прямое кодирование) и использовать функцию потери categorical_crossentropy.
• Кодировать метки как целые числа и использовать функцию потерь sparse_categorical_crossentropy.

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

Приводится пример предсказания цен на дома (пример регрессии).

Регрессия выполняется с применением иных функций потерь, нежели классификация. Для регрессии часто используются функция потерь, вычисляющая среднеквадратичную ошибку (Mean Squared Error, MSE).

Аналогично, для регрессии используются иные метрики оценки. Понятие точности неприменимо для регрессии, поэтому для оценки качества часто применяется средняя абсолютная ошибка (Mean Absolute Error, MAE).

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

При небольшом объеме входных данных надежно оценить качество модели поможет метод перекрестной проверки по K блокам.

При небольшом объеме обучающих данных предпочтительнее использовать маленькие сети с небольшим количеством промежуточных слоев (обычно с 1-2), чтобы избежать серьезного переобучения.

4. Основы машинного обучения

Четыре раздела машинного обучения: контролируемое обучение (обучение с учителем), неконтролируемое обучение (обучение без учителя), самоконтролируемое обучение, обучение с подкреплением.

Оценка модели машинного обучения всегда сводится к делению доступных данных на 3 набора: тренировочный, проверочный и тестовый (контрольный). Вы обучаете модель на тренировочных данных и оцениваете с использованием проверочных. После создания окончательной версии модели вы тестируете ее с применением контрольных данных.

Три классических рецепта оценки: проверка с простым расщеплением выборки (hold-out validation), перекрестная проверка по К блокам (K-fold validation) и итерационная проверка по К блокам с перемешиванием (iterated K-fold validation with shuffling).

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

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

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

Обработка недостающих значений: заменить нулями или искусственно сгенерировать экземпляры. Зависит от задачи. Есть ряд способов.

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

Переобучение: модель начинает обучаться шаблонам, характерным для тренировочных данных, но нехарактерным для новых данных.

Способы борьбы с переобучением: увеличение объема тренировочных данных, уменьшение размера модели (емкости сети), добавление регуляризации весов (L1- и L2-регуляризация; делает распределение весовых коэффициентов более равномерным), добавление прореживания (заключается в удалении (присваиванию нуля) случайно выбираемым признакам на этапе обучения).

Обобщенный процесс решения задачи машинного обучения:

1. Определение задачи и создание набора данных.
2. Выбор меры успеха.
3. Выбор протокола оценки.
4. Предварительная подготовка данных.
5. Разработка модели, более совершенной, чем базовый случай.
6. Масштабирование по вертикали: разработка модели с переобучением.
7. Регуляризация модели и настройка гиперпараметров.

Часть II

5. Глубокое обучение в технологиях компьютерного зрения

Сверточные нейронные сети почти повсеместно используются в приложениях компьютерного зрения (распознавания образов).

Основное отличие полносвязного слоя от сверточного заключается в следующем: слои Dense изучают глобальные шаблоны в пространстве входных признаков, тогда как сверточные слои изучают локальные шаблоны: в случае с изображениями – шаблоны в небольших двумерных окнах во входных данных.

Эта ключевая характеристика наделяет сверточные нейронные сети двумя важными свойствами:
1. Шаблоны, которые они изучают, являются инвариантными в отношеии переноса;
2. Они могут изучать пространственные иерархии шаблонов.

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

Свертки определяются 2 ключевыми параметрами:
1. Размер шаблонов, извлекаемых из входных данных, — обычно 3 на 3 или 5 на 5;
2. Глубина выходной карты признаков – количество фильтров, вычисляемых сверткой.

Свертка работает методом скользящего окна.

Для уменьшения разрешения карты признаков часто используется операция выбора максимального значения из соседних (max-pooling): из входной карты признаков извлекается окно, и из него выбирается максимальное значение для каждого канала.

Набор инструментов для решения задач классификации изображений с обучением на небольших наборах данных: обучение малой модели с нуля с применением расширения данных (data augmentation); выделение признаков с использованием предварительно обученной сети; дообучение предварительно обученной сети.

Представления, изученные сверточными нейронными сетями, легко поддаются визуализации, во многом благодаря тому, что представляют собой визуальные понятия. Наиболее доступные методы визуализации:
• визуализация промежуточных выводов сверточной нейронной сети (промежуточных активаций) – помогает понять, как последовательность слоев сети преобразует свои входные данные, а также показывает смысл отдельных фильтров;
• визуализация фильтров сверточной нейронной сети – помогает точно узнать, за какой визуальный шаблон или понятие отвечает каждый фильтр;
• визуализация тепловых карт активации класса в изображении – помогает понять, какие части изображения идентифицируют принадлежность к заданному классу, что позволяет выявлять объекты на изображениях.

6. Глубокое обучение для текста и последовательностей

Двумя фундаментальными алгоритмами глубокого обучения для обработки последовательностей являются рекуррентные нейронные сети и одномерные сверточные нейросети.

Текст – одна из самых распространенных последовательностей данных. Модели глубокого обучения не могут принимать на входе простой текст – они работают только с числовыми тензорами. Векторизация текста – это процесс преобразования текста в числовые тензоры. Ее можно выполнить несколькими способами:
• Разбить текст на слова и преобразовать каждое слово в вектор;
• Разбить текст на символы и преобразовать каждый символ в вектор;
• Извлечь N-граммы из слов или символов и преобразовать каждую N-грамму в вектор. N-граммы – это перекрывающиеся группы из нескольких последовательных слов или символов.

Собирательно разные единицы, на которые можно разбить текст, называют токенами, а разбиение текста на такие токены называют токенизацией. Все процессы векторизации текста заключаются в применении некоторой схемы токенизации и последующем связывании числовых векторов с полученными токенами. Эти векторы упаковываются в тензорами последовательностей и передаются в нейронные сети. Есть несколько способов связать вектор с токеном: прямое кодирование токенов и векторное представление токенов (векторное представление слов).

Прямое кодирование (one-hot encoding): заключается в присваивании каждому слову уникального целочисленного индекса i с последующем его преобразованием в бинарный вектор размера N (размер словаря); все элементы этого вектора содержат нули, кроме i-го элемента, которому присваивается 1. Прямое кодирование можно выполнить и на уровне символов.

Прием прямого кодирования имеет разновидность – прямое хеширование признаков (one-hot hashing trick), которое можно использовать, когда словарь содержит слишком большое количество токенов, чтобы его можно было использовать явно. Вместо явного присваивания индексов каждому слову и сохранения ссылок на эти индексы в словаре можно хешировать слова в векторы фиксированного размера.

Другим популярным и мощным способом связывания вектора со словом является использование плотных векторов слов, или векторного представления слов (word embeddings). Векторные представления слов являются малоразмерными векторами вещественных чисел. В отличие от векторов, полученных прямым кодированием, векторные представления слов конструируются из данных. Векторное представление слов позволяет уместить больший объем информации в меньшее число измерений.

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

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

Существует множество разнообразных предварительно обученных векторных представлений слов, которые можно загрузить и использовать в слое Embedding (в Keras). Word2vec – одно из них. Другое популярное представление называется “глобальные векторы представления слов” (Global Vectors for Word Representation, GloVe).

Рекуррентные нейронные сети

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

Рекуррентная нейронная сеть (Recurrent neural Network, RNN) использует тот же принцип в упрощенном виде: она обрабатывает последовательность, перебирая ее элементы и сохраняя состояние, полученное при обработке предыдущих элементов. Фактически RNN – это разновидность нейронной сети, имеющей внутренний цикл. Сеть RNN сбрасывает состояние между обработкой двух разных, независимых последовательностей, поэтому одна последовательность все еще интерпретируется как единый блок данных: единственный входной пакет. Однако теперь блок данных обрабатывается не за один шаг; сеть выполняет внутренний цикл, перебирая последовательности элементов.

Рекуррентный слой в Keras – слой SimpleRNN. SimpleRNN обрабатывает пакеты последовательностей, как и все другие слои в Keras, а не единственную последовательность. Подобно всем рекуррентным слоям в Keras, SimpleRNN может действовать в 2 разных режимах: возвращать полные последовательности результатов для всех временных интервалов (трехмерный тензор с формой (размер_пакета, временные_интервалы, выходные признаки)) или только последний результат для каждой входной последовательности (двумерный тензор с формой (размер_пакета, входные_признаки)).

SimpleRNN не единственный рекуррентный слой, доступный в Keras. Кроме него имеются также слои LSTM и GRU.

Проблема затухания градиента: по мере увеличения количества слоев (в сетях прямого распространения) сеть в конечном итоге становится необучаемой. Слои LSTM и GRU создавались специально для решения этой проблемы.

Вообразите конвейерную ленту, движущуюся параллельно обрабатываемой последовательности. Информация из последовательности может в любой момент перекладываться на конвейерную ленту, переноситься к более поздним интервалам времени и сниматься с ленты, если она необходима. В этом заключается суть работы слоя LSTM (Long Short-Term Memory): он сохраняет информацию для последующего использования, тем самым предотвращая постепенное затухание старых сигналов во время обработки. Итак, назначение ячейки LSTM – позволить прошлой информации повторно внедриться в процесс обучения и оказать сопротивление проблеме затухания градиента.

LSTM на длинных последовательностях дает лучший результат, чем простое решение на основе RNN.

Три улучшенных приема ровышения качества и степени обобщения рекуррентных нейронных сетей:

1. рекуррентное прореживание – особый встроенный способ использования прореживания для борьбы с переобучением в рекуррентных слоях;
2. наложение (комбинации из нескольких) рекуррентных слоев – способ увеличения репрезентативности сети (за счет увеличения объема вычислений);
3. двунаправленные рекуррентные слои – представляют одну и ту же информацию в рекуррентной сети разными способами, повышая точность и ослабляя проблемы, связанные с забыванием.

GRU, слои управляемых рекуррентных блоков (Gated Recurrent Unit) основаны на том же принципе, что и слои LSTM, однако они представляют собой более простые структуры и, соответственно, менее затратны в вычислительном смысле (хотя могут не иметь такой же репрезентативной мощности, как LSTM). Этот компромисс между затратностью вычислений и репрезентативной мощностью можно наблюдать повсюду в области машинного обучения.

Существует множество других приемов, которые можно использовать для улучшения качества прогнозной модели:
• Изменить количество параметров в каждом рекуррентном слое в конфигурации с несколькими слоями.
• Изменить скорость обучения с помощью оптимизатора RMSprop.
• Попробовать использовать слои LSTM вместо GRU.
• Попробовать использовать больший полносвязный регрессор поверх рекуррентных слоев, то есть больший слой Dense или даже несколько слоев Dense.
• Не забудьте опробовать лучшие модели (с точки зрения средней абсолютной ошибки) на контрольном наборе.

Итак:

• Приступая к решению новой задачи, всегда желательно получить базовое решение, опираясь на метрики по вашему выбору.
• Попробуйте сначала создавать простые модели, чтобы убедиться в необходимости приложения дополнительных решений. Иногда простая модель может оказаться лучшим решением.
• Для обработки данных, в которых порядок следования имеет значение, лучше всего подходят рекуррентные сети – они с легкостью превосходят модели, которые сначала снижают размерность исходных данных.

Существует еще 2 важных понятия: рекуррентные модели с механизмом внимания (recurrent attention) и маскировка последовательностей (sequence masking).

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

В Keras одномерные сверточные сети создаются с помощью слоя Conv1D, интерфейс которого напоминает интерфейс слоя Conv2D. Он принимает на входе трехмерные тензоры с формой (образцы, время, признаки) и возвращает трехмерные тензоры с той же формой. Окно свертки – это одномерное окно на оси времени: оси с индексом 1 во входной тензоре. Одномерные сверточные сети состоят из стопки слоев Conv1D и MaxPooling1D, завершающейся слоем GlobalMaxPooling1D или Flatten.

Поскольку применение рекуррентных сетей является слишком затратным для обработки очень длинных последовательностей, а применение одномерных сверточных сетей – менее затратным, может оказаться неплохой идеей использовать одномерную сверточную сеть для предварительной обработки последовательности перед передачей в рекуррентную сеть. Она сократит последовательность и выделит полезное представление для последующей обработки рекуррентной сетью.

Итак:

• Рекуррентные сети можно использовать для регрессии (“прогнозирования будущего”), классификации, выделения аномалий и маркировки последовательностей (например, для выделения имен и дат в предложениях).
• Аналогично одномерные сверточные сети можно использовать для реализации машинного перевода (сверточные модели преобразования последовательностей в последовательности (sequence-to-sequence), такие как SliceNeta), классификации документов и проверки орфографии.
• Если глобальный порядок следования данных в последовательности имеет значение, обрабатывать такие данные предпочтительнее с применением рекуррентной сети. Это относится, например, к временным последовательностям, в которых недавнее прошлое более информативно, чем отдаленное.
• Если глобальный порядок следования данных не имеет решающего значения, для их обработки с успехом можно использовать одномерные сверточные сети, применение которых менее затратно, а полученный результат оказывается по крайней мере не хуже. Это с особенности относится к текстовым данным, где ключевой шаблон, найденный в начале предложения, будет не менее значимым, чем шаблон, найденный в конце.

7. Лучшие практики глубокого обучения продвинутого уровня

Все нейронные сети, представленные ранее, были реализованы с применением модели Sequential, которая основана на предположении, что сеть имеет только 1 вход и только 1 выход и состоит из линейного стека слоев. Однако в ряде случаев это предположение оказывается слишком жестким. Некоторые сети требуют нескольких независимых входов, другие – несколько выходов, а третьи имеют внутренние ветви, соединяющие слом, что делает их похожими на графы, а не на линейные стеки слоев. Некоторые задачи, например, требуют мультимодальных входов: они объединяют данные, поступающие из разных источников, обрабатывая каждый вид данных с использованием разных типов нейронных слоев.

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

Эти 3 важные разновидности моделей – модели с несколькими входами, модели с несколькими выходами и графоподобные модели – невозможно реализовать с использованием только класса Sequential моделей из фреймворка Keras. Но существует более универсальный и гибкий способ использования Keras – функциональный API. Функциональный API позволяет напрямую манипулировать тензорами и использовать уровни как функции, которые принимают и возвращают тензоры. Пример:

from keras import Input, layers
input_tensor = Input(shape=(32,)) – тензор
dense = layers.Dense(32, activation=’relu’) – слой – это функция
output_tensor = dense(input_tensor) – вызываемый слой может принимать и возвращать тензор

Функциональный API можно использовать для создания моделей с несколькими входами. Обычно такие модели в какой-то момент объединяют свои входные ветви, используя слой, способный объединить несколько тензоров: сложением, слиянием или как-то иначе. Часто для этого используются операции слияния, реализованные в Keras, такие как keras.layers.add, keras.layers.concatenate и т.д.

Функциональный API также можно использовать для создания моделей с несколькими выходами (или головами). Простейшим примером может служить сеть, пытающаяся одновременно предсказать разные свойства данных. Важно отметить, что для обучения такой модели необходима возможность задавать разные функции потерь для разных выходов. Однако из-за того, что градиентный спуск требует минимизации скаляра, эти функции потерь должны объединяться в единственное значение. Простейший способ объединения потерь – их суммирование. В Keras для этого можно передать функции compile список или словарь с разными объектами для разных выходов; в результате значения потерь будут суммироваться в общее значение потери, которое будет минимизироваться в ходе обучения.

Фреймворк Keras позволяет создавать нейронные сети, организованные как произвольные ориентированные ациклические графы слоев. Такие графы не имеют замкнутых маршрутов. Тензор x не может служить входом в один их слоев, генерирующих x. Единственными допустимыми циклами обработки (то есть рекуррентными связями) являются циклы внутри рекуррентных слоев. Существует несколько типичных компонентов нейронных сетей, реализуемых как графы. Например, модули Inception и остаточные связи.

Еще одной важной особенностью функционального API является возможность повторного использования эзземпляра слоев. Когда вы дважды вызываете экземпляр слоя, вместо создания нового слоя в каждом вызове повторно будут использоваться те же самые веса. Это позволяет создавать модели с общими ветвями, когда имеется несколько ветвей, совместно использующих общие знания и выполняющих одинаовые операции. Пример: сиамская модель LSTM (или общий LSTM). Экземпляр слоя можно использовать неоднократно.

Функциональный API позволяет использовать модели как слои – фактически о моделях можно думать как о “больших слоях”. Это верно для обоих классов – Sequential и Model. Другими словами, можно выхвать модель, передав ей входной тензор, и получить выходной тензор. Вызывая экземпляр модели, вы повторно используете ее веса – в точности как при вызове экземпляра слоя. Пример практического применения: модель зрения, которая в качестве входа использует сдвоенную камеру.

Применение обратных вызовов для воздействия на модель в ходе обучения

Гораздо лучше было бы остановить обучение, как только выяснится, что оценка потерь на проверочном наборе перестала улучшаться. Это можно реализовать с использованием механизма обратных вызовов в Keras. Обратный вызов – это объект (экземпляр класса, реализующего конкретные методы), который передается в модель через вызов fit и который будет вызываться моделью в разные моменты в процессе обучения.

Примеры использования обратных вызовов:
• Фиксация состояния модели в контрольных точках – сохранение текущих весов модели в разные моменты в ходе обучения;
• Ранняя остановка – прерывание обучения, когда оценка потерь на проверочных данных перестает улучшаться;
• Динамическая корректировка значений некоторых параметров в процессе обучения, например, шага обучения оптимизатора;
• Журналирование оценок для обучающего и проверочного набора данных в ходе обучения или визуализации представлений, получаемых моделью, по мере их обновления.

Модуль keras.callbacks включает в себя ряд встроенных обратных вызовов. Если в ходе обучения потребуется выполнить какие-то особые действия, не предусмотренные ни одним из встроенных обратных вызовов, можно написать свой обратный вызов (путем наследования класса keras.callbacks.Callback).

TensorBoard – фреймворк визуализации TensorFlow, помогающий визуально наблюдать за происходящим внутри модели в процессе обучения. Он будет работать в Keras только в том случае, если в качестве низкоуровневого механизма обработки тензоров используется TensorFlow.

Некоторые возможности TensorBoard:
• Визуальный мониторинг метрик в ходе обучения;
• Визуализация архитектуры модели;
• Вывод гистограмм активаций и градиентов;
• Исследование векторных представлений в трехмерном пространстве.

Некоторые приемы создания современных моделей глубокого обучения

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

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

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

8. Генеративное глубокое обучение

Генерирование текста с помощью LSTM

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

В случае с текстом такая модель называется языковой моделью; она может основана на словах или символах.

Выбор следующего токена требует баланса между мнением модели и случайностью.

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

DeepDream

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

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

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

Нейронная передача стиля

Передача стиля заключается в создании нового изображения, которое сохраняет содержимое целевого изображения и оформлено в стиле изображения-образца.

Содержимое может сохраняться активациями верхнего слоя сверточной сети.

Стиль может сохраняться внутренними корреляциями активаций разных слоев.

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

Начав с этой простой идеи, можно реализовать множество разнообразных вариантов.

Генерирование изображений с вариационными автокодировщиками

Генерирование изображений с применением глубокого обучения происходит за счет выделения скрытых пространств, несущих статистическую информацию о наборе изображений. Выбирая точки из скрытого пространства и декодируя их, можно видеть прежде не встречавшиеся изображения. Существует 2 основных инструмента для решения этой задачи: вариационные автокодировщики (VAE) и генеративно-состязательные сети (GAN).

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

Генеративно-состязательные сети позволяют генерировать релистичные однокадровые изображения, однако они не порождают скрытых пространств, непрерывных и с четкой структурой.

Для экспериментов с генерацией изображений автор рекомендует использовать набор Largescale Celeb Attributes (CelebA).

Введение в генеративно-состязательные сети

Генеративно-состязательная сеть состоит из 2 сетей: генератора и дискриминатора. Дискриминатор обучается отличать изображения, созданные генератором, от настоящих, имеющихся в обучающем наборе, а генератор обучается обманывать дискриминатор. Примечательно, что генератор вообще не видит изображений из обучающего набора; вся информация, которую он имеет, поступает из дискриминатора.

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

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

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

Data Scientist # 1

Машинное обучение, большие данные, наука о данных, анализ данных, цифровой маркетинг, искусственный интеллект, нейронные сети, глубокое обучение, data science, data scientist, machine learning, artificial intelligence, big data, deep learning

Данные — новый актив!

Эффективно управлять можно только тем, что можно измерить.
Copyright © 2019 Data Scientist. Все права защищены.