Схема обучения нейросети: что меняется после ошибки
Схема обучения нейросети на одном весе: как из прогноза получается ошибка, зачем нужна обратная связь и почему удачный расчёт ещё не доказывает качество.
Андрей
Преподаватель, научный редактор
7 мин чтения
На рисунке было всё: вход, несколько кружков, ответ и длинная стрелка назад. Я попросил студента показать, какое число изменилось после её прохождения. Он снова обвёл стрелку. Так я заметил собственный промах: схема обучения нейросети выглядела законченной, хотя действие в ней осталось непонятным. Мы убрали лишние кружки и оставили один вес.
На первом проходе эта маленькая модель ответила 2 вместо ожидаемых 4. После одной правки получилось 3,6. Вот это уже можно обсуждать: что именно мы поправили, откуда взялось новое число и почему близкий ответ не означает, что работа закончена. Мне понадобился такой разбор раньше любого красивого рисунка со множеством слоёв.
Схема обучения нейросети в четырёх блоках
Я нарисовал четыре прямоугольника. В первом лежат исходные данные, во втором вычисляется прогноз, в третьем считается ошибка, в четвёртом меняется настройка. Обратная линия возвращается к настройке модели. Правильный ответ в условии остаётся прежним.
Возьмём самое короткое правило: прогноз равен входному числу, умноженному на вес. Вход — 2, вес пока равен 1. Получаем 2. Желаемый ответ задан отдельно: 4. У модели есть возможность поменять вес, но нет права заменить четвёрку в условии двойкой и объявить совпадение.
На этой схеме показан один шаг для линейного нейрона без дополнительного смещения. Я намеренно оставил единственную настройку: её можно проследить от начала до конца. В большой сети параметров гораздо больше, но добавлять их на первый учебный рисунок ради внушительного вида мне незачем.
Раньше я предлагал запомнить последовательность слов: «данные, модель, ошибка, обучение». Студент мог без труда повторить её в нужном порядке. А потом на вопрос о второй попытке снова получалось 2. Мы повторили вычисление с тем же весом. Повтор сам по себе ничего не изменил.
Поэтому теперь к каждому блоку я приписываю действие:
Данные дают пример и известный ответ, с которым можно сравнивать.
Модель вычисляет прогноз при текущих настройках.
Ошибка выражает выбранным числом расхождение с образцом.
Обновление меняет настройки перед следующим вычислением.
Это схема обучения с учителем: образец ответа у нас уже есть. Для другого способа обучения источник сигнала будет другим. Я сначала уточняю это условие, иначе один рисунок начинают воспринимать как универсальное устройство всего искусственного интеллекта.
От двойки к 3,6: обратная стрелка с числами
Я выбрал квадрат расхождения как меру ошибки. Сначала прогноз 2, цель 4. Разность равна минус двум, её квадрат равен 4. Нам нужно уменьшить это число, меняя вес. Пока всё можно проверить обычной арифметикой.
Чтобы выбрать направление изменения, вычисляем производную ошибки по весу. Здесь она равна минус восьми. Размер правки задаёт шаг обучения; я взял 0,1. Новый вес получается так: из 1 вычесть произведение 0,1 и минус 8. Ответ — 1,8. При новом проходе входная двойка умножается уже на него.
Я собрал два таких обновления в таблицу и проверил значения отдельным расчётом:
Состояние · Вес · Прогноз для входа 2 · Квадрат расхождения с 4
До правок — 1 — 2 — 4
После первой — 1,8 — 3,6 — 0,16
После второй — 1,96 — 3,92 — 0,0064
В первой правке ошибка уменьшилась в 25 раз. Впечатляет. Но полезнее посмотреть, где именно возникло улучшение: на том же самом примере, который участвовал в настройке веса. Мы пока не проверяли ничего другого.
На занятии я обычно останавливаюсь ещё раньше и прошу назвать три разные вещи. Ошибка — насколько плох текущий прогноз по выбранной мере. Производная — как ошибка реагирует на изменение веса. Шаг — насколько большую правку мы делаем. Когда все три называют словом «обучение», обратная стрелка опять превращается в украшение.
Заучивать формулу производной для первой схемы не обязательно. Можно сначала рассказать действия словами, а вычисление разобрать отдельно. Мне важнее, чтобы человек понял причину нового ответа: изменился вес. Данные и цель в нашем упражнении не менялись.
Удачный ответ ещё не закрывает работу
После таблицы хочется сказать: «Научилась». Я и сам торопился так подводить итог. Но одна пара чисел слишком многое позволяет нам предположить. В ней вход 2 связан с целью 4. Она ещё не объясняет, как устроены все остальные примеры задачи.
Поэтому рядом с циклом обучения я добавляю проверку на других данных. Во время такой проверки мы считаем качество выбранной модели, а не продолжаем подгонять вес под каждый ответ. Если незаметно смешать эти действия, красивая итоговая цифра перестанет отвечать на наш вопрос о новых примерах.
Назначение наборов удобно развести заранее:
На обучающих примерах меняют веса.
На валидационных принимают решения о ходе обучения и его настройках.
На тестовых оценивают уже выбранное решение.
Сами названия не делают разделение независимым. Если почти одинаковые фотографии одного предмета разнести между обучением и проверкой, испытание может оказаться слишком лёгким. Если задача связана со временем, нужно следить, чтобы сведения из будущего не помогали предсказывать прошлое. Конкретное разделение зависит от данных, единой доли для всех случаев я не назначаю.
Признак, который стоит заметить на следующем учебном графике: ошибка на знакомых данных продолжает снижаться, а на проверочных начинает расти. Такое расхождение может указывать на переобучение. Дольше повторять тот же цикл ради маленького числа в первой колонке тогда недостаточно. Нужен разбор того, что происходит с качеством на новых примерах.
Когда объяснение в чате помогает схеме
Фразу «объясни короче» легко принять за ещё одну обратную стрелку. В переписке она уточняет задание. Из неё не следует, что сервис тут же обновил веса по нашему учебному алгоритму. Контекст разговора и обучение модели — разные вещи, хотя в обоих случаях следующий ответ может отличаться.
В LibraChat можно обсудить непонятный блок и приложить собственную картинку со схемой. Допустимый размер файла зависит от тарифа; подробности стоит сверить с условиями тарифов. Для первого вопроса достаточно и цепочки действий, записанной текстом.
Я бы начал с конкретного затруднения: «Не понимаю, почему после подсчёта ошибки меняется вес». Это даёт разговору направление. Просьба рассказать всё об обучении легко приводит к новому списку терминов, а мы уже видели, что выученный список не заменяет понимания действия.
Для перехода к коду пригодится материал об основах Python и обучении программированию. Сначала полезно узнать в программе знакомые блоки: где считается ответ, где ошибка и где выполняется обновление. Тогда цикл в коде продолжает рисунок, а не открывает совершенно новую тему.
Я разбираю обучение с учителем. На моей схеме есть входной пример, прогноз, ошибка и изменение весов. Помоги объяснить обратную связь на модели «прогноз равен входу, умноженному на вес»: вход 2, цель 4, начальный вес 1. Сначала спроси, как я понимаю назначение каждого блока. Затем объясни только то место, в котором я ошибся. Отдельно отличи обучение от проверки на новых данных.
А после разговора подпиши на своей схеме одну настройку до и после обновления. Если можешь объяснить, почему из 1 получилось 1,8, рисунок уже делает полезную работу. Я теперь начинаю именно с такого вопроса. Кружки и стрелки добавляю позже.