# Градиентный спуск: как нейросети учатся на самом деле

## Метаданные

- **Спикер:** 3Blue1Brown
- **Канал:** 3Blue1Brown
- **Тема:** Интуитивное объяснение градиентного спуска — ключевого алгоритма обучения нейронных сетей. Функция стоимости, вектор градиента и анализ скрытых слоёв.
- **Длительность:** 20:33
- **YouTube:** https://www.youtube.com/watch?v=IHZwWFHWa-w
- **Источник:** https://ekstraktznaniy.ru/workbook/623

## Ключевые тезисы

1. **Обучение нейросети — это минимизация функции стоимости** — Когда мы говорим, что нейросеть «учится», на самом деле происходит поиск минимума функции стоимости. Эта функция принимает все 13 000 весов и смещений сети и выдаёт одно число — насколько плохо сеть работает. Весь процесс обучения сводится к задаче из математического анализа, а не к магии искусственного интеллекта.
2. **Функция стоимости измеряет ошибку через сумму квадратов разностей** — Для каждого обучающего примера вычисляется сумма квадратов разностей между фактическими выходами сети и желаемыми значениями. Когда сеть уверенно классифицирует правильно — стоимость мала. Когда ошибается — стоимость велика. Средняя стоимость по всем примерам и есть мера качества сети.
3. **Градиентный спуск — это движение «вниз по склону» функции стоимости** — Вместо того чтобы аналитически находить минимум сложной функции, мы начинаем с произвольной точки и делаем маленькие шаги в направлении наибольшего убывания. Это аналогия с шариком, катящимся с холма. Процесс повторяется до нахождения локального минимума.
4. **Градиент показывает направление наибыстрейшего роста функции** — Градиент функции — это вектор, указывающий направление наибыстрейшего возрастания. Отрицательный градиент, соответственно, указывает направление наибыстрейшего убывания. Длина вектора градиента показывает, насколько крут склон в этом направлении.
5. **Размер шага пропорционален крутизне склона** — Когда наклон крутой — шаги большие, когда склон выравнивается к минимуму — шаги уменьшаются. Это естественным образом предотвращает «перелёт» через минимум. Принцип работает одинаково для функции с одним входом и для 13 000-мерного пространства весов.
6. **Локальный минимум не обязательно является глобальным** — В зависимости от начальной случайной инициализации весов сеть может попасть в разные «долины» функции стоимости. Нет гарантии, что найденный локальный минимум — лучший из возможных. Это фундаментальное ограничение градиентного спуска.
7. **Компоненты градиента показывают относительную важность каждого веса** — Каждая компонента вектора градиента сообщает две вещи: знак показывает, увеличивать или уменьшать соответствующий вес, а величина — насколько важно это изменение по сравнению с другими. Некоторые связи в сети гораздо важнее других для обучения.
8. **Обратное распространение — алгоритм эффективного вычисления градиента** — Backpropagation — это сердце обучения нейросетей. Он позволяет эффективно вычислить, как каждый отдельный вес и смещение влияет на функцию стоимости. Без этого алгоритма вычисление градиента в 13 000-мерном пространстве было бы непрактичным.
9. **Непрерывные активации нужны для гладкости функции стоимости** — Искусственные нейроны используют непрерывные значения активации, а не бинарные (вкл/выкл), как биологические нейроны. Это необходимо для того, чтобы функция стоимости была гладкой и градиентный спуск мог работать — делать маленькие шаги вниз по склону.
10. **Скрытые слои простой сети не обязательно учат интуитивные паттерны** — Вопреки надежде, что второй слой распознаёт рёбра, а третий — петли и линии, визуализация весов показывает почти случайные паттерны. Сеть находит рабочий локальный минимум, который классифицирует 96% изображений, но не формирует человечески понятные представления.
11. **Сеть уверена в ответе даже для случайного шума** — Если подать на вход случайное изображение, сеть уверенно выдаёт конкретную цифру, вместо того чтобы показать неуверенность. Она умеет распознавать цифры, но не умеет «рисовать» их — не понимает, как должна выглядеть цифра. Это следствие узких рамок обучения.

## Практические задания

