Файл: 5 тарау. Кп абатты перцептрондар.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 22.11.2023

Просмотров: 127

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Резюме

  • Поскольку ошибка обобщения не может быть оценена на основе ошибки обучения, простая минимизация ошибки обучения не обязательно будет означать уменьшение ошибки обобщения. В моделях машинного обучения необходимо соблюдать осторожность, чтобы не допустить переобучения, чтобы свести к минимуму ошибку обобщения.

  • Набор проверки может использоваться для выбора модели при условии, что он не используется слишком широко.

  • Недообучение означает, что модель не может уменьшить ошибку обучения. Когда ошибка обучения намного ниже, чем ошибка проверки, происходит переобучение.

  • Мы должны выбрать подходящую сложную модель и избегать использования недостаточных обучающих выборок.

Упражнения

  1. Можете ли вы точно решить задачу полиномиальной регрессии? Подсказка: используйте линейную алгебру.

  2. Рассмотрим выбор модели для полиномов:

    • Постройте график зависимости потери обучения от сложности модели (степени полинома). Что вы наблюдаете? Какая степень полинома вам нужна, чтобы снизить потери на обучение до 0?

    • Постройте тестовые потери в этом случае.

    • Создайте тот же график в зависимости от количества данных.

  1. Что произойдет, если вы откажетесь от нормализации (1 / i!) Полиномиальных характеристик xi? Можно как-нибудь исправить это?

  2. Можете ли вы когда-нибудь ожидать увидеть нулевую ошибку обобщения?

Обсуждение (см. https://discuss.d2l.ai/t/96)

    1. Снижение веса

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

Напомним, что в нашем примере полиномиальной регрессии (раздел 5.4) мы могли ограничить возможности нашей модели, просто настроив степень подобранного полинома. Действительно, ограничение числа функций - популярный метод уменьшения переобучения. Однако простое отбрасывание функций может оказаться слишком грубым инструментом для работы. Придерживаясь примера полиномиальной регрессии, подумайте, что может случиться с многомерными входными данными. Естественные расширения многочленов на многомерные данные называются одночленами, которые представляют собой просто произведения степеней переменных. Степень монома - это сумма степеней. Например, x
21x2 и x3x25 оба являются одночленами степени 3.

Обратите внимание, что количество членов со степенью d быстро увеличивается с увеличением d. Для k переменных количество одночленов степени d (т. е. k многократных d) равно (k -1 + d| k -1). Даже небольшие изменения степени, скажем, от 2 до 3, резко увеличивают сложность нашей модели. Таким образом, нам часто требуется более детальный инструмент для регулировки сложности функций.

      1. Нормы и снижение веса

Мы описали как норму L2, так и норму L1, которые являются частными случаями более общей нормы Lp в разделе 2.3.10. Снижение веса (обычно называемое L2-регуляризацией) может быть наиболее широко используемым методом регуляризации параметрических моделей машинного обучения. Этот метод основан на простой интуиции, что среди всех функций f функция f = 0 (присвоение значения 0 всем входам) в некотором смысле является самой простой, и что мы можем измерить сложность функции по ее расстоянию от нуля. Но как точно измерить расстояние между функцией и нулем? Нет однозначного правильного ответа. Фактически, целые разделы математики, включая разделы функционального анализа и теории банаховых пространств, посвящены ответу на этот вопрос.

Простая интерпретация может заключаться в измерении сложности линейной функции f (x) = wx по некоторой норме ее весового вектора, например, ∥w∥2. Наиболее распространенный метод обеспечения небольшого вектора веса - это добавить его норму в качестве штрафного члена к задаче минимизации потерь. Таким образом, мы заменяем нашу первоначальную цель, минимизируя потерю предсказания на обучающих метках, новой целью, минимизируя сумму потерь предсказания и штрафного члена. Теперь, если наш вектор веса становится слишком большим, наш алгоритм обучения может сосредоточиться на минимизации нормы веса ∥w∥2 по сравнению с минимизацией ошибки обучения. Это именно то, что мы хотим. Чтобы проиллюстрировать это в коде, давайте вернемся к нашему предыдущему примеру из раздела 3.1 для линейной регрессии. Там нашу потерю дали



L (w, b) = 1/n Σni = 1 ½ (wx(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 | ΣiB x(i)(wx(i) + b - y(i)), (5.5.3)

Как и раньше, мы обновляем w в зависимости от того, на сколько наша оценка отличается от наблюдения.

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

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

Включаем ли мы соответствующий штраф за смещение b2, может варьироваться в зависимости от реализации и может варьироваться в зависимости от уровня нейронной сети. Часто мы не регулируем член смещения выходного слоя сети.
      1. 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)


      1. Реализация с нуля

Далее мы реализуем снижение веса с нуля, просто добавив возведенный в квадрат штраф 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()