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

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

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

Глубинное обучение против машинного обучения

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

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

Для многих задач находится классический алгоритм машинного обучения, который дает «достаточно хорошую» модель. Но для ряда задач классические алгоритмы машинного обучения работают не очень хорошо.

Приложения для глубинного обучения

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

Осенью 2016 года качество перевода Google Translate для англо-французских, англо-китайских и англо-японских языковых пар внезапно резко улучшилось: бессвязные фразы подстрочника заменили предложения, близких по качеству к профессиональному переводчику. Что произошло? Команды Google Brain и Google Translate обновили систему: от использования прежних алгоритмов статистического машинного перевода на основе фраз (один из видов классического машинного обучения) перешли к использованию глубокой нейронной сети, обученной с использованием библиотеки Google TensorFlow.

Это был непростой проект. Большой группе исследователей, включая значительное число обладателей ученых степеней, потребовались месяцы работы над моделями и тысячи недель вычислений на GPU для их обучения. Это даже подтолкнуло Google к созданию процессорной архитектуры нового типа, «тензорного» процессора Tensor Processing Unit (TPU), на которой бы работали нейронные сети масштаба, соразмерного Google Translate.

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

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

Прорывом в области нейронных сетей для зрения стала созданная Яном Лекуном в 1998 году LeNet-5, семиуровневая сверточная нейронная сеть (CNN) для распознавания рукописных цифр, на изображениях размером 32x32 (в пикселах). Для анализа изображений с более высоким разрешением количество нейронов и слоев в LeNet-5 нужно увеличить.

Сегодня лучшие модели глубокой классификации изображений способны распознавать различные цветные изображения в качестве HD. В дополнение к «чистым» глубоким нейронным сетям (DNNs) иногда используют гибридные модели зрения, которые сочетают глубинное обучение с классическими алгоритмами машинного обучения, которые выполняют конкретные подзадачи.

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

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

В книге «Deep Learning» Яна Гудфеллоу, Иошуа Бенджио и Аарона Курвилля, написанной в 2016 году, приведены примеры того, как глубинное обучение успешно используется для прогнозирования взаимодействия молекул, чтобы помочь фармацевтическим компаниям разрабатывать новые лекарства, искать субатомные частицы и автоматически анализировать изображения микроскопа, используемые для построения трехмерной карты человеческого мозга.

Нейронные сети

Идеи «искусственных» нейронных сетей восходят к 1940-м годам. Базовая концепция заключается в том, что сеть искусственных нейронов, построенных из взаимосвязанных пороговых переключателей, может научиться распознавать паттерны так же, как это делает мозг и нервная система животных, в частности, сетчатка глаза.

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

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

В 1940-х и 1950-х годах искусственные нейроны использовали функцию ступенчатой активации и назывались перцептронами. Про современные нейронные сети можно сказать, что они используют перцептроны, но на самом деле они используют гладкие функции активации, такие как логистическая функция, или сигмоида, гиперболический тангенс и линейный выпрямитель (ReLU).

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

Топологии нейронных сетей

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

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

Обучение

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

backprop использует градиент функции ошибки (или стоимости) относительно весов и смещений модели, чтобы обнаружить правильное направление для минимизации ошибки. Применением поправок управляют алгоритм оптимизации и переменная скорости обучения, которая обычно должна быть небольшой, чтобы гарантировать сходимость, а функция ReLU не вызывала «отмирание» нейронов.

Оптимизаторы

Оптимизаторы для нейронных сетей используют некоторую форму алгоритма градиентного спуска, чтобы управлять обратным распространением; при этом часто задействуется механизм, который помогает избежать застревания в локальных минимумах, таких как оптимизация случайно выбранных минипартий (стохастический градиентный спуск), и применения поправок импульса к градиенту. Некоторые алгоритмы оптимизации также адаптируют скорость обучения параметров модели, глядя историю градиентов (AdaGrad, RMSProp и Adam).

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

