ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 22.11.2023
Просмотров: 127
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Резюме
-
Поскольку ошибка обобщения не может быть оценена на основе ошибки обучения, простая минимизация ошибки обучения не обязательно будет означать уменьшение ошибки обобщения. В моделях машинного обучения необходимо соблюдать осторожность, чтобы не допустить переобучения, чтобы свести к минимуму ошибку обобщения. -
Набор проверки может использоваться для выбора модели при условии, что он не используется слишком широко. -
Недообучение означает, что модель не может уменьшить ошибку обучения. Когда ошибка обучения намного ниже, чем ошибка проверки, происходит переобучение. -
Мы должны выбрать подходящую сложную модель и избегать использования недостаточных обучающих выборок.
Упражнения
-
Можете ли вы точно решить задачу полиномиальной регрессии? Подсказка: используйте линейную алгебру. -
Рассмотрим выбор модели для полиномов:
-
Постройте график зависимости потери обучения от сложности модели (степени полинома). Что вы наблюдаете? Какая степень полинома вам нужна, чтобы снизить потери на обучение до 0? -
Постройте тестовые потери в этом случае. -
Создайте тот же график в зависимости от количества данных.
-
Что произойдет, если вы откажетесь от нормализации (1 / i!) Полиномиальных характеристик xi? Можно как-нибудь исправить это? -
Можете ли вы когда-нибудь ожидать увидеть нулевую ошибку обобщения?
Обсуждение (см. https://discuss.d2l.ai/t/96)
-
Снижение веса
Теперь, когда мы охарактеризовали проблему переобучения, мы можем ввести некоторые стандартные методы регуляризации моделей. Напомним, что мы всегда можем уменьшить переобучение, выйдя на улицу и собрав больше данных для обучения. Это может быть дорогостоящим, отнимающим много времени или полностью неподвластным нам, что делает это невозможным в краткосрочной перспективе. На данный момент мы можем предположить, что у нас уже есть столько высококачественных данных, сколько позволяют наши ресурсы, и сосредоточиться на методах регуляризации.
Напомним, что в нашем примере полиномиальной регрессии (раздел 5.4) мы могли ограничить возможности нашей модели, просто настроив степень подобранного полинома. Действительно, ограничение числа функций - популярный метод уменьшения переобучения. Однако простое отбрасывание функций может оказаться слишком грубым инструментом для работы. Придерживаясь примера полиномиальной регрессии, подумайте, что может случиться с многомерными входными данными. Естественные расширения многочленов на многомерные данные называются одночленами, которые представляют собой просто произведения степеней переменных. Степень монома - это сумма степеней. Например, x
21x2 и x3x25 оба являются одночленами степени 3.
Обратите внимание, что количество членов со степенью d быстро увеличивается с увеличением d. Для k переменных количество одночленов степени d (т. е. k многократных d) равно (k -1 + d| k -1). Даже небольшие изменения степени, скажем, от 2 до 3, резко увеличивают сложность нашей модели. Таким образом, нам часто требуется более детальный инструмент для регулировки сложности функций.
-
Нормы и снижение веса
Мы описали как норму L2, так и норму L1, которые являются частными случаями более общей нормы Lp в разделе 2.3.10. Снижение веса (обычно называемое L2-регуляризацией) может быть наиболее широко используемым методом регуляризации параметрических моделей машинного обучения. Этот метод основан на простой интуиции, что среди всех функций f функция f = 0 (присвоение значения 0 всем входам) в некотором смысле является самой простой, и что мы можем измерить сложность функции по ее расстоянию от нуля. Но как точно измерить расстояние между функцией и нулем? Нет однозначного правильного ответа. Фактически, целые разделы математики, включая разделы функционального анализа и теории банаховых пространств, посвящены ответу на этот вопрос.
Простая интерпретация может заключаться в измерении сложности линейной функции f (x) = w⊤x по некоторой норме ее весового вектора, например, ∥w∥2. Наиболее распространенный метод обеспечения небольшого вектора веса - это добавить его норму в качестве штрафного члена к задаче минимизации потерь. Таким образом, мы заменяем нашу первоначальную цель, минимизируя потерю предсказания на обучающих метках, новой целью, минимизируя сумму потерь предсказания и штрафного члена. Теперь, если наш вектор веса становится слишком большим, наш алгоритм обучения может сосредоточиться на минимизации нормы веса ∥w∥2 по сравнению с минимизацией ошибки обучения. Это именно то, что мы хотим. Чтобы проиллюстрировать это в коде, давайте вернемся к нашему предыдущему примеру из раздела 3.1 для линейной регрессии. Там нашу потерю дали
L (w, b) = 1/n Σni = 1 ½ (w⊤x(i) + b - y(i)) 2, (5.5.1)
Напомним, что x (i) - это характеристики, y (i) - метки для всех точек данных i, а (w, b) - параметры веса и смещения соответственно. Чтобы снизить размер весового вектора, мы должны каким-то образом добавить ∥w∥2 к функции потерь, но как модель должна компенсировать стандартные потери для этого нового аддитивного штрафа? На практике мы характеризуем этот компромисс с помощью константы регуляризации λ, неотрицательного гиперпараметра, который мы подбираем с помощью данных проверки:
L (w, b) + λ/2 ∥w∥2. (5.5.2)
При λ = 0 мы восстанавливаем нашу исходную функцию потерь. При λ> 0 мы ограничиваем размер ∥w∥. Мы делим на 2 по соглашению: когда мы берем производную квадратичной функции, 2 и 1/2 сокращаются, гарантируя, что выражение для обновления выглядит красиво и просто. Проницательный читатель может задаться вопросом, почему мы работаем с квадратом нормы, а не со стандартной нормой (то есть с евклидовым расстоянием). Мы делаем это для удобства вычислений. Возводя в квадрат норму L2, мы удаляем квадратный корень, оставляя сумму квадратов каждого компонента вектора весов. Это упрощает вычисление производной штрафа: сумма производных равна производной суммы.
Более того, вы можете спросить, почему мы вообще работаем с нормой L2, а не, скажем, с нормой L1. Фактически, другие варианты верны и популярны в статистике. В то время как L2-регуляризованные линейные модели представляют собой классический алгоритм гребневой регрессии, L1-регуляризованная линейная регрессия является аналогичной фундаментальной моделью в статистике, которая широко известна как регрессия лассо.
Одна из причин для работы с нормой L2 заключается в том, что она накладывает чрезмерный штраф на большие компоненты вектора весов. Это смещает наш алгоритм обучения в сторону моделей, которые равномерно распределяют вес по большему количеству функций. На практике это может сделать их более устойчивыми к ошибке измерения одной переменной. В отличие от этого, штрафы L1 приводят к моделям, которые концентрируют веса на небольшом наборе функций, обнуляя другие веса. Это называется выбором функций, который может быть желательным по другим причинам.
Используя те же обозначения в (3.1.10), мини-пакетные обновления стохастического градиентного спуска для L2-регуляризованной регрессии следуют:
w ← (1 - ηλ) w – η/| B | Σi∈B x(i)(w⊤x(i) + b - y(i)), (5.5.3)
Как и раньше, мы обновляем w в зависимости от того, на сколько наша оценка отличается от наблюдения.
Однако мы также уменьшаем размер w до нуля. Вот почему метод иногда называют «спадом веса»: учитывая только штрафной член, наш алгоритм оптимизации уменьшает вес на каждом этапе обучения. В отличие от выбора функций, снижение веса предлагает нам непрерывный механизм.
В отличие от выбора функций, уменьшение веса предлагает нам непрерывный механизм для регулировки сложности функции. Меньшие значения λ соответствуют менее ограниченному w, тогда как большие значения λ ограничивают w более значительно.
Включаем ли мы соответствующий штраф за смещение b2, может варьироваться в зависимости от реализации и может варьироваться в зависимости от уровня нейронной сети. Часто мы не регулируем член смещения выходного слоя сети.
- 1 2 3 4 5 6 7 8 9
Высокомерная линейная регрессия
Мы можем проиллюстрировать преимущества снижения веса на простом синтетическом примере.
%matplotlib inline
from d2l import mxnet as d2l
from mxnet import autograd, gluon, init, np, npx
from mxnet.gluon import nn
npx.set_np()
Сначала мы генерируем некоторые данные, как и раньше
y = 0.05 +∑di=1 0.01xi + ϵ where ϵ ∼ N (0, 0.012). (5.5.4)
Мы выбираем, чтобы наша метка была линейной функцией наших входных данных, искаженной гауссовым шумом с нулевым средним и стандартным отклонением 0,01. Чтобы эффект переобучения был заметен, мы можем увеличить размерность нашей задачи до d = 200 и работать с небольшой обучающей выборкой, содержащей всего 20 примеров.
n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5
true_w, true_b = np.ones ((num_inputs, 1)) * 0,01, 0,05
train_data = d2l.synthetic_data (true_w, true_b, n_train)
train_iter = d2l.load_array (train_data, batch_size)
test_data = d2l.synthetic_data (true_w, true_b, n_test)
test_iter = d2l.load_array (test_data, batch_size, is_train = False)
-
Реализация с нуля
Далее мы реализуем снижение веса с нуля, просто добавив возведенный в квадрат штраф L2 к исходной целевой функции.
Инициализация параметров модели
Сначала мы определим функцию для случайной инициализации параметров нашей модели.
def init_params():
w = np.random.normal(scale=1, size=(num_inputs, 1))
b = np.zeros(1)
w.attach_grad()
b.attach_grad()
return [w, b]
Определение штрафа L2 Norm
Возможно, самый удобный способ применить это наказание - это уравновесить все термины и резюмируйте их.
def l2_penalty(w):
return (w**2).sum() / 2
Определение цикла обучения
Следующий код соответствует модели на обучающем наборе и оценивает ее на тестовом наборе. Линейная сеть и квадрат потерь не изменились со времени главы 3, поэтому мы просто импортируем их через d2l.linreg и d2l.squared_loss. Единственное изменение - теперь в наш проигрыш входит штраф.
def train(lambd):
w, b = init_params()
net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_loss
num_epochs, lr = 100, 0.003
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:
с autograd.record ():
# Добавлен срок штрафа по норме L2, и
# делает l2_penalty (w) `вектором, длина которого равна`
batch_size`l = loss(net(X), y) + lambd * l2_penalty(w)
l.backward()