После двадцати эпох в этом примере выполнено сорок обновлений. Итоговая ошибка вычислена отдельно на всех четырёх объектах. Она характеризует одну, окончательную версию модели. Это полезно отличать от ошибки последней порции внутри цикла: та относится только к части данных и была вычислена ещё до последнего обновления.
Можно также считать среднюю ошибку, наблюдавшуюся в течение эпохи. Если порции неодинаковы, нужно учитывать их размеры. Например, средние ошибки 1 и 5 на порциях из четырёх и одного объекта дают общую среднюю (4 · 1 + 1 · 5) / 5 = 1.8, а не 3. В коде для этого суммируют loss.item() * len(xb) и делят на общее число объектов, если ошибка внутри порции усреднена по объектам. Но даже правильно взвешенная средняя собрана при меняющихся весах; она может отличаться от ошибки, заново измеренной после эпохи.
Что означает честная проверка
Низкая ошибка на обучающих объектах показывает, что модель смогла к ним приспособиться. Нас же обычно интересует ответ на новый объект. Поэтому данные разделяют: на обучающей части обновляют параметры, на отдельной проверочной — оценивают, насколько усвоенное правило переносится дальше. Для настройки решений используют валидационную часть, а тестовую оставляют для итоговой оценки. Если многократно выбирать модель по результату одного и того же теста, этот тест постепенно начинает участвовать в подборе решения.
При оценке вызывают model.eval() и отключают отслеживание производных с помощью torch.no_grad(). Первое переключает режим работы тех слоёв, у которых обучение и применение различаются; второе убирает ненужное построение графа. Следующий самостоятельный блок показывает только устройство такого вычисления. В нём создаётся новая, ещё не обученная модель и используются те же четыре точки, поэтому это не итоговая проверка качества.