«Мы должны добавить некоторую регуляризацию, чтобы избежать переобучения».

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

Интуиция

Проще говоря, переобучение — это «слепое изучение» тренировочных данных. Как видно на рисунке ниже, переобученная модель строго следует границе, разделяющей два класса. Наблюдаются две проблемы:

  • Предлагаемая модель является сильно нелинейной (сложной). В результате вычисление весов становится более дорогим.
  • Нет гарантии, что модель обобщит невидимые данные.

В результате, чтобы избежать этой проблемы, мы добавляем штрафной член к нашей функции стоимости:

Мы знаем, что машинное обучение направлено на минимизацию вышеуказанной функции затрат. Добавляя член регуляризации (λ), мы стремимся минимизировать функцию потерь, а также максимально уменьшить веса. Но почему?

Возьмем пример слоя нейронной сети с функцией активации «tanh».

Оглядываясь назад на функцию штрафных затрат:

Если λ велико, алгоритм оптимизации попытается уменьшить веса w_j, чтобы минимизировать функцию стоимости. Таким образом, w_j приблизится к 0.

Как результат:

z_j=sum(i=1 to n) w_ij*x_i+b_j ближе к 0.

Наблюдая за приведенной выше кривой тангенса, мы ясно понимаем, что тангенс локально линейен для значений, близких к 0.

Таким образом:

tanh(z) ведет себя линейно вокруг z_j.

Следовательно, регуляризация уменьшает нелинейность нашей модели.

Тот же принцип применяется, если мы используем сигмовидные или relu-функции!

Выполнение

Проблема:

классификация набора данных по радужной оболочке.

Модель:

Неглубокая нейронная сеть с 1 скрытым слоем.

Процесс:

1-Установите «mlxtend» и импортируйте необходимые пакеты:

«mlxtend» — очень полезная библиотека Python, которая используется для визуализации границы решения классификатора.

2-Прочитайте и визуализируйте данные:

Набор данных Iris включает 4 функции: sepal_length, sepal_width, лепесток_длина, лепесток_ширина. Целью является тип ириса: Setosa, Virginica или Versicolor.

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

Примечание:

«mlxtend» принимает только классификатор с двумя независимыми переменными. Итак, сначала нам нужно выбрать переменные, которые будут использоваться в качестве характеристик нашей модели.

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

В результате мы выбираем (petal_length, sepal_length) в качестве характеристик.

Трехфункциональная матрица Масштабирование:

Нормализация нашей матрицы 2D-признаков ускоряет сходимость функции стоимости к ее минимальному значению. Я советую вам использовать в вашей модели как немасштабированную матрицу признаков, так и масштабированную матрицу признаков, и вы обязательно заметите разницу ;)

4-целевое кодирование:

Наша целевая переменная является категориальной, состоящей из 3 различных строк «verginica», «setosa», «versicolor». Поэтому очевидно, что эти строки должны быть преобразованы в целочисленные классы.

5 – Разделение данных и выполнение кодирования Onehot:

Данные разделены на обучающие и тестовые данные. Затем мы генерируем два вектора y_train_onehot и y_test_onehot, которые представляют кодировку onehot y_train и y_test соответственно.

6. Создайте модель и подгоните ее под данные Iris:

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

Я делюсь с вами некоторыми правилами/советами по проектированию вашей модели нейронной сети:

  • Количество входных единиц = 2 = количество функций.
  • Количество выходных единиц = 3 = количество классов Iris.
  • Выбор функции активации, начальных весов, значения лямбда, количества нейронов осуществляется методом проб и ошибок.
  • Я использовал класс «CheckPoint» от Keras, чтобы сохранить лучшую модель во время обучения.

Мы наблюдаем результаты, полученные без регуляризации (лямбда=0) и с регуляризацией (лямбда=0,7)

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

7-”mlxtend” для визуализации границ решения:

Чтобы увидеть эффект регуляризации более конкретно, мы используем mlxtend для визуализации границы решения нашего классификатора для обоих случаев (с/без регуляризации).

Отметим, что нерегуляризованная граница решения менее линейна, чем регуляризованная граница решения.

Я рекомендую использовать mlxtend, чтобы лучше объяснить ваш классификатор.

Одним из недостатков является то, что mlxtend может объяснять модели только в пространстве двухмерных объектов. Но обычно мы сталкиваемся с многомерными проблемами, которые трудно визуализировать. Итак, в данном случае, какие инструменты вы мне посоветуете использовать, чтобы повысить объяснимость моей модели? :)

Рекомендации