Мягкое введение в некоторые концепции машинного обучения и глубокого обучения.

Вступление

Глубокое обучение - очень модный термин. Основная причина заключается в том, что соответствующие методы недавно продемонстрировали невероятную способность давать действительно хорошие, если не современные, результаты при решении различного рода проблем, от распознавания изображений до перевода текста. Стоя перед этой растущей технологией, которая стала возможной благодаря увеличению объема данных и доступной мощности компьютеров, непосвященным людям иногда может быть трудно действительно знать, «что происходит за кулисами». Что такое глубокое обучение? Как работают нейронные сети?

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

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

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

Контур

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

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

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

Базовое машинное обучение

Что такое машинное обучение?

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

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

Простая линейная регрессия

Линейная регрессия - один из самых простых примеров алгоритмов машинного обучения, которые мы только можем придумать. Давайте посмотрим, что это полностью соответствует описанию, которое мы дали выше. Предположим, у вас есть набор данных о домах по двум атрибутам: размеру (обозначается s) и цене (обозначается p ). Теперь предположим, что вам нужна программа, которая принимает в качестве аргумента размер дома и возвращает цену, которая является оценочной ценой такого дома. Первый вариант - явно запрограммировать правило. В этом случае это означает, что мы должны явно определить функцию f так, чтобы p = f (s). Другими словами, мы должны явно указать цену как четко определенную функцию от размера. Однако мы не могли иметь ни малейшего представления о том, что это за функция, а может быть, имели лишь смутное представление о ней. Если это так, мы можем полагаться на данные, чтобы построить наше правило в стиле машинного обучения. Затем мы сначала определяем набор (семейство) правил: в этом примере мы предполагаем, что линейное правило выражает связь между ценой и размером. Итак, теперь f имеет форму f (s) = as + b с a и b неуказанные параметры (степени свободы), которые необходимо определить на основе имеющихся данных и в соответствии с заданными стратегия. Обычно для линейной регрессии эта стратегия очень проста и состоит в выборе a и b, чтобы минимизировать сумма квадратов ошибок между истинными и прогнозируемыми выходами. Это можно сделать аналитически в случае линейной регрессии (мы можем найти решение в замкнутой форме). Но мы увидим, что не всегда все бывает так просто. Однако мы можем заметить, что в этом примере у нас есть три упомянутые части: (параметризованная) модель, некоторые данные и стратегия оптимизации (способ найти оптимальные параметры). Мы снова встретимся с этим триптихом (модель / данные / оптимизация) в более продвинутых методах, обсуждаемых в этой статье.

Непараметризированные модели

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

Продвинутое машинное обучение

Проблемы часто усложняются

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

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

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

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

Оптимизация

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

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

Тогда задача оптимизации может быть неквадратичной, но выпуклой. Проблемы неквадратичной оптимизации часто невозможно решить аналитическим путем, и в большинстве случаев требуется итерационный подход. Основная идея этих итеративных подходов состоит в том, чтобы начать с заданной точки пространства - пространства, описываемого нашей моделью, в котором точка является экземпляром модели, например, с определенными параметрами, - и попытаться улучшить эту итерацию решения. путем итерационного выбора на каждой итерации, чтобы сделать небольшой шаг в наилучшем возможном направлении в нашем пространстве (в зависимости от того, как мы определяем понятие «лучший»). Эти итерационные подходы могут принимать разные формы, такие как различные виды вариантов градиентных спусков, алгоритмы EM и другие, но в конечном итоге основная идея остается той же: мы не можем найти прямое решение, поэтому мы начинаем с заданной точки и продвигаемся постепенно. step, делая на каждой итерации небольшой шаг в направлении, улучшающем наше текущее решение. См. Следующий рисунок для иллюстрации градиентного спуска. Для таких итерационных методов выпуклость пространства является очень важным свойством, которое гарантирует, что мы достигнем глобального оптимума независимо от выбранной отправной точки (экземпляр модели, которую мы получим, будет наилучшим возможным по отношению к определенной задаче оптимизации. ).

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

Будьте осторожны с переоснащением

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

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

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

Интерпретируемость модели

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

