Это пятый день моего участия в августовском испытании обновлений. Узнайте подробности мероприятия: Испытание августовского обновления
В этой статье объясняется, как уменьшить переобучение. Сначала взгляните на следующие три изображения. Недостаточная подгонка указывает на то, что модель прогнозируемой функции содержит меньше параметров и сложности, чем фактическая модель, но эта ситуация становится все менее и менее распространенной, поскольку текущая сеть достаточно глубокая.
А переобучение указывает на то, что количество параметров и сложность модели прогнозируемой функции намного выше, чем у реальной модели.
В этом контексте кто-то предложил «бритву Оккама», то есть нельзя использовать больше вещей, чем необходимо.В нейронных сетях параметры сети, которые не нужны, должны быть выбраны как наименьшее и наиболее эффективное количество возможных параметров.
В настоящее время существуют следующие основные методы предотвращения чрезмерной подгонки:
- More data
- Constraint model complexity
- shallow
- regularization
- Dropout
- Data argumentation
- Early Stopping
Здесь мы используем Регуляризация, Для проблемы бинарной классификации ее формула перекрестной энтропии
На этом этапе, если параметр добавлен,представляет сетевые параметрыподожди, тогдаНекоторая норма (L1-норма используется в следующей формуле), умноженная на коэффициент, формула становится
Подумайте об этом, мы изначально хотели оптимизировать Loss, т.е., делая его близким к 0, и теперь мы оптимизируем, по сути, в процессе принуждения Loss к 0 делается L1-норма параметратоже близко к 0
Тогда почему при норме значения параметра близкой к 0 сложность модели уменьшится? Мы представляем, что сейчас есть модель, после регуляризации значение нормы параметра оптимизируется до значения, очень близкого к 0, в это время может бытьстановится очень малым, если предположить, что оба, то модель приблизительно становится квадратным уравнением, которое не так сложно, как исходные семь
Этот метод также известен как снижение веса.
Обратите внимание, что поверхность сегментации в левой части рисунка выше является более сложной, а не гладкой кривой, что показывает, что функциональная модель имеет лучшую сегментацию и сильную выразительную способность, но некоторые образцы шума были изучены. Изображение справа - это изображение после добавления регуляризации.Модель функции не изучила некоторые образцы шума, а способность к выражению не так сильна, поэтому ее можно лучше разделить, и это то, что мы хотим.
Существует два распространенных способа регуляризации: один — добавить L1-норму, другой — добавить L2-норму, чаще всего используется L2-регуляризация, код выглядит следующим образом.
net = MLP()
optimizer = optim.SGD(net.parameters(), lr=learning_rater, weight_decay=0.01)
# SGD会得到所有的网络参数,设置weight_decay=0.01以迫使二范数逐渐趋近于0
# 但要注意的是,若没有overfitting现象仍设置weight_decay参数,会使性能急剧下降
criteon = nn.CrossEntropyLoss()
pytorch пока не имеет хорошей поддержки L1-регуляризации, поэтому ему необходимо вручную установить код
regularization_loss = 0
for param in model.parameters():
regularization_loss += torch.sum(torch.abs(param))
classify_loss = criteon(logits, target)
loss = classify_loss + 0.01 * regularization_loss
optimizer.zero_grad()
loss.backward()
optimizer.step()