### Задание 1: Визуализация функции стоимости в 1D
**Цель:** Постройте на бумаге или в графическом калькуляторе (Desmos) произвольную функцию с несколькими минимумами, например f(x) = x⁴ - 3x² + x. Выберите 3 разные начальные точки и вручную пройдите 5 шагов градиентного спуска: вычислите производную, определите направление шага, сделайте шаг пропорционально наклону. Убедитесь, что разные начальные точки приводят к разным локальным минимумам.

### Задание 2: Градиентный спуск в 2D на бумаге
**Цель:** Возьмите функцию f(x, y) = x² + 2y². Вычислите градиент ∇f = (2x, 4y). Начиная из точки (3, 2) с шагом α = 0.1, выполните 10 итераций градиентного спуска. Записывайте координаты на каждом шаге и нанесите траекторию на график. Обратите внимание, как траектория не идёт напрямую к минимуму из-за разных масштабов по осям.

### Задание 3: Вычисление функции стоимости вручную
**Цель:** Представьте сеть с 3 выходами. Правильный ответ — класс 2, значит целевой вектор [0, 1, 0]. Сеть выдала [0.3, 0.5, 0.2]. Вычислите стоимость: (0.3-0)² + (0.5-1)² + (0.2-0)² = 0.09 + 0.25 + 0.04 = 0.38. Повторите для выхода [0.1, 0.9, 0.0] и сравните — какой результат лучше? Так вы прочувствуете, что измеряет функция стоимости.

### Задание 4: Интерпретация компонент градиента
**Цель:** Предположим, градиент функции стоимости по трём весам равен (-0.5, 2.0, 0.1). Определите: какой вес нужно изменить сильнее всего? В каком направлении? Какой вес почти не влияет на стоимость? Запишите, какие именно изменения весов вы бы сделали, и объясните почему. Это упражнение тренирует интуицию о том, что градиент — это «приоритеты» обучения.

### Задание 5: Эксперимент с learning rate
**Цель:** Используя функцию f(x) = x² и начальную точку x = 10, выполните градиентный спуск с тремя разными размерами шага: α = 0.01, α = 0.1, α = 1.1. Для каждого запишите 15 итераций. Обратите внимание: маленький шаг — медленная сходимость, средний — быстрая, большой — расхождение. Это демонстрирует критическую важность выбора learning rate.

### Задание 6: Реализация простейшего градиентного спуска на Python
**Цель:** Напишите 15 строк кода на Python: определите функцию f(x) = x⁴ - 3x² + x, её производную f'(x) = 4x³ - 6x + 1, и цикл градиентного спуска на 100 итераций с learning rate 0.01. Запустите из точки x = 2.0 и из x = -2.0. Выведите итоговые значения x и f(x). Сравните результаты — вы наглядно увидите проблему локальных минимумов.

## Ключевые цитаты

> «Как бы провокационно ни звучало описание «машина учится», когда видишь, как это работает, это выглядит не столько безумной научно-фантастической идеей, сколько упражнением из математического анализа»
> — 3Blue1Brown

> «По сути всё сводится к нахождению минимума определённой функции»
> — 3Blue1Brown

> «Вы определяете функцию стоимости — способ сказать компьютеру: нет, плохой компьютер, этот выход — полная ерунда»
> — 3Blue1Brown

> «Просто сообщать компьютеру, что он делает паршивую работу, не очень полезно. Нужно сказать ему, как изменить веса и смещения, чтобы стало лучше»
> — 3Blue1Brown

> «Отрицательный градиент функции стоимости — это вектор, направление внутри безумно огромного пространства входов, которое говорит, какие подстройки всех этих чисел вызовут наибыстрейшее уменьшение стоимости»
> — 3Blue1Brown

> «Когда мы говорим, что сеть обучается, мы имеем в виду, что она просто минимизирует функцию стоимости»
> — 3Blue1Brown

> «Вместо того чтобы находить изолированные рёбра, веса выглядят практически случайными, лишь с некоторыми размытыми паттернами в центре»
> — 3Blue1Brown

> «Даже если эта сеть довольно хорошо распознаёт цифры, она понятия не имеет, как их рисовать»
> — 3Blue1Brown

> «Компоненты градиента показывают относительную важность каждого изменения — какое из них принесёт максимальную отдачу»
> — 3Blue1Brown

## Полный текст экстракта

# Градиентный спуск: как нейросети учатся на самом деле