Под «интерпретируемостью» модели мы понимаем способность после оптимизации модели понять, почему некоторые входные данные дают некоторые выходные данные. Давайте возьмем пример линейной регрессии из предыдущего раздела (p = f (s) = as + b, с s размером с дом и p его ценой). После того, как мы оптимизировали параметры a и b на основе данных, мы можем полностью интерпретировать то, что мы получили. В самом деле, мы можем сказать, чтобы угадать цену нового дома, что у нас есть базовая цена в b денежных единиц, к которой мы добавляем a денежных единиц за каждую единицу размера дома. Здесь снова полная интерпретируемость линейной регрессии проистекает из ее чрезмерной простоты и некоторых ограничений с точки зрения моделирования. Напротив, некоторые модели очень мощные, но гораздо менее интерпретируемые (если таковые имеются). Однако не обязательно существует прямая связь между характеристиками модели и ее интерпретируемостью. Например, известно, что SVM хорошо справляются со многими проблемами, и их интерпретируемость также может быть довольно хорошей.

Важность интерпретируемости

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

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

Глубокое обучение

О чем мы говорим?

Быстрый поиск в Google дает нам следующее определение «глубокого обучения»: «совокупность методов глубокого обучения является частью более широкого семейства методов машинного обучения, направленных на моделирование данных с высоким уровнем абстракции». Здесь мы должны понимать, что глубокое обучение заключается в создании очень сложных моделей, в обмене на простоту интерпретации и предсказательную силу.

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

Рассмотрим, например, проблему регрессии или классификации. В обоих случаях у нас есть некоторые входные данные, обозначенные (i1, i2,…, in), и мы хотим найти функцию этих входных данных, которая довольно хорошо объясняет наблюдаемые соответствующие выходы, обозначаемые (o1, o2,…, om). Другими словами, как и в случае нашего примера линейной регрессии, мы ищем функцию f такую, что (o1, o2,…, om) хорошо аппроксимируется как f (i1, i2,…, in). Идея моделирования нейронных сетей состоит в том, чтобы забыть об идее создания слегка параметризованной функции, в основном «сформированной» человеком и настраиваемой машиной (с помощью этих нескольких параметров, как в нашем примере линейной регрессии), а вместо этого настроить сильно параметризованную очень гибкая функция, которая априори не имеет большого смысла для человека, но будет удобно формироваться на этапе обучения. Попробуем проиллюстрировать это на простой нейронной сети.

Базовая прямая нейронная сеть

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

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

Итак, мы хотим изучить функцию f так, чтобы f (i1, i2) был хорошей оценкой o1. Тогда мы могли бы предложить следующую первую модель:

где w11 и w12 - это просто веса / коэффициенты (пока не обращайте внимания на индексы). Прежде чем идти дальше, мы должны заметить, что здесь нет постоянного члена в модели. Однако мы могли бы ввести такой термин, установив f1 (i1, i2) = w11 * i1 + w12 * i2 + c. Чтобы немного сократить некоторые обозначения, мы не будем писать такие постоянные термины ниже, но читатель должен иметь в виду, что они всегда могут быть добавлены (и чаще всего это делают).
Такая модель представляет собой линейную регрессию модель для нескольких входов (также называемая полилинейной регрессией) и может быть представлена ​​следующим образом.

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

где a (.) - функция, называемая «функцией активации», которая является нелинейной. Затем мы можем заметить, что w11 * i1 + w12 * i2 по-прежнему линейно, но поскольку мы заставляем это значение проходить через нелинейную функцию, общий результат будет отрицательным. более длинная линейная, и, таким образом, эта модель ближе к нашему предположению, чем предыдущая модель. Эту модель можно представить следующим образом.

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

Однако, даже если она лучше, чем полилинейная модель, она все же слишком проста и не может справиться с предполагаемой базовой сложностью взаимосвязи между входами и выходами. Мы можем сделать еще один шаг и обогатить модель следующим образом. Сначала мы могли бы считать, что величина a (w11 * i1 + w12 * i2) больше не является окончательным результатом, а вместо этого является новой промежуточной функцией нашей функции, называемой l1. Во-вторых, мы могли бы подумать, что мы создаем несколько (3 в нашем примере) таких функций одинаковым образом, но, возможно, с разным весом и разными функциями активации: l1 = a11 (w11 * i1 + w12 * i2) , l2 = a12 (w21 * i1 + w22 * i2) и l3 = a13 (w31 * i1 + w32 * i2), где a - это просто функции активации, а w - это веса. Наконец, мы можем считать, что наш окончательный результат построен на основе этих промежуточных функций с тем же «шаблоном»: a2 (v1 * l1 + v2 * l2 + v3 * l3) . Если мы объединим все части, мы получим:

