最近在学习李沐博士的Gluon-tutorial中关于L2范数正则化能够有效的抑制deep learning过拟合的问题,在
discuss区看到有人讨论多维范数的相关问题,经过一番推理研究与查阅资料现整理成本文。
переоснащение,
Определение нормы и снижения веса
Проще говоря, явление, когда ошибка обучения модели намного меньше, чем ее ошибка на тестовом наборе данных, называется переоснащением.Это может происходить по разным причинам.Здесь мы ориентируемся на два фактора: сложность модели и степень обучения. размер набора данных.
Вообще говоря, учитывая набор обучающих данных, если сложность модели слишком низкая, ее легко переобучить; если сложность модели слишком высока, ее легко переобучить; размер набора обучающих данных, если набор обучающих данных. Переобучение более вероятно, когда количество выборок слишком мало, особенно когда количество параметров модели (в элементах) невелико.
Давайте воспользуемся простым примером, чтобы интуитивно почувствовать это: очевидно, что использование линейной функции для подбора полиномиальной функции третьего порядка приведет к недостаточному обучению, а использование слишком маленьких обучающих выборок приведет к переобучению.
Верхняя картинка не подходит, нижняя картинка переоснащается
Распад веса является распространенным решением проблемы переобучения, иРаспад веса эквивалентенрегуляризация нормы
Это вопрос, который мы хотим обсудить в этой статье.Раз можно использовать норму L2, могут ли нормы L1 и нормы L3 быть приемлемыми?
Если вы не знаете нормы, то рекомендуем посмотреть здесь
Давайте сначала представим обычный проходРегуляризация норм для подавления переобучения.
Во-первых,Регуляризация нормы относится к добавлению на основе исходной функции потерь модели.
Нормативный штрафной срок, чтобы получить функцию, которую необходимо минимизировать для обучения.
Штраф за норму относится к произведению суммы квадратов каждого элемента весового параметра модели и положительной константы. как функция потерь в линейной регрессии
Например, где,
весовой параметр,
параметр смещения, выборка
Вход
,
, помеченный как
, объем выборки
. использовать параметр веса в качестве вектора
=[w1,w2] означает, что
Новая функция потерь для штрафного срока по норме имеет вид
где гиперпараметры. Когда все весовые параметры равны 0, штрафной срок наименьший. когда
Когда он больше, штрафной член имеет больший вес в функции потерь, что обычно приближает элементы изученного весового параметра к 0. когда
При значении 0 срок штрафа вообще не действует. В приведенной выше формуле
норма в квадрате
получить после открытия
. имеют
После нормы штрафа в мини-пакетном стохастическом градиентном спуске мы помещаем веса в линейную регрессию
и
Метод итерации меняется на
видимый,веса порядка регуляризации нормы
и
Сначала умножьте число меньше 1, а затем вычтите градиент без штрафа.следовательно,
Регуляризация нормы, также известная как снижение веса. Уменьшение веса добавляет к модели ограничения, которые необходимо изучить, путем штрафования параметров модели большими абсолютными значениями, что может быть эффективным против переобучения. В практических сценариях мы иногда добавляем сумму квадратов элементов отклонения к штрафному члену.
Фактический эффект снижения веса
Поняв принцип, мы используем параметр затухания веса weight_decay, который поставляется с Gluon для тестирования.Прототипом является функция линейной регрессии Гаусса.
Член шума ϵ подчиняется нормальному распределению со средним значением 0 и стандартным отклонением 0,01. Чтобы легче наблюдать переоснащение, мы рассматриваем многомерную задачу линейной регрессии, такую как задание размерности; В то же время мы намеренно установили небольшое количество выборок в обучающем наборе данных, например 25.
Функция определяется следующим образом
%matplotlib inline
import d2lzh as d2l
from mxnet import autograd, gluon, init, nd
from mxnet.gluon import data as gdata, loss as gloss, nn
n_train, n_test, num_inputs = 25, 100, 200
true_w, true_b = nd.ones((num_inputs, 1)) * 0.01, 0.05
features = nd.random.normal(shape=(n_train + n_test, num_inputs))
labels = nd.dot(features, true_w) + true_b
labels += nd.random.normal(scale=0.01, shape=labels.shape)
train_features, test_features = features[:n_train, :], features[n_train:, :]
train_labels, test_labels = labels[:n_train], labels[n_train:]
Мы напрямую указываем гиперпараметр снижения веса через параметр wd при создании экземпляра Trainer. По умолчанию Gluon уменьшает как веса, так и смещения. Мы можем создавать экземпляры Trainer для весов и смещений отдельно, чтобы учитывались только веса.затухание.
def fit_and_plot_gluon(wd):
net = nn.Sequential()
net.add(nn.Dense(1))
net.initialize(init.Normal(sigma=1))
# 对权重参数衰减。权重名称一般是以weight结尾
trainer_w = gluon.Trainer(net.collect_params('.*weight'), 'sgd',
{'learning_rate': lr, 'wd': wd})
# 不对偏差参数衰减。偏差名称一般是以bias结尾
trainer_b = gluon.Trainer(net.collect_params('.*bias'), 'sgd',
{'learning_rate': lr})
train_ls, test_ls = [], []
for _ in range(num_epochs):
for X, y in train_iter:
with autograd.record():
l = loss(net(X), y)
l.backward()
# 对两个Trainer实例分别调用step函数,从而分别更新权重和偏差
trainer_w.step(batch_size)
trainer_b.step(batch_size)
train_ls.append(loss(net(train_features),
train_labels).mean().asscalar())
test_ls.append(loss(net(test_features),
test_labels).mean().asscalar())
d2l.semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'loss',
range(1, num_epochs + 1), test_ls, ['train', 'test'])
print('L2 norm of w:', net[0].weight.data().norm().asscalar())
Наблюдаемое переобучение
fit_and_plot_gluon(0)
Обратите внимание, что уменьшение веса в это время составляет
Используйте снижение веса
fit_and_plot_gluon(10)
в заключении
До сих пор мы обнаружили, что разницу между w и w действительно можно уменьшить, установив параметр wd.Норма обеспечивает затухающий эффект на вес, в данном примере это конкретно
Последующее тестирование нормы L1 и нормы L3
L1 норма
прежде всегоОдна из самых важных функций _norm, вывод разреженный, он напрямую устанавливает неважные функции в ноль и
_норм нет.[1]
Это можно непосредственно вывести из частных производных регулярных членов L1 и L2,
Таким образом, будет обнаружено, что при обновлении градиента, независимо отКаков размер (если он не равен 0) градиента 1 или -1, поэтому каждый раз, когда он обновляется, он неуклонно движется к 0.
Разница в том, что чем ближе градиент к 0, тем меньше он будет становиться, но никогда не достигнет 0.
Подводить итоги,Обычные слова в основном могут стать 0 после определенного количества шагов, и
Это почти невозможно, потому что его градиент также будет меньше, когда значение маленькое. Так это вызвало
Выходные данные разрежены и не могут использоваться для снижения веса.
L3 норма
В самом деле, о норме более высоких измерений мы также можем иметь,
Что касается этого вопроса, я пока думал только о том, что на математическом уровне должна быть возможность добиться уменьшения веса за счет множественных производных, но из-за соотношения количества вычисленийЭто того не стоит, потому что он большой, и кажется, что физические объяснения сложны за пределами трехмерного пространства.
Для более подробного обсуждения см. здесь:
Why do we only see L1 and L2 regularization but not other norms?
-
Понимать применение нормы L1, L2 в машинном обучении.↩︎