Как обучается нейросеть: градиентный спуск и обратное распространение
Коротко
Нейросеть учится не по инструкции, а на собственных ошибках: она много раз пытается угадать ответ, измеряет, насколько промахнулась, и чуть-чуть подкручивает свои внутренние настройки. Размер ошибки считает функция потерь. Куда и насколько двигать настройки, подсказывает градиентный спуск - как осторожный шаг вниз по склону в тумане. А обратное распространение быстро вычисляет, какой именно «винтик» сети сильнее всего повлиял на промах. Повторите это миллионы раз на большом массиве данных - и сеть начинает выдавать осмысленные ответы.
В прошлом уроке - Как устроена нейросеть: нейрон, веса, активация - мы разобрали, из чего собрана сеть. Там было много весов - чисел, которые определяют, как сигнал проходит сквозь сеть. Но откуда берутся правильные значения этих весов? Их никто не задаёт вручную. Сеть подбирает их сама в процессе обучения. Как именно - об этом сегодняшний урок.
Что значит «ошибка модели»
Представьте, что нейросеть только что создали. Все её веса заполнены случайными числами. Если показать ей фотографию кота и спросить «кто это?», она ответит наугад - с тем же успехом могла бы назвать собаку, чайник или цифру 7.
Чтобы сеть стала полезной, нам нужен способ сказать ей: «вот сейчас ты ответила хорошо» или «а вот тут сильно мимо». Для этого используют обучающие данные - заранее размеченные примеры, где для каждого входа известен правильный ответ. Например, тысячи фотографий с подписями «кот» и «не кот».
Сеть берёт пример, выдаёт свой прогноз, и мы сравниваем прогноз с правильным ответом. Разница между ними и есть ошибка. Чем больше разница, тем хуже сеть справилась именно на этом примере.
Важно
Обучение нейросети - это не «загрузка знаний» и не программирование правил. Это медленная настройка тысяч (а в больших моделях - миллиардов) чисел так, чтобы ошибка на множестве примеров стала как можно меньше.
Функция потерь: единый счётчик промахов
Одной фотографии мало - сеть должна хорошо отвечать на всех примерах сразу. Поэтому ошибки по всем примерам сводят в одно число.
Функция потерь - это формула, которая измеряет, насколько сильно прогнозы сети отличаются от правильных ответов на наборе данных. Чем число больше, тем сеть ошибается чаще и грубее. Чем меньше - тем лучше она угадывает.
Удобная аналогия - оценка за контрольную. Учитель не смотрит на одну задачу: он суммирует все недочёты и выставляет общий балл. Функция потерь делает то же самое, только автоматически и в виде числа, которое нужно уменьшать.
Важная деталь: обычно мелкие промахи штрафуются слабо, а грубые - гораздо сильнее. Если сеть была уверена в неверном ответе, штраф будет ощутимым. Это подталкивает её исправлять в первую очередь самые серьёзные ошибки.
Тогда вся задача обучения формулируется одной фразой: подобрать такие веса, при которых функция потерь будет минимальной. Осталось понять, как их искать.
Градиентный спуск: шаг с горы в тумане
Вообразите холмистую местность. По горизонтали - всевозможные комбинации весов сети. По вертикали - значение функции потерь для каждой комбинации. Высокие места - это плохие настройки с большой ошибкой. Низины - хорошие, где сеть ошибается мало. Наша цель - спуститься как можно ниже.
Сложность в том, что всю карту целиком мы не видим - она слишком огромная. Мы как путник в густом тумане: видим только землю прямо под ногами и чувствуем, в какую сторону склон идёт вниз.
Градиентный спуск - это способ обучения, при котором сеть делает много маленьких шагов в сторону снижения ошибки. На каждом шаге она смотрит, в каком направлении функция потерь убывает быстрее всего, и чуть-чуть сдвигает веса туда. Потом снова осматривается и снова делает шаг. И так - пока спускаться дальше почти некуда.
Слово «градиент» здесь означает направление самого крутого спуска. Не пугайтесь термина: по сути это стрелка-подсказка «вниз - туда».
Размер шага называют скоростью обучения. Тут нужен баланс:
- Слишком большие шаги - можно перепрыгнуть низину и заскакать туда-сюда, так и не успокоившись.
- Слишком маленькие шаги - спуск будет честным, но мучительно долгим.
Упражнение: в какую сторону шагнуть?
Представьте простую «долину»: ошибка зависит от одного-единственного веса. Вы стоите на склоне. Вы сделали два пробных микродвижения:
- чуть увеличили вес → ошибка выросла;
- чуть уменьшили вес → ошибка упала.
Вопрос: в какую сторону менять вес, чтобы приблизиться к минимуму?
Разбор. Двигаться нужно туда, где ошибка снижается, то есть в сторону уменьшения веса. Именно так и работает градиентный спуск: он определяет, в какую сторону «склон» идёт вниз, и делает шаг туда. Заметьте: мы не вычисляли никакую формулу заранее - просто проверили, куда катится мяч, и пошли следом. Сеть делает то же самое, только сразу для всех весов и с помощью математики, а не пробных тычков.
Обратное распространение: кто виноват в ошибке
Градиентный спуск говорит «двигайся вниз». Но в реальной сети не один вес, а тысячи или миллионы. Как понять, какой из них и насколько подкрутить? Если проверять каждый по очереди пробными движениями, обучение растянулось бы на годы.
Здесь помогает обратное распространение (по-английски backpropagation) - метод, который позволяет за один проход вычислить, какой вес и насколько повлиял на итоговую ошибку. Сеть делает прогноз, считает общий промах, а затем как бы «разматывает» этот промах назад - от выхода к входу, слой за слоем, распределяя долю ответственности между всеми весами.
Аналогия - разбор ошибки в командной работе. Проект сдан с браком. Чтобы не наказывать всех подряд, руководитель проходит цепочку обязанностей в обратном порядке и выясняет, чьё решение и насколько сказалось на результате. Тот, кто повлиял сильнее, и правок требует больше.
Связка работает так: обратное распространение считает «вклад каждого винтика в промах», а градиентный спуск на основе этих данных подкручивает все веса разом в нужную сторону. Один такой цикл - взять примеры, посчитать ошибку, распределить вину, поправить веса - повторяется снова и снова. Каждый полный проход по обучающим данным называют эпохой, и таких эпох обычно много.
Почему нужны горы данных и вычислений
Теперь понятно, почему обучение серьёзных моделей - это дорого и долго.
Во-первых, нужно много данных. По нескольким примерам сеть не уловит общую закономерность, а просто заучит их наизусть - и спасует на всём новом. Чтобы научиться отличать кота от собаки «вообще», ей нужны тысячи и тысячи разных изображений.
Во-вторых, нужно много повторений. За один проход веса сдвигаются лишь чуть-чуть. Чтобы из случайного набора чисел получилась осмысленная модель, цикл «прогноз - ошибка - поправка» прокручивают огромное число раз.
В-третьих, всё это - колоссальный объём вычислений. Внутри сети - миллионы и миллиарды умножений и сложений, и их нужно повторять на каждом примере и на каждом шаге. Поэтому крупные модели учат не на обычном процессоре, а на GPU - графических ускорителях, которые изначально создавались для игр и графики, но идеально подходят для массовых однотипных вычислений. Часто их объединяют в большие кластеры, и обучение может занимать недели.
Пример: почему GigaChat и YandexGPT обходятся так дорого
Большие языковые модели вроде GigaChat от Сбера или YandexGPT от Яндекса учат на гигантских объёмах текста. Внутри - очень много весов, а данные исчисляются терабайтами. Чтобы такая модель связно отвечала на русском, цикл обучения нужно прогнать колоссальное число раз - а это требует мощных GPU-кластеров, много электроэнергии и команды инженеров. Именно поэтому обучить большую модель с нуля под силу немногим компаниям, тогда как пользоваться уже обученной можно через приложение или сайт - например, через Алису, которая опирается на технологии Яндекса.
Хорошая новость для практики: пользователю не нужно повторять весь этот путь. Тяжёлое обучение проходит один раз на стороне разработчика. Дальше готовую сеть лишь применяют - это уже быстро и недорого.
Соберём всё вместе
Коротко весь процесс обучения нейросети укладывается в один повторяющийся цикл:
| Шаг | Что происходит |
|---|---|
| 1. Прогноз | Сеть берёт пример и выдаёт ответ исходя из текущих весов |
| 2. Оценка | Функция потерь измеряет, насколько ответ далёк от правильного |
| 3. Разбор вины | Обратное распространение считает вклад каждого веса в ошибку |
| 4. Поправка | Градиентный спуск делает маленький шаг - подкручивает веса вниз по «склону» ошибки |
| 5. Повтор | Цикл запускается снова на новых примерах - много-много раз |
Из этого и складывается «обучение»: не загрузка готовых знаний, а долгая, терпеливая настройка чисел через ошибки. В следующем уроке - Глубокое обучение и большие языковые модели (LLM) - мы увидим, что происходит, когда таких слоёв становится очень много, и как из этого вырастают модели, понимающие человеческий язык.
Проверьте себя
Короткий тест по уроку: выберите ответ и нажмите «Проверить» - увидите счёт и разбор.
Частые вопросы
Чем функция потерь отличается от градиентного спуска?
Это две разные роли в одном процессе. Функция потерь измеряет, насколько сильно сеть ошибается, и выдаёт одно число. Градиентный спуск использует это число, чтобы решить, в какую сторону и насколько подвинуть веса, и уменьшить ошибку на следующем шаге. Первое - «термометр», второе - «руль».
Что такое обратное распространение простыми словами?
Это способ за один проход выяснить, какой именно вес в сети и насколько виноват в итоговой ошибке. Сеть «разматывает» промах от выхода к входу и распределяет долю ответственности между всеми весами. Без этого приёма обучать большие сети было бы практически невозможно из-за объёма расчётов.
Почему обучение больших моделей такое дорогое?
Из-за сочетания трёх факторов: огромные объёмы данных, миллионы или миллиарды настраиваемых весов и необходимость прокрутить цикл обучения очень много раз. Всё это требует мощных GPU-ускорителей, времени и электроэнергии. Поэтому крупные модели вроде GigaChat или YandexGPT обучают на дорогих вычислительных кластерах.
Может ли нейросеть переучиться и стать хуже?
Да, такое бывает и называется переобучением: сеть слишком сильно «заучивает» обучающие примеры вместе со случайными мелочами и хуже работает на новых данных. Чтобы этого избежать, качество модели проверяют на отдельных примерах, которые она не видела при обучении, и при необходимости останавливают процесс вовремя.
В курсе: ← Назад: Как устроена нейросеть: нейрон, веса, активация · Дальше: Глубокое обучение и большие языковые модели (LLM) →
Авторы курса: Герман Коваленко (основатель ENGRAM) и Сергей Добров.
Нужно обучить не себя, а команду?
Корпоративная программа адаптирует эту методику под ваши роли и процессы: практики, диагностика, сопровождение.
Обучить команду