где мы должны в основном помнить, что a - это нелинейные функции активации, а w и v - веса. На следующем рисунке мы даем сетевое графическое представление этой модели так же, как мы делали для предыдущих.

Эта последняя модель представляет собой базовую нейронную сеть прямого распространения с 2 записями (i1 и i2), 1 скрытым слоем с 3 скрытых нейрона (выходы которых равны l1, l2 и l3 ) и 1 финальный результат. Мы могли бы решить добавить еще один промежуточный «скрытый» слой между l и окончательным результатом точно так же, как мы просто добавляем эти l между входом и выходом: тогда у нас была бы нейронная сеть с двумя скрытыми слоями. Или мы могли бы выбрать один скрытый слой, но чтобы в нем было больше нейронов (например, 5 вместо 3). Итак, у нас есть разные способы обогатить / усложнить модель, что приведет к увеличению количества весов. Количество скрытых слоев, количество нейронов на слои, такие как значения весов и характер функций активации, определяют нейронную сеть и, таким образом, «шаблон» функции, описываемой этой сетью.

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

Разные потребности, разные архитектуры

Как мы видели в предыдущем абзаце, нейронные сети - это шаблоны функций, которые можно настраивать с помощью своих параметров, которые необходимо оптимизировать для соответствия данным. Но в зависимости от характера проблемы и данных для моделирования мы, возможно, захотим использовать разные типы шаблонов. Эти разные типы шаблонов называются разными «архитектурами». Например, рассмотренная выше базовая прямая нейронная сеть (также называемая многослойным перцептроном) является первой базовой архитектурой. Однако существует несколько других. Среди хорошо известных архитектур мы можем упомянуть рекуррентные нейронные сети (RNN), которые представляют собой рекуррентную функцию некоторых последовательных данных, где выход в момент времени t зависит от входа в на этот раз t и на предыдущем выходе в момент времени t-1 - и сверточные нейронные сети (CNN) - которые представляют собой операцию математической свертки на входах и демонстрируют хорошие свойства, например, в некоторых задачах на основе изображений, таких как распознавание изображений.
При всех текущих исследованиях всегда есть больше архитектур, которые воображаются в зависимости от проблемы для моделирования . Очевидно, что мы не можем описать все эти виды архитектур (и это было бы полностью вне рамок данной статьи), но самое важное, о чем здесь следует помнить, - это то, что архитектуру нейронной сети всегда следует рассматривать как пространство. возможных функций, в которых оптимизация параметров сети эквивалентна поиску лучшей функции в этом пространстве (на основе критерия оптимальности). Итак, конечно, важно выбрать правильную архитектуру, потому что, если ее не выбрать правильно, мы определим пространство, в котором даже лучшая функция может быть далека от того, что мы ожидаем в результате.

Почему это хорошая идея?

Среди причин, которые делают нейронные сети такими эффективными и популярными, можно выделить следующие три. Во-первых, постоянно увеличивающийся объем данных, доступных во многих областях, делает разумным использование таких сильно параметризованных моделей. Обратите внимание, что параметры модели также называются «степенями свободы» (этот термин не относится к области машинного обучения и выражает понятие «регулируемых значений» или «рычагов действия» в модели) и что множество степеней свободы свобода в модели требует большого количества данных для настройки / калибровки этой модели. Точно так же, как вы не можете позволить в линейной системе уравнений иметь больше неизвестных, чем уравнения, вам нужно больше данных, чем параметров в вашей сети (на самом деле, чем больше, тем лучше). Во-вторых, вычислительная мощность, которая всегда больше, в сочетании с умными методами оптимизации позволяет обучать очень крупномасштабные модели с таким большим количеством параметров. В больших моделях могут быть миллионы параметров для оптимизации, и для выполнения процесса оптимизации за разумное время требуется минимум вычислительной мощности. Наконец, как мы только что сказали, процесс оптимизации - сложная задача, и, без сомнения, простые, но умные методы оптимизации, такие как хорошо известное «обратное распространение ошибки», которое идеально подходит для основы компьютерной оптимизации, являются одними из них. основные объяснения успеха нейронных сетей.

Нейронные сети сложно оптимизировать

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

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

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

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

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

При этом мы в некотором смысле приписываем небольшой «+ 𝜶_ w» (увеличение) или « - 𝜶_ w ”(уменьшение) для каждого веса w, где 𝜶_ w положительный и связан с тем, насколько увеличение (или уменьшение) этого веса уменьшит ошибку (см. следующий рисунок). Предыдущие величины, очевидно, являются производными по каждому весу с точностью до знака (производные указывают, как увеличить ошибку).

