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

Эти комплексы слоев нейронов, которые мы описали, называются нейронными сетями или ИНС (искусственными нейронными сетями).

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

Изображение выше представляет собой визуализацию нейронной сети. Синие кружки на картинке представляют каждый нейрон. Нейроны, выстроенные вертикально, являются слоями. Линии, соединяющие нейроны, — это соединения, которые играют большую роль в обработке данных.

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

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

Обзор нейронных сетей

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

Нейроны (в смысле глубокого обучения) — это объекты, которые содержат числовые значения, влияющие на то, как данные передаются и выводятся. Иногда эти нейроны также называют узлами.

Каждый нейрон и, по сути, каждый слой делает что-то свое на входе по мере продвижения данных по сети.

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

Каждое значение во входном векторе соответствует нейрону во входном слое. Эти значения в векторе называются компонентами.

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

После входного слоя данные обрабатываются нейронами в средних слоях. Эти слои между входом и выходом также обычно называют «скрытыми слоями». Они выполняют некоторые математические операции с данными и передают обработанные входные данные. Подробнее об этих операциях мы поговорим позже.

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

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

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

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

Внутренняя работа: веса, смещения, функции активации

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

Давайте разберем их.

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

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

Теперь возьмем следующий нейрон в следующей нейронной сети:

x1, x2, x3… xn — это активации нейронов во входном слое. Они также представляют различные компоненты (элементы вектора) во входном векторе. Таким образом, каждая активация в слое является компонентом вектора, представляющего слой.

В следующем слое нейрон с активацией a соединяется со всеми нейронами предыдущего слоя. Эта конфигурация известна как плотный слой (где все нейроны одного слоя присоединены к нейронам предыдущего слоя). Плотный слой — один из основных типов слоев, используемых в нейронных сетях.

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

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

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

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

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

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

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

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

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

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

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

Символ «сигма» используется для операций суммирования. Эти типы операций позволяют нам обозначать сложение выражений в последовательности. i под сигмой говорит нам об индексной переменной, которая увеличивается каждый раз, когда мы добавляем к сумме еще одно выражение. n сверху — это максимальное значение для i, после которого нам нужно прекратить увеличиваться. Для моих друзей из мира программирования просто представьте суммирование как «цикл for».

В выражении w означает вес для конкретного нейронного соединения, а x — значение из входного вектора.

Формула справа от сигмы — это выражение, которое нам нужно сложить на основе нашей индексной переменной. В этом случае для каждого i-го x в n нейронах мы умножаем его на iв. Суммируем все эти весо-вводные произведения. В конце добавляется смещение (B).

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

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

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

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

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

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

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

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

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

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

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

Обучение: оценка, настройка, повторная попытка

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

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

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

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

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

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

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

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

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

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

После этого нейронная сеть пытается предсказать вывод для другого ввода, распространяя данные.

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

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

Краткое содержание

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

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

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