В «Обломове» Гончаров описывает Штольца: тот учитывает каждый день, каждую минуту и каждое усилие. Кажется, даже локоть у него сгибается по утверждённому плану. Дадим такому человеку ведомость обучения нейросети: две эпохи, десять шагов, двадцать предъявлений. Штольц, пожалуй, закроет дверь, пока мы не объясним, что именно посчитали.
Эпоха в обучении нейросети — один полный проход по обучающему набору: каждый его пример обработан один раз. Если в наборе десять примеров, а модель берёт их по два, на одну эпоху приходится пять учебных шагов. Две эпохи дадут десять шагов и двадцать предъявлений примеров. Самих разных примеров при этом останется десять.
Разложим этот счёт на карточках. Устанавливать программу и запускать обучение для такого разбора не нужно. В конце вы сможете прочитать простые настройки с epochs и batch_size, посчитать работу и объяснить, чем эпоха отличается от batch, шага и learning rate.
Эпоха в обучении нейросети на десяти карточках
В уроке стоит «две эпохи». Звучит так, будто компьютер завершит работу после мезозоя. Но ждать динозавров не придётся: эпоху здесь отмеряют обработанными примерами. На нашем столе она целиком поместится в десять листочков.
Возьмите десять листочков и подпишите числами от 1 до 10; подойдёт и список в заметках. Номер обозначает один пример — скажем, фотографию с правильной подписью или сообщение с категорией. Вообразим учебную карусель с пятью держателями: в каждый помещаются две карточки. Один держатель подаёт пару, полный оборот возвращает к началу весь набор. На столе этот оборот легко пройти, просто перебирая пары.
Если хочется понять, как у примера появляется правильная метка, пригодится разбор разметки текста. Здесь считаем, как уже подготовленные примеры проходят через обучение.
Выберем простую схему: пара примеров → вычисление поправки → одно обновление обучаемых чисел. Затем следующая пара. Все десять карточек проходят так дважды. Поправки от нескольких пачек не накапливаем, между устройствами работу не делим.
Если в терминах уже запутались, позовите ИИ к столу
Начать можно в DeepSeek, а если вы уже пользуетесь ChatGPT или Claude — в знакомом чате. В новом разговоре вставьте в обычное поле сообщения:
Помоги мне понять эпоху обучения на десяти карточках с номерами от 1 до 10. Размер пачки — 2, эпох — 2. После каждой пачки одно обновление параметров, без накопления градиентов. Не запускай обучение и не пиши код. Давай по одному действию с карточками и жди моего ответа. Сначала объясни, что я должен разложить перед собой. Потом спроси, сколько пачек получилось; готовый ответ заранее не сообщай. Если я ошибусь, покажи на моих номерах, где пропуск или повтор.
Ответьте помощнику «получилось пять пар» или пришлите свой список. Дальше разговор пойдёт по вашему счёту. Четыре пары и два сиротливых листочка — уже понятное место для уточнения: где они должны оказаться, чтобы пройти весь набор?
Можно пройти упражнение и самостоятельно. Разложите пары: 1–2, 3–4, 5–6, 7–8, 9–10. Они образуют весь наш набор. Возьмите первую пару — это первая пачка, или batch. Число 2 в настройке batch_size говорит, сколько примеров входит в одну такую пачку.
Что происходит за один шаг
В выбранной схеме модель обрабатывает оба примера пачки, сравнивает ответы с правильными и вычисляет поправку. Затем обновляет параметры — внутренние обучаемые числа, например веса. Это наш учебный шаг.
Числа внутри модели меняются при тренировке. А число эпох и размер пачки задают устройство процесса; такие внешние настройки называют гиперпараметрами. Для нашего счёта они уже выбраны: по два примера, два полных прохода.
К нам подъехал один держатель. Две карточки в нём — batch, то есть пачка. Обработали их и обновили параметры — сделали шаг. Карусель подаёт материал, модель выполняет работу. Когда мы считаем пачки и обновления, получаются разные названия для связанных вещей.
Отметьте первую пару. Готов один шаг, предъявлено два примера; восемь ещё ждут. После второй пары будет два шага и четыре предъявления. Если остановиться здесь и назвать это эпохой, шесть карточек окажутся за пределами полного прохода. Так счёт можно проверить руками: всё ли прошло перед вами?
После пятой пары каждый номер от 1 до 10 встретился один раз. Карусель завершила полный оборот. Первая эпоха закончилась: пять действий с парами составили один проход по всему набору.
Такое понимание совпадает с определением в уроке Google о гиперпараметрах. Там эпоху связывают с обработкой всего обучающего набора, а размер batch — с количеством примеров перед обновлением параметров.
Вторая эпоха: те же карточки снова
Соберите карточки: начинается второй проход. В обычном цикле обучения параметры перед ним не сбрасываются к исходным: модель продолжает работу с текущими значениями.
Перемешаем карточки: 7–2, 9–1, 4–10, 3–8, 5–6. У держателей новые соседи, но все прежние номера на месте. Второй оборот карусели не превратился в поставку новых данных. И на следующем круге здесь тоже не возникнет одиннадцатая карточка сама собой.
| Эпоха | Шаг внутри эпохи | Карточки пачки | Общий номер шага | Предъявлено примеров всего |
|---|---|---|---|---|
| 1 | 1 | 1, 2 | 1 | 2 |
| 1 | 2 | 3, 4 | 2 | 4 |
| 1 | 3 | 5, 6 | 3 | 6 |
| 1 | 4 | 7, 8 | 4 | 8 |
| 1 | 5 | 9, 10 | 5 | 10 |
| 2 | 1 | 7, 2 | 6 | 12 |
| 2 | 2 | 9, 1 | 7 | 14 |
| 2 | 3 | 4, 10 | 8 | 16 |
| 2 | 4 | 3, 8 | 9 | 18 |
| 2 | 5 | 5, 6 | 10 | 20 |
В шестой строке одновременно идут второй проход и шестой общий шаг. Внутри новой эпохи номер шага снова равен единице. Если записать эти счётчики в одну колонку, легко потеряться. Таблица держит их раздельно: после последней строки получатся две эпохи, десять обновлений и двадцать предъявлений.
Проверьте карточку 7:четвёртая пачка первого прохода, первая пачка второго. Две встречи с одним примером. Попробуйте найти остальные номера. В этой таблице каждый встречается ровно дважды; если в своей раскладке потеряете карточку, полный проход сразу станет неполным.
В документации библиотеки Keras у функции обучения fit раздельно заданы размер пачки, эпохи и перемешивание. Для массивов настройка shuffle меняет порядок перед эпохами; при другом источнике данных он может управляться самим источником. Поэтому полный проход вполне может идти от карточки 7 к карточке 2.
Формула, которой достаточно для этого примера
Десять примеров делим на два в пачке — получаем пять пачек. В нашей схеме на каждую приходится один шаг:
Шагов за эпоху = 10 ÷ 2 = 5.
Умножаем на два прохода:
Всего шагов = 5 × 2 = 10.
Отдельно считаем предъявления:
Всего предъявлений = 10 примеров × 2 эпохи = 20.
Эти числа отвечают на три вопроса:сколько обновлений за проход, сколько за всю работу, сколько суммарных предъявлений. Счётчик разного материала остаётся отдельным:десять карточек. Никаких дополнительных примеров в обмен на красивую большую цифру нам не выдали.
Поэтому на вопрос «Сколько модель училась?» полезно уточнить единицу. У нас одновременно верны «две эпохи», «десять шагов» и «двадцать предъявлений». А сколько прошло секунд, из этих чисел не следует: это зависит ещё и от модели, данных и устройства.
Деление 10 на 2 получилось точным. Для набора с остатком отдельно уточняют, сохраняется ли неполная последняя пачка. В нашей раскладке все карточки поместились в пять пар: этот дополнительный вопрос не влияет на счёт.
Поменяем размер пачки, сохранив две эпохи
Теперь оставим те же десять карточек и два прохода, а пачки сделаем крупнее. При размере 5 за один шаг будут обрабатываться сразу пять примеров. Для полного прохода хватит двух шагов.
| Примеров в пачке | Шагов за эпоху | Шагов за две эпохи | Предъявлений за два прохода |
|---|---|---|---|
| 1 | 10 | 20 | 20 |
| 2 | 5 | 10 | 20 |
| 5 | 2 | 4 | 20 |
| 10 | 1 | 2 | 20 |
В последней строке весь набор обрабатывается одной пачкой. Получается одно обновление за эпоху. В первой строке обновление происходит после каждой отдельной карточки. Примеров за два прохода предъявлено поровну, а число обновлений различается.
В первой строке таблицы каждую карточку встречает отдельное обновление. В последней все десять проходят вместе, и только потом меняются параметры. Два полных оборота остаются двумя оборотами, а остановок для обновления получается разное число.
Сравните два плана. Первый: 2 эпохи, пачки по 2 — всего 10 обновлений и 20 предъявлений. Второй: 3 эпохи, пачки по 5 — всего 6 обновлений и 30 предъявлений. Эпох стало больше, обновлений меньше. Это не спор двух программ:мы просто меняли разные настройки.
Почему learning rate считают отдельно
Рядом встречается learning_rate — темп обучения. Для карусели уже известны число оборотов и число карточек в держателе. А learning rate относится к тому, как сильно менять обучаемые числа при обновлении. Это другая часть устройства процесса.
Он не означает «сколько карточек пройти». Представьте, что мы завершили одну пару и вычислили направление поправки. Дальше нужна величина, которая задаёт её масштаб. В простом градиентном спуске такую роль играет learning rate: он умножается на вычисленный градиент. Градиент подсказывает, как менять параметры, чтобы уменьшать ошибку.
Поменяем только learning rate в нашем плане из двух эпох. Количество пар и проходов не изменится: всё ещё десять обновлений. А величины поправок могут стать другими. Этот коэффициент влияет на ход обучения; выбранные два прохода сами собой не станут тремя.
Точное значение подбирают под тренировку. Сейчас достаточно развести четыре вопроса:какой набор берём, сколько примеров подаём вместе, сколько раз проходим и каким коэффициентом масштабируем поправку.
Две эпохи не сообщают, насколько хорошо получилось
В карточном разборе мы считали объём работы. Для качества понадобилась бы другая проверка — например, как обученная модель отвечает на отложенных примерах, которые не использовались для её обучения.
В уроке Google о переобучении разобран случай, когда модель хорошо подходит к знакомым данным и плохо работает на новых. Поэтому число пройденных эпох читают вместе с показателями ошибки. Больше повторений не является самостоятельной оценкой качества.
Допустим, написано: «После пяти эпох ошибка на обучающих примерах снизилась». Это результат на знакомом наборе. Если рядом есть val_loss, стоит посмотреть и его: в Keras так отмечают ошибку на проверочных данных. Ситуацию, когда учебная ошибка снижается, а проверочная начинает расти, разбирают как признак возможного переобучения. Счётчик эпох один эту разницу не покажет.
На нашем столе есть ведомость проходов. Оценки качества в ней пока нет: параметры модели здесь не вычислялись. Зато теперь в настоящем отчёте хочется найти обе вещи — сколько работали и что получилось на проверке.
Как прочитать короткую запись из урока
Возьмём три значения: набор из 10 примеров, batch_size = 2, epochs = 2. Прочитать их можно обычными словами: «Дважды пройти по всем десяти примерам, беря по два перед каждым обновлением».
Потренируемся читать схематичную строку: «Эпоха 1 из 2; пачка 5 из 5». Закончился первый полный проход. Затем появится «Эпоха 2 из 2; пачка 1 из 5». Общий номер обновления в этот момент уже шестой. Это запись нашей раскладки, а не журнал запущенной программы.
При чтении реальных настроек полезно заметить и соседние параметры. Например, Keras позволяет отдельно задать steps_per_epoch, то есть число шагов до завершения эпохи. Тогда арифметику нужно читать с учётом этой настройки. Наше упражнение исходит из полного прохода по конечному набору, без такого переопределения.
Настройки уже удалось прочитать. Теперь можно отдать помощнику роль экзаменатора с одним вопросом:
Дай мне одну задачу на счёт эпох с десятью примерами, но другим размером пачки, который делит десять без остатка. После каждой пачки одно обновление, накопления градиентов нет. Не показывай решение, дождись моего ответа. Затем проверь отдельно число эпох, шагов за эпоху, шагов всего и предъявлений примеров. Если я перепутаю единицы, укажи конкретную строку.
Сначала назовите четыре результата сами, потом попросите проверку. Если числа не сошлись, покажите пары. Помощник сможет разобрать конкретную строку:какой номер потерялся, где локальный шаг приняли за общий или предъявления — за разные примеры.
Вопросы и ответы
Эпоха — это один пример?
Нет. В нашей схеме одна эпоха заканчивается, когда обработаны все десять разных примеров. Один из них — только часть набора.
Batch и шаг — одно и то же?
Batch — пачка примеров, а шаг в нашем упражнении включает её обработку и одно обновление параметров. Связь «одна пачка — одно обновление» мы задали явно. При накоплении градиентов счёт обновлений потребуется уточнить отдельно.
Если перемешать карточки, начнётся новая эпоха?
Одно перемешивание ничего не обрабатывает. Новая эпоха — следующий проход по набору. Порядок может измениться, как во второй половине таблицы, но все десять примеров всё равно будут пройдены.
Сколько эпох нужно нейросети?
Универсального числа нет. Для настоящего обучения смотрят на задачу и результат проверки, а также на время и ресурсы. В нашем упражнении две эпохи выбраны, чтобы увидеть повторный проход и посчитать его.
Если я десять раз задал вопрос в чате, это эпоха?
Количество сообщений в обычной переписке не является таким счётчиком. Термин относится к проходу по обучающему набору в процессе тренировки. В этой статье чат помогает нам изучить устройство счёта.
Можно ли по эпохам определить время обучения?
Одного числа эпох мало. Два прохода по десяти небольшим примерам и по миллиону сложных примеров означают разную работу. На время влияют также модель и оборудование.
Десять карточек наконец сошлись
Штольц может открыть дверь:две эпохи, десять обновлений, двадцать предъявлений, десять разных карточек. Сохраните таблицу или соберите свою для другой пачки. На карусели всё на месте — даже яблоко, которое уже второй раз проехало мимо и ни разу не стало новым примером.
Если после знакомства с терминами хочется разобраться, когда вообще нужно менять модель обучением, переходите к выбору между RAG и дообучением. Возможно, ваша задача решается примерами в запросе или работой по документам; там мы разбираем сам выбор подхода.
А в практике клуба по первым задачам с ИИ можно принести свой вопрос из урока, попросить помочь с непонятным местом и развивать собственные идеи. Десять карточек — уже хороший исходный материал: на нём вы не только прочитали слово, но и увидели, что оно считает.