Введение
В этом проекте вы научитесь реализовывать технику ранней остановки в моделях машинного обучения. Ранняя остановка - это мощный метод предотвращения переобучения и улучшения производительности ваших моделей.
🎯 Задачи
В этом проекте вы научитесь:
- понять концепцию ранней остановки и ее основные этапы
- реализовать функцию ранней остановки для определения оптимального эпохи остановки
- протестировать функцию ранней остановки на выборочном наборе данных
🏆 Достижения
После завершения этого проекта вы сможете:
- разбить набор данных на тренировочный и валидационный наборы
- отслеживать производительность модели на валидационном наборе во время обучения
- определить критерий остановки на основе потери на валидационном наборе
- использовать функцию ранней остановки для оптимизации процесса обучения модели
Разберитесь с концепцией ранней остановки и реализуйте функцию
В этом шаге вы сначала изучите концепцию ранней остановки и ее основные этапы.
Основная идея ранней остановки заключается в вычислении производительности модели на валидационном наборе во время обучения. Когда производительность модели на валидационном наборе начинает падать, обучение останавливается, чтобы избежать переобучения. Основные этапы следующие:
- Разделите исходный тренировочный набор данных на тренировочный и валидационный наборы.
- Обучайте модель только на тренировочном наборе и вычисляйте ошибку модели на валидационном наборе в конце каждой эпохи.
- Сравните ошибку модели на валидационном наборе с историей обучения. Остановите обучение, когда сравнение соответствует критерию остановки.
- Используйте параметры из последней итерации в качестве окончательных параметров для модели.
Существует множество различных критериев остановки, и они могут быть довольно гибкими. Одним из часто используемых критериев является мониторинг значения потери на валидационном наборе. Когда значение потери не было дальней оптимизировано в течение n последовательных эпох (всегда больше минимальной потери), обучение останавливается.
Теперь вы реализуете функцию early_stop в файле early_stop.py.
Функция проверяет значения потерь по эпохам. Если потеря не улучшается (не уменьшается) в течение нескольких эпох, равных patience, рекомендуется остановить обучение.
Вот код функции early_stop:
def early_stop(loss: List[float], patience: int) -> Tuple[int, float]:
"""
Определяет эпоху, на которой следует остановить обучение, на основе предоставленных значений потерь и терпения.
Функция проверяет значения потерь по эпохам. Если потеря не улучшается (не уменьшается) в течение
нескольких эпох, равных `patience`, рекомендуется остановить обучение.
Параметры:
- loss (List[float]): Список значений потерь, обычно в том порядке, в котором они были записаны во время обучения.
- patience (int): Количество эпох без улучшения потерь, после которых обучение должно быть остановлено.
Возвращает:
- Tuple[int, float]: Кортеж, содержащий два значения:
1. Номер эпохи, на которой следует остановить обучение (индексирование с 1).
2. Минимальное значение потерь, записанное до этого момента.
"""
min_loss = np.Inf
max_patience = 0
stop_epoch = 0
for epoch, current_loss in enumerate(loss):
if current_loss < min_loss:
min_loss = current_loss
stop_epoch = epoch
max_patience = 0
else:
max_patience += 1
if max_patience == patience:
break
stop_epoch += 1
return stop_epoch, min_loss
В функции early_stop вы реализуете логику для определения эпохи, на которой следует остановить обучение, на основе предоставленных значений потерь и параметра patience.
Функция должна вернуть кортеж, содержащий два значения:
- Номер эпохи, на которой следует остановить обучение (индексирование с 1).
- Минимальное значение потерь, записанное до этого момента.
Протестируйте функцию ранней остановки
В этом шаге вы протестируете функцию early_stop, запустив файл early_stop.py.
Добавьте следующий код в файл early_stop.py:
if __name__ == "__main__":
loss = [
1.11,
1.01,
0.99,
0.89,
0.77,
0.69,
0.57,
0.44,
0.51,
0.43,
0.55,
0.61,
0.77,
0.89,
0.78,
]
patience = 3
stop_epoch, min_loss = early_stop(loss, patience)
print(f"{stop_epoch=}, {min_loss=}")
Затем запустите скрипт из терминала:
python early_stop.py
Вывод должен быть таким:
stop_epoch = 10, loss = 0.43
Это означает, что обучение должно быть остановлено на эпохе 10, и минимальное значение потерь, записанное до этого момента, равно 0.43.
Поздравляем! Вы успешно реализовали функцию ранней остановки. Теперь вы можете использовать эту функцию в своих проектах машинного обучения, чтобы предотвратить переобучение и улучшить производительность ваших моделей.
Резюме
Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.



