День 3:

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

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

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

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

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

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

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

Функции затрат

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

Вот функциональная форма функции затрат:

Функция стоимости C, которая в нашей формулировке также известна как Среднеквадратичная ошибка (MSE), является функцией весов, w и предвзятости b. n в знаменателе этой первой дроби - это общее количество обучающих входных данных, y (x) - правильная метка обучающего изображения (напомним, что наш Набор данных MNIST представлен помеченными парами). a - это вектор выходов из сети для заданного входа. Например, если бы сеть была идеально различающей, она выдала бы следующее для входного изображения 2.

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

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

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

Градиентный спуск

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

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

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

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

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

Следующие шаги

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

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

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

Твиттер

Github

LinkedIn

Персональный сайт и блог