Реальные глубокие нейронные сети

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

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

Алгоритмы глубинного обучения

Как говорилось выше, «наиболее глубинное» обучение осуществляется с помощью глубоких нейронных сетей. Сверточные нейронные сети (CNN) часто используются для компьютерного зрения. Рекуррентные нейронные сети (RNN) часто используются в задачах естественного языка и для обработки других последовательностей, как и сети с долгой краткосрочной памятью (Long short-term memory; LSTM) и нейронные сети с механизмом внимания. Случайные леса (они же — леса случайных решений), нейронными сетями не являющиеся, полезны для целого ряда задач классификации и регрессии.

Сверточные нейронные сети

Сверточные нейронные сети обычно используют сверточные слои, слои объединения, ReLU слои, полностью связанные и потерянные слои для имитации зрительной коры. Сверточный слой в основном считает интегралы многих небольших перекрывающихся областей. Слой объединения выполняет какую-то форму нелинейной понижающей дискретизации. Слои ReLU применяют функцию активации f(x) = max (0,x). В полностью связанном слое нейроны имеют связи со всеми активациями в предыдущем слое. Уровень потерь вычисляет, как сетевое обучение исправляет отклонение между предсказанными и истинными метками, используя функцию Softmax или функцию потерь перекрестной энтропии для классификации или евклидову функцию потерь для регрессии.

RNN, LSTM и нейронные сети с механизмом внимания

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

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

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

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

Случайные леса

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

Фреймворки для глубинного обучения

Писать программы глубинного обучения можно и с нуля, но гораздо эффективнее использовать фреймворки глубинного обучения, особенно учитывая, что они оптимизированы для использования с графическими процессорами и другими ускорителями. Вероятно лучшим фреймворком является Google TensorFlow. Предпочтительный высокоуровневый API для TensorFlow — Keras; его также можно использовать с другими серверными фреймворками.

PyTorch, созданный в Facebook при участии ряда других организаций, являющийся хорошей альтернативой TensorFlow, выделяется поддержкой динамических нейронных сетей, в которых топология сети может меняться от эпохи к эпохе. Fastai – это высокоуровневый сторонний API, который использует PyTorch в качестве серверного приложения.

Amazon MXNet является еще одной хорошей альтернативой TensorFlow, с претензией на лучшую масштабируемость. Gluon является предпочтительным высокоуровневым императивным API для MXNet.

Chainer разработки IBM и Intel послужил в некотором роде источником вдохновения для PyTorch, учитывая, что он определяет нейронную сеть путем запуска и поддерживает динамические нейронные сети.

Все упомянутые фреймворки в основном – для Python, а Deeplearning4j (первоначально созданный Sky Mind, а теперь являющийся проектом Apache) в первую очередь – для Java и Scala. DL4J совместим с Apache Spark и Hadoop.

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

Nvidia TensorRT – еще одна среда исполнения для моделей искусственного интеллекта, в частности, для использования графических процессоров Nvidia. ONNX может использовать TensorRT в качестве плагина.

Трансферное обучение

Трансферное обучение (transfer learning) – это процесс «приспособления» модели, обученной на одном наборе данных, к другом набору данных. Трансферное обучение намного быстрее обучения «с нуля» и требует гораздо меньше данных.

Google Cloud AutoML реализует глубинное трансферное обучения для задач компьютерного зрения, компьютерного перевода и обработки естественного языка. Платформа машинного обучения Microsoft Azure предлагает аналогичные сервисы.

Распределенная обработка для систем глубинного обучения

В TensorFlow имеет собственный встроенный способ координации фабрики серверов, задействованных в распределенном обучении, более общим подходом является использование Open MPI. Horovod, созданная в Uber распределенная обучающая среда для TensorFlow, Keras и PyTorch, использует Open MPI, а также Nvidia NCCL. Эффективность масштабирования, обеспечиваемого Horovod, достигает в зависимости от модели, 90%.

Информационные ресурсы по глубинному обучению

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