> Спикер: 3Blue1Brown | Длительность: 20:33

## Ключевые идеи

1. **Обучение = минимизация функции стоимости** — когда нейросеть «учится», она ищет минимум функции, которая измеряет, насколько плохо сеть работает. Это задача из математического анализа, а не магия ИИ.

2. **Функция стоимости через сумму квадратов** — для каждого примера вычисляется сумма квадратов разностей между выходом сети и правильным ответом. Средняя стоимость по всем примерам — общая мера качества.

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

4. **Градиент = направление наибыстрейшего роста** — отрицательный градиент показывает, куда шагнуть для наибыстрейшего уменьшения стоимости. Длина вектора — крутизна склона.

5. **Шаг пропорционален крутизне** — у минимума склон пологий, шаги маленькие. Это предотвращает «перелёт» через минимум.

6. **Локальный минимум ≠ глобальный** — начальная инициализация определяет, в какую «долину» попадёт сеть. Гарантии лучшего решения нет.

7. **Компоненты градиента = приоритеты обучения** — знак компоненты говорит направление изменения, величина — важность. Не все веса одинаково значимы.

8. **Backpropagation — эффективное вычисление градиента** — алгоритм обратного распространения позволяет вычислить влияние каждого веса на стоимость.

9. **Непрерывные активации для гладкости** — нейроны используют плавные значения, чтобы функция стоимости была гладкой и градиентный спуск работал.

10. **Скрытые слои не обязательно учат интуитивные паттерны** — визуализация весов показывает почти случайные структуры, а не рёбра и петли, как хотелось бы.

11. **Сеть уверена даже в бессмыслице** — при подаче случайного шума сеть уверенно выдаёт ответ. Она умеет классифицировать, но не понимает структуру цифр.

## Транскрипт

### Вступление и рекап структуры нейросети

В предыдущем видео была разобрана структура нейронной сети. Классический пример — распознавание рукописных цифр, «Hello World» нейросетей. Изображения цифр представлены на сетке 28×28 пикселей, каждый пиксель — число от 0 до 1. Это определяет активации 784 нейронов входного слоя.

Активация каждого нейрона следующего слоя вычисляется как взвешенная сумма активаций предыдущего слоя плюс смещение (bias), пропущенные через функцию активации (sigmoid или ReLU). При двух скрытых слоях по 16 нейронов сеть имеет около 13 000 настраиваемых параметров — весов и смещений.

Классификация цифры определяется самым ярким из 10 нейронов выходного слоя. Надежда состояла в том, что второй слой распознаёт рёбра, третий — петли и линии, а последний собирает из них цифры.

### Обучающие данные

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

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

### Функция стоимости

Изначально веса инициализируются случайно — сеть работает ужасно. Для обучения определяется функция стоимости (cost function): сумма квадратов разностей между выходными активациями и целевыми значениями.

Для одного примера: если правильный ответ — цифра 3, целевой вектор имеет 1 на позиции «3» и 0 на остальных. Стоимость мала при правильной классификации и велика при ошибке. Средняя стоимость по всем примерам — мера качества сети.

Функция стоимости — надстройка над самой сетью: она принимает 13 000 параметров и выдаёт одно число — насколько плохи эти параметры.

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

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

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

Для нейросети: 13 000 параметров организуются в гигантский вектор. Отрицательный градиент функции стоимости — направление в этом 13 000-мерном пространстве, которое наибыстрее уменьшает стоимость.

Этот процесс — повторяющиеся шаги на долю отрицательного градиента — и называется градиентным спуском.

### Интерпретация градиента

Каждая компонента градиента содержит два сигнала: знак (увеличивать или уменьшать параметр) и величина (насколько это важно). Пример: градиент (3, 1) означает, что изменение первой переменной в три раза важнее второй.

В контексте нейросети: градиент кодирует относительную важность каждого веса и смещения — какие изменения дадут максимальный эффект.

### Анализ обученной сети

Сеть с двумя скрытыми слоями по 16 нейронов классифицирует ~96% новых изображений. С оптимизацией — до 98%. Но визуализация весов показывает: второй слой не выучил рёбра. Паттерны весов выглядят почти случайными.

