Разберитесь с концепцией ранней остановки и реализуйте функцию
В этом шаге вы сначала изучите концепцию ранней остановки и ее основные этапы.
Основная идея ранней остановки заключается в вычислении производительности модели на валидационном наборе во время обучения. Когда производительность модели на валидационном наборе начинает падать, обучение останавливается, чтобы избежать переобучения. Основные этапы следующие:
- Разделите исходный тренировочный набор данных на тренировочный и валидационный наборы.
- Обучайте модель только на тренировочном наборе и вычисляйте ошибку модели на валидационном наборе в конце каждой эпохи.
- Сравните ошибку модели на валидационном наборе с историей обучения. Остановите обучение, когда сравнение соответствует критерию остановки.
- Используйте параметры из последней итерации в качестве окончательных параметров для модели.
Существует множество различных критериев остановки, и они могут быть довольно гибкими. Одним из часто используемых критериев является мониторинг значения потери на валидационном наборе. Когда значение потери не было дальней оптимизировано в течение 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).
- Минимальное значение потерь, записанное до этого момента.