Как только это будет сделано для всех весов, мы можем применить шаг градиентного спуска, и все веса, помеченные как «+ 𝜶_ w», будут обновлены таким образом, чтобы ww + 𝜶_ w * step_size, тогда как все веса помечены как « -𝜶_ w ”обновляются таким образом, что ww -𝜶_ w * step_size (см. следующий рисунок). Обратите внимание, что step_size определяет, насколько веса изменяются на каждой итерации, и могут изменяться за время обучения. Как только шаг будет достигнут, мы можем перезапустить новую итерацию до тех пор, пока веса больше не будут улучшены.

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

Обратное распространение как «слой за слоем» градиентного спуска

Мы только что описали процесс градиентного спуска по нейронной сети. Однако для того, чтобы иметь возможность делать эти «маленькие движения» весов, нам все еще необходимо вычислить производные члена ошибки по каждому из весов в сети (нам нужно знать для каждого веса, если мы должны увеличьте или немного уменьшите). Требуется вычислить производную функции, представленной сетью, по каждому из весов. Это действительно большая задача, если только мы не воспользуемся многоуровневой структурой сети, чтобы помочь нам. В самом деле, как мы упоминали ранее, сети часто строятся из слоев, а это означает, что мы сталкиваемся с (в высшей степени) композиционными функциями. Алгоритм обратного распространения заключается в использовании этого особого вида многоуровневой структуры, чтобы сделать вычисление производных более эффективным. Для этого мы полагаемся на тот факт, что производные по весам на данном уровне могут быть выражены как функция двух вещей: во-первых, производных по весам следующего уровня и, во-вторых, значения, которое возьмите нейрон во время прямого прохода. Это конкретное выражение производных в сетях напрямую происходит от математической производной композиционной функции (f (g (x)) '= f' (g (x)) * g '(x) ). Затем эффективное вычисление производной выполняется следующим образом. Мы начинаем с вычисления прямого прохода (мы подаем входные данные и выполняем вычисления до выхода). Затем мы возвращаемся в противоположном направлении и сначала вычисляем производные ошибки по весам последнего слоя. На основе этих вычислений мы можем вычислить производные по отношению к предыдущему уровню и так далее, возвращаясь к первому уровню. Другими словами, мы «распространяем» вычисления производных в сети. Этот алгоритмический метод делает процесс оптимизации гораздо более управляемым.

Локальные минимумы и риск переобучения

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

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

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

Выводы

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

Основные выводы:

  • Машинное обучение - это область обучения, которая дает компьютерам возможность учиться без явного программирования.
  • Машинное обучение опирается на модель / данные / оптимизацию триптиха.
  • При настройке более сложных моделей в основном нужно позаботиться о двух моментах: как оптимизировать и как интерпретировать?
  • Грубо говоря, при использовании глубокого обучения и нейронных сетей мы отказываемся от интерпретируемости в пользу большей предсказательной силы, создавая очень сложные модели.
  • Успех, достигнутый нейронными сетями, в основном связан с постоянно растущим объемом доступных данных и вычислительной мощностью, а также с очень эффективной идеей обратного распространения, которая делает процесс оптимизации гораздо более управляемым.

В заключение скажем, что нейронные сети - очень мощные инструменты. Они продемонстрировали свои способности отлично справляться с множеством современных задач. Однако это не волшебные инструменты, способные решить любые проблемы. По-настоящему умная часть работы по-прежнему находится в руках людей - они должны знать, где и как правильно использовать эти модели. Если было бы оскорбительно сводить нейронные сети к «подгонке кривой» из-за всех умных идей, которые многие люди вводили в этой области для решения все более сложных проблем, было бы также неточно описывать их как «волшебные инструменты» из-за очевидный ограниченный круг проблем, охватываемых на данный момент этими моделями. В качестве правильного баланса давайте наслаждаться огромным (огромным!) Прогрессом, достигнутым этими инструментами во многих областях, помня об их текущих ограничениях ... и не боясь ужасных роботов-убийц. Теперь.

Спасибо за прочтение!

Благодарим Baptiste Rocca и Benjamin Blanc за чтение проекта и предложения полезных исправлений и улучшений.

Любые отзывы об этой статье приветствуются!

Другие статьи, написанные с Батистом Рокка: