ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 22.11.2023
Просмотров: 131
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
d2l.sgd([w, b], lr, batch_size)
if (epoch + 1) % 5 == 0:
animator.add(epoch + 1, (d2l.evaluate_loss(net, train_iter, loss),
d2l.evaluate_loss(net, test_iter, loss)))
print('L2 norm of w:', np.linalg.norm(w))
Обучение без регуляризации
Теперь мы запускаем этот код с lambd = 0, отключая снижение веса. Обратите внимание на то, что мы плохо переобучаем, уменьшая ошибку обучения, но не ошибку теста - случай переобучения текстового кода.
train(lambd=0)
L2 norm of w: 13.259391
Использование снижения веса
Ниже мы бежим со значительным снижением веса. Обратите внимание, что ошибка обучения увеличивается, но ошибка теста уменьшается. Это именно тот эффект, который мы ожидаем от регуляризации.
train(lambd=3)
L2 norm of w: 0.382491
Использование снижения веса
Ниже мы бежим со значительным снижением веса. Обратите внимание, что ошибка обучения увеличивается, но ошибка теста уменьшается. Это именно тот эффект, который мы ожидаем от регуляризации.
train(lambd=3)
L2 norm of w: 0.382491
-
Краткая реализация
Поскольку уменьшение веса повсеместно используется при оптимизации нейронных сетей, среда глубокого обучения делает его особенно удобным, интегрируя уменьшение веса в сам алгоритм оптимизации для удобного использования в сочетании с любой функцией потерь. Более того, такая интеграция дает вычислительные преимущества, позволяя уловкам реализации добавлять в алгоритм уменьшение веса без каких-либо дополнительных вычислительных затрат. Поскольку часть обновления, связанная с уменьшением веса, зависит только от текущего значения каждого параметра, оптимизатор в любом случае должен коснуться каждого параметра один раз.
В следующем коде мы указываем гиперпараметр уменьшения веса напрямую через wd при создании экземпляра нашего Trainer. По умолчанию, Gluon уменьшает и веса, и смещения одновременно. Обратите внимание, что гиперпараметр wd будет умножен на wd_mult при обновлении параметров модели. Таким образом, если мы установим wd_mult в ноль, параметр смещения b не будет уменьшаться.
def train_concise(wd):
net = nn.Sequential()
net.add(nn.Dense(1))
net.initialize(init.Normal(sigma=1))
loss = gluon.loss.L2Loss()
num_epochs, lr = 100, 0.003
trainer = gluon.Trainer(net.collect_params(), 'sgd',
{'learning_rate': lr, 'wd': wd})
# The bias parameter has not decayed. Bias names generally end with "bias"
net.collect_params('.*bias').setattr('wd_mult', 0)
animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',
xlim=[5, num_epochs], legend=['train', 'test'])
for epoch in range(num_epochs):
for X, y in train_iter:
with autograd.record():
l = loss(net(X), y)
l.backward()
trainer.step(batch_size)
if (epoch + 1) % 5 == 0:
animator.add(epoch + 1, (d2l.evaluate_loss(net, train_iter, loss),
d2l.evaluate_loss(net, test_iter, loss)))
print('L2 norm of w:', np.linalg.norm(net[0].weight.data()))
До сих пор мы коснулись только одного понятия о том, что составляет простую линейную функцию. Более того, что представляет собой простую нелинейную функцию, может быть еще более сложным вопросом. Например, воспроизведение гильбертова пространства ядра (RKHS) 70 позволяет применять инструменты, представленные для линейных функций в нелинейном контексте. К сожалению, алгоритмы на основе RKHS имеют тенденцию масштабироваться исключительно для больших данных высокой размерности. В этом курсе мы по умолчанию будем использовать простую эвристику применения убывания веса на всех уровнях глубокой сети.
Резюме
-
Регуляризация - распространенный метод борьбы с переобучением. Он добавляет штрафной член к функции потерь на обучающем наборе, чтобы снизить сложность изученной модели. -
Одним из конкретных вариантов сохранения простоты модели является уменьшение веса с использованием штрафа L2. Это приводит к снижению веса на этапах обновления алгоритма обучения. -
Функциональность уменьшения веса предоставляется в оптимизаторах из фреймворков глубокого обучения. -
Различные наборы параметров могут иметь разное поведение обновления в пределах одного цикла обучения.
Упражнения
-
Поэкспериментируйте со значением λ в задаче оценки в этом разделе. Постройте график обучения и точности теста как функцию от λ. Что вы наблюдаете? -
Используйте набор для проверки, чтобы найти оптимальное значение λ. Это действительно оптимальное значение? Это имеет значение? -
Как бы выглядели уравнения обновления, если бы вместо ∥w∥2 мы использовали ∑i |w| как наше наказание выбора (регуляризация L1)? -
Мы знаем, что ∥w∥2 = w⊤w. Можете ли вы найти аналогичное уравнение для матриц (см. норму Фробениуса в разделе 2.3.10)? -
Просмотрите связь между ошибкой обучения и ошибкой обобщения. Помимо снижения веса, усиленных тренировок и использования модели подходящей сложности, какие еще способы вы можете придумать, чтобы справиться с переобучением? -
В байесовской статистике мы используем произведение априорной вероятности и вероятности для получения апостериорной оценки посредством P (w | x) ∝ P (x | w) P (w). Как можно отождествить P (w) с регуляризацией?
Обсуждение (см. https://discuss.d2l.ai/t/98)
-
Отсев
В разделе 5.5 мы представили классический подход к регуляризации статистических моделей, налагая штрафы на L2 норму весов. С вероятностной точки зрения мы могли бы оправдать эту технику, утверждая, что мы исходили из априорного убеждения, что веса принимают значения из гауссовского распределения со средним нулевым. Более интуитивно мы могли бы возразить, что мы поощряли модель распределять ее веса между многими функциями, а не слишком сильно зависеть от небольшого числа потенциально ложных ассоциаций.
-
Возвращение к переоснащению
Столкнувшись с большим количеством функций, чем примеров, линейные модели имеют тенденцию переоснащаться. Но, учитывая больше примеров, чем функций, мы обычно можем рассчитывать на то, что линейные модели не переобучатся. К сожалению, надежность, с которой обобщаются линейные модели, имеет свою цену. Наивно применяемые линейные модели не учитывают взаимодействия между функциями. Для каждой особенности линейная модель должна назначать положительный или отрицательный вес, игнорируя контекст.
В традиционных текстах это фундаментальное противоречие между обобщаемостью и гибкостью описывается как компромисс между смещением и дисперсией. Линейные модели имеют большое смещение: они могут представлять только небольшой класс функций. Однако эти модели имеют низкую дисперсию: они дают аналогичные результаты для разных случайных выборок данных.
Глубокие нейронные сети населяют противоположный конец спектра отклонения-смещения. В отличие от линейных моделей, нейронные сети не ограничиваются рассмотрением каждой функции в отдельности. Они могут изучить взаимодействие между группами функций. Например, они могут сделать вывод, что слова «Нигерия» и «Western Union» вместе в электронном письме указывают на спам, но по отдельности - нет.
Даже когда у нас гораздо больше примеров, чем функций, глубокие нейронные сети способны переобучаться. В 2017 году группа исследователей продемонстрировала чрезвычайную гибкость нейронных сетей, обучив глубокие сети на случайно помеченных изображениях. Несмотря на отсутствие какого-либо истинного паттерна, связывающего входы с выходами, они обнаружили, что нейронная сеть, оптимизированная с помощью стохастического градиентного спуска, может идеально маркировать каждое изображение в обучающем наборе. Подумайте, что это значит. Если метки назначаются равномерно случайным образом и имеется 10 классов, то ни один классификатор не сможет добиться точности выше 10% для удерживаемых данных. Разрыв в обобщении здесь составляет колоссальные 90%.
Если наши модели настолько выразительны, что могут плохо переобучаться, то, когда же нам ожидать, что они не переобучатся?
Математические основы загадочных обобщающих свойств глубоких сетей остаются открытыми вопросами исследования, и мы призываем теоретически ориентированного читателя углубиться в эту тему. А пока мы переходим к исследованию практических инструментов, которые имеют тенденцию эмпирически улучшить обобщение глубоких сетей.
-
Устойчивость к возмущениям
Давайте вкратце подумаем о том, чего мы ожидаем от хорошей прогнозной модели. Мы хотим, чтобы она работала с невидимыми данными. Классическая теория обобщения предполагает, что для сокращения разрыва между производительностью train и тестирования мы должны стремиться к простой модели. Простота может заключаться в небольшом количестве измерений. Мы исследовали это при обсуждении мономиальных базисных функций линейных моделей в разделе 5.4. Кроме того, как мы видели при обсуждении уменьшения веса (L2-регуляризация) в разделе 5.5, (обратная) норма параметров также представляет собой полезную меру простоты.
Еще одно полезное понятие простоты - это гладкость, то есть функция не должна быть чувствительной к небольшим изменениям ее входных данных. Например, когда мы классифицируем изображения, мы ожидаем, что добавление некоторого случайного шума к пикселям должно быть в основном безвредным.
В 1995 году Кристофер Бишоп формализовал эту идею, когда доказал, что обучение с входным шумом эквивалентно регуляризации Тихонова (Bishop, 1995). В этой работе была проведена четкая математическая связь между требованием, чтобы функция была гладкой (и, следовательно, простой), и требованием, чтобы она была устойчивой к возмущениям на входе.
Затем, в 2014 году, Шривастава и др. (Srivastava et al., 2014) разработали умную идею о том, как применить идею Бишопа и к внутренним уровням сети. А именно, они предложили вводить шум в каждый уровень сети перед вычислением следующего слоя во время обучения. Они поняли, что при обучении глубокой сети со многими уровнями введение шума обеспечивает плавность только на отображении ввода-вывода.
Их идея, называемая отсевом, включает в себя введение шума при вычислении каждого внутреннего слоя во время прямого распространения, и это стало стандартной техникой для обучения нейронных сетей. Метод называется dropout, потому что мы буквально выпадаем часть нейронов во время обучения. На протяжении всего обучения на каждой итерации стандартное исключение состоит из обнуления некоторой части узлов в каждом слое перед вычислением следующего слоя.
Чтобы быть ясным, мы навязываем собственное повествование со ссылкой на Бишопа. Оригинальная статья об отсеве из выборки предлагает интуицию через удивительную аналогию с половым воспроизводством. Авторы утверждают, что переобучение нейронной сети характеризуется состоянием, в котором каждый уровень полагается на определенный паттерн активаций на предыдущем уровне, называя это условие коадаптацией. Они утверждают, что отказ от учебы разрушает коадаптацию, так же как, как утверждают, половое размножение разрушает коадаптированные гены.
Таким образом, основная проблема заключается в том, как создать этот шум. Одна из идей состоит в том, чтобы вводить шум беспристрастным образом, чтобы ожидаемое значение каждого слоя - при фиксации других - равнялось значению, которое он принял бы в отсутствие шума.
В работе Бишопа он добавил гауссовский шум к входным данным линейной модели. На каждой итерации обучения он добавлял шум, выбранный из распределения со средним нулем ϵ ∼ N (0, σ2), на вход x, получая возмущенную точку x ′ = x + ϵ. В ожидании E [x'] = х.
При стандартной регуляризации выпадения каждый уровень сглаживается путем нормализации на долю узлов, которые были сохранены (не выпали). Другими словами, с вероятностью выпадения p каждая промежуточная активация h заменяется случайной величиной h ′ следующим образом:
h′ = { 0 with probability p
h/1−p в противном случае (5.6.1)
По построению среднее остается неизменным, т.е., E[h′] = h.
-
Отсев на практике
Вспомните MLP со скрытым слоем и 5 скрытыми блоками на рис. 5.1.1. Когда мы применяем dropout к скрытому слою, обнуляя каждую скрытую единицу с вероятностью p, результат можно рассматривать как сеть, содержащую только подмножество исходных нейронов. На рис. 5.6.1 h2 и h5 удалены. (См. рисунок в книге.)
Следовательно, вычисление выходов больше не зависит от h