Градиентный спуск: как нейросети учатся на самом деле > Спикер: 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