Regularization

алгоритм

Это пятый день моего участия в августовском испытании обновлений. Узнайте подробности мероприятия:  Испытание августовского обновления

В этой статье объясняется, как уменьшить переобучение. Сначала взгляните на следующие три изображения. Недостаточная подгонка указывает на то, что модель прогнозируемой функции содержит меньше параметров и сложности, чем фактическая модель, но эта ситуация становится все менее и менее распространенной, поскольку текущая сеть достаточно глубокая.

А переобучение указывает на то, что количество параметров и сложность модели прогнозируемой функции намного выше, чем у реальной модели.

В этом контексте кто-то предложил «бритву Оккама», то есть нельзя использовать больше вещей, чем необходимо.В нейронных сетях параметры сети, которые не нужны, должны быть выбраны как наименьшее и наиболее эффективное количество возможных параметров.

В настоящее время существуют следующие основные методы предотвращения чрезмерной подгонки:

  • More data
  • Constraint model complexity
  • shallow
  • regularization
  • Dropout
  • Data argumentation
  • Early Stopping

Здесь мы используем Регуляризация, Для проблемы бинарной классификации ее формула перекрестной энтропии

J1(θ)=1mi=1m[yilny^i+(1yi)ln(1y^i)]J_1(\theta)=-\frac{1}{m}\sum_{i=1}^m[y_i\ln\hat y_i+(1-y_i)\ln(1-\hat y_i)]

На этом этапе, если параметр добавленθ\theta,θ\thetaпредставляет сетевые параметры(w1,b1,w2)(w1,b1,w2)подожди, тогдаθ\thetaНекоторая норма (L1-норма используется в следующей формуле), умноженная на коэффициентλ>0\lambda>0, формула становится

J2(θ)=J1(θ)+λi=1nθiJ_2(\theta)=J_1(\theta)+\lambda\sum_{i=1}^n|\theta_i|

Подумайте об этом, мы изначально хотели оптимизировать Loss, т.е.J1(θ)J_1(\theta), делая его близким к 0, и теперь мы оптимизируемJ2(θ)J_2(\theta), по сути, в процессе принуждения Loss к 0 делается L1-норма параметраiθi\sum_i|\theta_i|тоже близко к 0

Тогда почему при норме значения параметра близкой к 0 сложность модели уменьшится? Мы представляем, что сейчас есть модельy=β0+β1x+...+β7x7y=\beta_0+\beta_1x+...+\beta_7x^7, после регуляризации значение нормы параметра оптимизируется до значения, очень близкого к 0, в это время может бытьβ3,...,β7\beta_3,...,\beta_7становится очень малым, если предположить, что оба0.010.01, то модель приблизительно становится квадратным уравнением, которое не так сложно, как исходные семь

Этот метод также известен как снижение веса.

Обратите внимание, что поверхность сегментации в левой части рисунка выше является более сложной, а не гладкой кривой, что показывает, что функциональная модель имеет лучшую сегментацию и сильную выразительную способность, но некоторые образцы шума были изучены. Изображение справа - это изображение после добавления регуляризации.Модель функции не изучила некоторые образцы шума, а способность к выражению не так сильна, поэтому ее можно лучше разделить, и это то, что мы хотим.

Существует два распространенных способа регуляризации: один — добавить 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()