Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Лекция №12 30.11.pptx
Скачиваний:
38
Добавлен:
16.12.2023
Размер:
5 Мб
Скачать
☆

Дизайн И. Гайдель 2007

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

Оптимизация на основе градиента

Но что конкретно представляет собой grad(loss_value, W0)? Выше мы показали, что производную функции f(x) единственного аргумента можно интерпретировать как наклон кривой f. Аналогично grad(loss_value, W0) можно представить как тензор, описывающий направление наискорейшего подъема loss_value = f(W) в окрестностях W0 и наклон этого подъема. Каждая частная производная показывает наклон f в конкретном направлении.

Соответственно, как и в случае с функцией f(x), значение которой можно уменьшить, немного сместив x в направлении, противоположном знаку производной, значение loss_value = f(W) функции f(W) тензора также можно уменьшить, сместив W в направлении, противоположном градиенту: например,

W1 = W0 - step * grad(f(W0), W0)

где step — небольшой по величине множитель.

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

Примечание: множитель step необходим, потому что grad(loss_value, W0) лишь аппроксимирует кривизну в окрестностях W0, поэтому очень нежелательно уходить слишком далеко от W0.

Дизайн И. Гайдель 2007

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

Стохастический градиентный спуск

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

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

grad(f(W), W) = 0 для W.

Это полиномиальное уравнение с N переменными, где N — число весов в модели. Решить его для случая N = 2 или N = 3 не составляет труда, но для нейронных сетей, где число параметров редко бывает меньше нескольких тысяч, а часто достигает вообще нескольких десятков миллионов, — это практически неразрешимая задача.

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

Дизайн И. Гайдель 2007

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

Стохастический градиентный спуск

1. Извлекается пакет обучающих экземпляров x и соответствующих целей

y_true.

2.Модель обрабатывает пакет x и получает пакет предсказаний y_pred.

3.Вычисляются потери модели на пакете, дающие оценку несовпадения

между y_pred и y_true.

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

градиенту (например, W – (скорость_обучения * градиент)), и тем самым уменьшается функция потерь. Скорость обучения — скалярный множитель, модулирующий «скорость» процесса градиентного спуска.

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

Дизайн И. Гайдель 2007

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

Стохастический градиентный спуск

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

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

Стохастический градиентный спуск вниз по одномерной кривой потерь (один обучаемый параметр

Дизайн И. Гайдель 2007

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

Стохастический градиентный спуск

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

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

.

Градиентный спуск вниз по двумерной поверхности потерь (два обучаемых параметра)

Дизайн И. Гайдель 2007

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

Стохастический градиентный спуск

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

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

Локальный и глобальный минимумы

Дизайн И. Гайдель 2007

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

Стохастический градиентный спуск

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

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

Локальный и глобальный минимумы

Дизайн И. Гайдель 2007

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

Объединение производных: алгоритм обратного распространения ошибки

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

Вэтом нам поможет алгоритм обратного распространения ошибки.

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

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

Дизайн И. Гайдель 2007

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

Объединение производных: алгоритм обратного распространения ошибки

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

правилом цепочки.

Рассмотрим две функции — f и g, а также составную функцию fg такую, что fg(x) = f(g(x)):

def fg(x):

x1 = g(x)

 

y = f(x1)

return y

Согласно правилу цепочки grad(y, x) = grad(y, x1) * grad(x1, x).

Зная производные f и g, мы можем вычислить производную fg. Правило цепочки названо так потому, что при добавлении дополнительных промежуточных функций вычисления начинают выглядеть как цепочка:

def fghj(x): x1 = j(x); x2 = h(x1); x3 = g(x2); y = f(x3) return y

или

grad(y, x) = (grad(y, x3) * grad(x3, x2) * grad(x2, x1) * grad(x1, x))

Дизайн И. Гайдель 2007

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

Объединение производных: алгоритм обратного распространения ошибки

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

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

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