Понимание роли нормы L2 в снижении веса

глубокое обучение
最近在学习李沐博士的Gluon-tutorial中关于L2范数正则化能够有效的抑制deep learning过拟合的问题,在  
discuss区看到有人讨论多维范数的相关问题,经过一番推理研究与查阅资料现整理成本文。

переоснащение,L_2Определение нормы и снижения веса

Проще говоря, явление, когда ошибка обучения модели намного меньше, чем ее ошибка на тестовом наборе данных, называется переоснащением.Это может происходить по разным причинам.Здесь мы ориентируемся на два фактора: сложность модели и степень обучения. размер набора данных.
Вообще говоря, учитывая набор обучающих данных, если сложность модели слишком низкая, ее легко переобучить; если сложность модели слишком высока, ее легко переобучить; размер набора обучающих данных, если набор обучающих данных. Переобучение более вероятно, когда количество выборок слишком мало, особенно когда количество параметров модели (в элементах) невелико.
Давайте воспользуемся простым примером, чтобы интуитивно почувствовать это: очевидно, что использование линейной функции для подбора полиномиальной функции третьего порядка приведет к недостаточному обучению, а использование слишком маленьких обучающих выборок приведет к переобучению.
Верхняя картинка не подходит, нижняя картинка переоснащается

Распад веса является распространенным решением проблемы переобучения, иРаспад веса эквивалентенL_2регуляризация нормы

Это вопрос, который мы хотим обсудить в этой статье.Раз можно использовать норму L2, могут ли нормы L1 и нормы L3 быть приемлемыми?

Если вы не знаете нормы, то рекомендуем посмотреть здесь

Как объяснить «норму» доступным для понимания способом?

Давайте сначала представим обычный проходL_2Регуляризация норм для подавления переобучения.
Во-первых,L_2Регуляризация нормы относится к добавлению на основе исходной функции потерь модели.L_2Нормативный штрафной срок, чтобы получить функцию, которую необходимо минимизировать для обучения.L_2Штраф за норму относится к произведению суммы квадратов каждого элемента весового параметра модели и положительной константы. как функция потерь в линейной регрессии

ℓ(w1,w2,b)= \frac{1}{n}\sum_{i=1}^n\frac{1}{2}(x_1^{(i)}w_1+x_2^{(i)}w_2+b-y^{(i)})^2

Например, гдеw_1,w_2весовой параметр,bпараметр смещения, выборкаiВходx_1^{(i)},x_2^{(i)}, помеченный какy^{(i)}, объем выборкиn. использовать параметр веса в качестве вектораw=[w1,w2] означает, чтоL_2Новая функция потерь для штрафного срока по норме имеет вид

ℓ(w1,w2,b)+\frac{2}{λ}||w||^2,

где гиперпараметрыλ>0. Когда все весовые параметры равны 0, штрафной срок наименьший. когдаλКогда он больше, штрафной член имеет больший вес в функции потерь, что обычно приближает элементы изученного весового параметра к 0. когдаλПри значении 0 срок штрафа вообще не действует. В приведенной выше формулеL_2норма в квадрате||w||^2получить после открытияw_1^2+w_2^2. имеютL_2После нормы штрафа в мини-пакетном стохастическом градиентном спуске мы помещаем веса в линейную регрессиюw_1иw_2Метод итерации меняется на

(1-ηλ)w_1-\frac{η}{|B|}\sum_{i\in B}x_1^{(i)}(x_1^{(i)}w_1+x_2^{(i)}w_2+b-y^{(i)})\to  w_1  ,
(1-ηλ)w_2-\frac{η}{|B|}\sum_{i\in B}x_2^{(i)}(x_1^{(i)}w_1+x_2^{(i)}w_2+b-y^{(i)})\to  w_2  .

видимый,L_2веса порядка регуляризации нормыw_1иw_2Сначала умножьте число меньше 1, а затем вычтите градиент без штрафа.следовательно,L_2Регуляризация нормы, также известная как снижение веса. Уменьшение веса добавляет к модели ограничения, которые необходимо изучить, путем штрафования параметров модели большими абсолютными значениями, что может быть эффективным против переобучения. В практических сценариях мы иногда добавляем сумму квадратов элементов отклонения к штрафному члену.

Фактический эффект снижения веса

Поняв принцип, мы используем параметр затухания веса weight_decay, который поставляется с Gluon для тестирования.Прототипом является функция линейной регрессии Гаусса.

y=0.05+\sum_{i=1}^p0.01x_i+ε,

Член шума ϵ подчиняется нормальному распределению со средним значением 0 и стандартным отклонением 0,01. Чтобы легче наблюдать переоснащение, мы рассматриваем многомерную задачу линейной регрессии, такую ​​как задание размерностиp=200; В то же время мы намеренно установили небольшое количество выборок в обучающем наборе данных, например 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 для весов и смещений отдельно, чтобы учитывались только веса.wзатухание.

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)
Обратите внимание, что уменьшение веса в это время составляет0

Используйте снижение веса

fit_and_plot_gluon(10)

в заключении

До сих пор мы обнаружили, что разницу между w и w действительно можно уменьшить, установив параметр wd.L_2Норма обеспечивает затухающий эффект на вес, в данном примере это конкретно

w=w-lr*grad-wd*w

Последующее тестирование нормы L1 и нормы L3

L1 норма

прежде всегоL_1Одна из самых важных функций _norm, вывод разреженный, он напрямую устанавливает неважные функции в ноль иL_2_норм нет.[1]

Это можно непосредственно вывести из частных производных регулярных членов L1 и L2,

\frac{dL_1(w)}{dw}=sign(w)
\frac{dL_2(w)}{dw}=w

Таким образом, будет обнаружено, что при обновлении градиента, независимо отL_1Каков размер (если он не равен 0) градиента 1 или -1, поэтому каждый раз, когда он обновляется, он неуклонно движется к 0.L_2Разница в том, что чем ближе градиент к 0, тем меньше он будет становиться, но никогда не достигнет 0.
Подводить итоги,L_1Обычные слова в основном могут стать 0 после определенного количества шагов, иL_2Это почти невозможно, потому что его градиент также будет меньше, когда значение маленькое. Так это вызвалоL_1Выходные данные разрежены и не могут использоваться для снижения веса.

L3 норма

В самом деле, о норме более высоких измерений мы также можем иметьL_∞,

||x||_∞=\sqrt[∞]{\sum_{i}x_i^∞}

Что касается этого вопроса, я пока думал только о том, что на математическом уровне должна быть возможность добиться уменьшения веса за счет множественных производных, но из-за соотношения количества вычисленийL_2Это того не стоит, потому что он большой, и кажется, что физические объяснения сложны за пределами трехмерного пространства. Для более подробного обсуждения см. здесь:

Why do we only see L1 and L2 regularization but not other norms?


  1. Понимать применение нормы L1, L2 в машинном обучении.↩︎