Сеть нашла «удачный» локальный минимум — он работает для классификации, но не соответствует человеческой интуиции о распознавании паттернов. При подаче случайного шума сеть уверенно выдаёт конкретную цифру — она не понимает, что такое цифра, а лишь оптимизирована под узкую задачу.

Это базовая архитектура из 80-90-х годов — отправная точка для понимания более сложных современных моделей.

## Практические задания

### Задание 1: Визуализация функции стоимости в 1D
Постройте на бумаге или в графическом калькуляторе (Desmos) произвольную функцию с несколькими минимумами, например f(x) = x⁴ - 3x² + x. Выберите 3 разные начальные точки и вручную пройдите 5 шагов градиентного спуска: вычислите производную, определите направление шага, сделайте шаг пропорционально наклону. Убедитесь, что разные начальные точки приводят к разным локальным минимумам.

### Задание 2: Градиентный спуск в 2D на бумаге
Возьмите функцию f(x, y) = x² + 2y². Вычислите градиент ∇f = (2x, 4y). Начиная из точки (3, 2) с шагом α = 0.1, выполните 10 итераций градиентного спуска. Записывайте координаты на каждом шаге и нанесите траекторию на график. Обратите внимание, как траектория не идёт напрямую к минимуму из-за разных масштабов по осям.

### Задание 3: Вычисление функции стоимости вручную
Представьте сеть с 3 выходами. Правильный ответ — класс 2, значит целевой вектор [0, 1, 0]. Сеть выдала [0.3, 0.5, 0.2]. Вычислите стоимость: (0.3-0)² + (0.5-1)² + (0.2-0)² = 0.09 + 0.25 + 0.04 = 0.38. Повторите для выхода [0.1, 0.9, 0.0] и сравните — какой результат лучше?

### Задание 4: Интерпретация компонент градиента
Предположим, градиент функции стоимости по трём весам равен (-0.5, 2.0, 0.1). Определите: какой вес нужно изменить сильнее всего? В каком направлении? Какой вес почти не влияет на стоимость? Запишите, какие именно изменения весов вы бы сделали, и объясните почему.

### Задание 5: Эксперимент с learning rate
Используя функцию f(x) = x² и начальную точку x = 10, выполните градиентный спуск с тремя разными размерами шага: α = 0.01, α = 0.1, α = 1.1. Для каждого запишите 15 итераций. Обратите внимание: маленький шаг — медленная сходимость, средний — быстрая, большой — расхождение.

### Задание 6: Реализация градиентного спуска на Python
Напишите 15 строк кода на Python: определите функцию f(x) = x⁴ - 3x² + x, её производную f'(x) = 4x³ - 6x + 1, и цикл градиентного спуска на 100 итераций с learning rate 0.01. Запустите из точки x = 2.0 и из x = -2.0. Сравните результаты — вы увидите проблему локальных минимумов.

## Лучшие цитаты

> «Как бы провокационно ни звучало описание «машина учится», когда видишь, как это работает, это выглядит не столько безумной научно-фантастической идеей, сколько упражнением из математического анализа» — 3Blue1Brown

> «По сути всё сводится к нахождению минимума определённой функции» — 3Blue1Brown

> «Вы определяете функцию стоимости — способ сказать компьютеру: нет, плохой компьютер, этот выход — полная ерунда» — 3Blue1Brown

> «Просто сообщать компьютеру, что он делает паршивую работу, не очень полезно. Нужно сказать ему, как изменить веса и смещения, чтобы стало лучше» — 3Blue1Brown

> «Отрицательный градиент функции стоимости — это вектор, направление внутри безумно огромного пространства входов, которое говорит, какие подстройки всех этих чисел вызовут наибыстрейшее уменьшение стоимости» — 3Blue1Brown

> «Когда мы говорим, что сеть обучается, мы имеем в виду, что она просто минимизирует функцию стоимости» — 3Blue1Brown

> «Вместо того чтобы находить изолированные рёбра, веса выглядят практически случайными, лишь с некоторыми размытыми паттернами в центре» — 3Blue1Brown

> «Даже если эта сеть довольно хорошо распознаёт цифры, она понятия не имеет, как их рисовать» — 3Blue1Brown

> «Компоненты градиента показывают относительную важность каждого изменения — какое из них принесёт максимальную отдачу» — 3Blue1Brown