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

МТУСИ

Интеллектуальные системы

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

Лекция 12

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

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

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

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

output = relu(dot(input, W) + b) ,

где relu = max(x,0);

dot – скалярное произведение (тензорное произведение) W и b — тензоры, являющиеся атрибутами слоя.

Тензоры W и b называются весами или обучаемыми параметрами слоя. Эти веса содержат информацию, извлеченную сетью из обучающих данных.

Первоначально весовые матрицы заполняются небольшими случайными значениями (данный шаг называется случайной инициализацией). Конечно, бессмысленно было бы ожидать, что relu(dot(input, W) + b) вернет хоть сколько- нибудь полезное представление для случайных W и b. Начальные представления не несут никакого смысла, но они служат отправной точкой. Далее на основе сигнала обратной связи происходит постепенная корректировка весов, которая также называется обучением. Она и составляет суть машинного обучения.

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

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

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

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

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

y_true.

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

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

между y_pred и y_true.

4.Веса модели корректируются так, чтобы немного уменьшить потери на этом пакете.

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

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

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

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

Если разобрать представленные выше процесс на мелкие шаги, он выглядит очень просто.

Шаг 1 несложный — это просто операция ввода/вывода.

Шаги 2 и 3 — всего лишь применение нескольких операций с тензорами.

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

Одно из простейших решений — заморозить все веса, кроме одного, и попробовать применить разные его значения. Допустим, первоначально вес имел значение 0,3. После прямого прохода потери сети составили 0,5. Теперь представьте, что после увеличения значения веса до 0,35 и повторения прямого прохода вы получили увеличение оценки потерь до 0,6, а после уменьшения веса до 0,25 — падение оценки потерь до 0,4. В данном случае похоже, что корректировка коэффициента на величину –0,05 вносит свой вклад в уменьшение потерь.

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

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

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

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

Градиентный спуск — метод оптимизации, широко применяемый в современных нейронных сетях.

Суть его заключается в следующем: все функции, используемые в наших моделях, плавно и непрерывно преобразуют свои входные данные. Например, небольшое изменение y в операции z = x + y приведет к небольшому изменению z — и, зная направление изменения y, можно определить направление изменения z.

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

Вычисленный градиент можно использовать для модификации весов (всех сразу в

одном цикле, а не по одному) в направлении, уменьшающем потери.

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

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

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

Что такое производная? Рассмотрим непрерывную гладкую функцию f(x) = y, отображающую число x в новое число y. Возьмем для примера функцию, изображенную на слайде. Поскольку функция непрерывна, небольшое изменение x может дать в результате только небольшое изменение y — это вытекает из понятия непрерывности. Допустим, мы увеличили x на маленькую величину epsilon_x: в результате y изменилось на маленькую величину epsilon_y.

Кроме того, поскольку функция является гладкой (ее кривая не имеет острых углов), то при малых величинах epsilon_x в окрестностях определенной точки p функцию f можно аппроксимировать линейной функцией c наклоном a. Соответственно, epsilon_y можно вычислить как a * epsilon_x, т.е:

f(x + epsilon_x) = y + a * epsilon_x

Очевидно, что такая линейная аппроксимация действительна, только когда x располагается достаточно близко к точке p.

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

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

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

Наклон a называется производной f в точке p. Если a имеет отрицательное значение, небольшое приращение x в окрестностях p приведет к уменьшению f(x); а если положительное

— небольшое увеличение x приведет к увеличению f(x). Кроме того, абсолютное значение a (величина производной) сообщает, насколько большим будет это увеличение или уменьшение.

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

Производная f в точке p

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

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

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

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

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

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

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

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

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

Рассмотрим пример.

Дано: входной вектор x (образец в наборе данных); матрица W (веса модели); цель y_true (которую модель должна научиться ассоциировать с x); функция потерь loss (измеряет разницу между текущим прогнозом модели и y_true).

С помощью W вычисляем приближение к цели y_pred и определяем потери или несоответствие между кандидатом y_pred и целью y_true:

dot - скалярное произведение матрицы W и вектора x.

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

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

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

Теперь, используя градиенты, можно выяснить, как обновить W, чтобы уменьшить значение loss_value. Если входные данные x и y_true зафиксированы, то предыдущие операции можно интерпретировать как функцию, отображающую значения W в значения потерь:

Допустим, что W0 — текущее значение W. Тогда производной функции f в точке W0 будет тензор grad(loss_value, W0) с той же формой, что и W, в котором каждый элемент grad(loss_value, W0)[i, j] определяет направление и величину изменения в loss_value, наблюдаемого при изменении W0[i, j].

Тензор grad(loss_value, W0) — это градиент функции f(W) = loss_value в точке

W0, его также называют градиентом loss_value для W в окрестностях W0.

Соседние файлы в папке Лекции