Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

86    Глава 2. Математические основы нейронных сетей

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

По.идее,.минимум.дифференцируемой.функции.можно.найти.аналитически..

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

Применительно.к.нейронным.сетям.это.означает.аналитический.поиск.комбинации.значений.весов,.при.которых.функция.потерь.будет.иметь.наименьшее. значение..Добиться.подобного.можно,.решив.уравнение.grad(f(W), .W) .= .0 .для.W.. Это.полиномиальное.уравнение.с.N .переменными,.где.N .—.число.весов.в.модели..

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

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

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

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

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

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

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

Выглядит.довольно.просто!.Я.только.что.описал.стохастический градиентный спуск на небольших пакетах.(mini-batch.stochastic.gradient.descent,.mini-batch. SGD)..Термин.«стохастический».отражает.тот.факт,.что.каждый.пакет.данных. выбирается.случайно.(в.науке.слово.«стохастический».считается.синонимом. слова.«случайный»)..Рисунок.2.18.иллюстрирует.происходящее.на.примере. одномерных.данных,.когда.модель.имеет.только.один.параметр.и.в.вашем.распоряжении.есть.только.один.обучающий.образец.

2.4. Механизм нейронных сетей: оптимизация на основе градиента    87

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

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

Обратите.внимание,.что.вариант.алгоритма.mini-batch.SGD.в.каждой.итерации. использует.единственный.образец.и.цель,.а.не.весь.пакет.данных..Фактически. это.истинный.SGD.(а.не.mini-batch.SGD)..Однако.можно.пойти.другим.путем. и.использовать.на.каждом.шаге.все.доступные.данные..Эта.версия.алгоритма. называется.пакетным градиентным спуском (batch gradient descent)..Каждое. изменение.в.этом.случае.будет.более.точным,.но.более.затратным..Эффективным.компромиссом.между.этими.двумя.крайностями.является.использование. пакетов.умеренного.размера.

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

88    Глава 2. Математические основы нейронных сетей

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

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

Рис. 2.20. Локальный и глобальный минимумы

Цикл
оптимизации
Постоянное значение импульса

2.4. Механизм нейронных сетей: оптимизация на основе градиента    89

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

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

past_velocity = 0. momentum = 0.1

while loss > 0.01:

w, loss, gradient = get_current_parameters()

velocity = past_velocity * momentum - learning_rate * gradient w = w + momentum * velocity - learning_rate * gradient past_velocity = velocity

update_parameter(w)

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

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

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

Цепное правило

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

90    Глава 2. Математические основы нейронных сетей

каждая.из.которых.имеет.простую.известную.производную..Например,.модель. в.листинге.2.2.можно.выразить.как.функцию,.параметризованную.переменными. W1,.b1,.W2.и.b2.(принадлежащими.первому.и.второму.слоям.Dense.соответственно). и.состоящую.из.атомарных.операций.dot,.relu,.softmax .и.+,.а.также.функции. потерь.loss,.которые.легко.дифференцируются:

loss_value = loss(y_true, softmax(dot(relu(dot(inputs, W1) + b1), W2) + b2))

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

Рассмотрим.две.функции.—.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))

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

Автоматическое дифференцирование с графами вычислений

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

2.4. Механизм нейронных сетей: оптимизация на основе градиента    91

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

А.что.насчет.программы,.которая.получает.граф. вычислений.и.автоматически.генерирует.производную.для.выражения,.которое.представляет. данный.граф?.Сделать.это.намного.проще,.если. вычисления.выражены.в.виде.явной.структуры. данных, .а .не, .скажем, .строк .символов .ASCII. в.файле..py.

Для.полноты.картины.рассмотрим.несложный. пример.графа.вычислений.(рис..2.22).—.упрощен- ную.версию.графа,.изображенного.на.рис..2.21.. Здесь.у.нас.имеется.только.один.линейный.слой,. и.все.переменные.являются.скалярными..Мы.берем.две.скалярные.переменные.w .и.b,.скалярный. вход.x,.и.применяем.к.ним.некоторые.операции,. чтобы.получить.на.выходе.y..В.заключение.мы. используем.функцию.вычисления.абсолютных. потерь:.loss_val.=.abs(y_true.-.y)..Поскольку.нам. нужно.обновить.w.и.b.так,.чтобы.минимизировать.

loss_val,.мы.должны.вычислить.grad(loss_val,.b) .

Рис. 2.21. Представление

и.grad(loss_val, .w).

в виде графа вычислений

Давайте.выберем.конкретные.значения.для.«вход-

нашей первой

двухслойной модели

ных.узлов».в.графе,.то.есть.входные.значения.

 

x,.y_true,.w .и.b,.и.распространим.их.через.все.узлы.графа.сверху.вниз,.пока. не.достигнем.loss_val..Это.—.прямой проход .(рис..2.23).

Затем.«обратим».граф:.для.каждого.ребра.в.графе,.идущего.от.A .к.B,.создадим. противоположное.ребро.от.B.к.A.и.спросим,.как.сильно.меняется.B.при.изменении.A.. Иными.словами,.что.такое.grad(B,.A)?.Подпишем.каждое.обратное.ребро.этим. значением..Данный.обратный.граф.демонстрирует.обратный проход.(рис..2.24).

92    Глава 2. Математические основы нейронных сетей

Рис. 2.22. Пример простого графа

 

Рис. 2.23. Прямой проход

вычислений

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 2.24. Обратный проход

2.4. Механизм нейронных сетей: оптимизация на основе градиента    93

Мы.имеем.следующие.результаты:

.grad(loss_val, .x2) .= .1,.потому.что.с.изменением.x2 .на.некоторую.величину. loss_val .= .abs(4 .- .x2) .изменяется.на.ту.же.величину;

.grad(x2,.x1).=.1,.потому.что.с.изменением.x1.на.некоторую.величину.x2.=.x1 + . b .= .x1 .+ .1 .изменяется.на.ту.же.величину;

.grad(x2,.b).=.1,.потому.что.с.изменением.b.на.некоторую.величину.x2.=.x1.+.b = . 6 .+ .b .изменяется.на.ту.же.величину;

.grad(x1,.w).=.2,.потому.что.с.изменением.w.на.некоторую.величину.x1.=.x.*.w = . 2 .* .w .изменяется.на.величину,.в.два.раза.большую.

Применив.цепное.правило.к.обратному.графу,.можно.получить.производную. узла.по.отношению.к.другому.узлу,.перемножив производные всех ребер на пути, соединяющем два узла..Например,.grad(loss_val, .w) .= .grad(loss_val, .x2) .* . grad(x2, .x1) .* .grad(x1, .w) .(рис..2.25).

Рис. 2.25. Путь от loss_val до w в обратном графе

Применение.цепного.правила.к.нашему.графу.дает.нам.искомое:

. grad(loss_val, .w) .= .1 .* .1 .* 2 = 2;

. grad(loss_val, .b) .= .1 .* .1 .= .1.

94    Глава 2. Математические основы нейронных сетей

ПРИМЕЧАНИЕ

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

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

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

Считайте,.что.вам.повезло!

Объект GradientTape в TensorFlow

Роль.интерфейса.для.управления.мощными.возможностями.автоматического. дифференцирования.в.TensorFlow.играет.GradientTape..Это.объект.на.Python,. который .«записывает» .выполняемые .тензорные .операции .в .форме .графа. вычислений.(иногда.называемого.tape.—.лентой)..Этот.граф.затем.можно.ис- пользовать.для.получения.градиента.любого.результата.относительно.любой. переменной.или.набора.переменных.(экземпляров.класса.tf.Variable)..Класс. tf.Variable .представляет.особый.вид.тензора,.предназначенный.для.хранения.изменяемого.состояния:.например,.веса.нейронной.сети.всегда.являются. экземплярами.tf.Variable.

import tensorflow as tf

 

 

Создать экземпляр Variable

 

 

Открыть контекст

 

 

x = tf.Variable(0.)

 

 

 

со скалярным значением 0

 

 

GradientTape

 

 

 

with tf.GradientTape() as tape:

 

 

 

 

 

 

 

 

y = 2 * x + 3

 

 

 

 

Применить некоторые тензорные операции

 

 

 

 

grad_of_y_wrt_x = tape.gradient(y, x)

 

 

 

 

к нашей переменной внутри контекста

 

 

 

 

 

 

 

 

 

Использовать экземпляр tape

 

 

 

 

 

 

 

для извлечения градиента выходного

 

 

 

 

 

 

 

значения y относительно переменной x