Глава 8. Недообучение, переобучение и универсальный процесс ML
327
Рис. 8.4.
Кривые потерь двух различных моделей на основе MLP для задачи предсказания
температуры. Блок A: от модели MLP без какой-либо регуляризации. Блок Б: от модели MLP
с теми же размерами и количеством слоев, что и модель в блоке A, но с L2-регуляризацией
ядер плотных слоев. Обратите внимание, что диапазоны значений по оси Y слегка отличаются
в двух графиках
Потери на обучающем наборе данных ниже более чем в четыре раза относитель
но предыдущего результата изза больших возможностей нашего MLP по сравне
нию с моделью линейной регрессии, что достигается благодаря дополнительному
слою и в несколько раз большему числу весовых параметров. Впрочем, есть у воз
росших возможностей модели и побочный эффект: модель оказывается подогнана
к обучающим данным намного лучше, чем к проверочным (данным, которые мо
дель не видела во время обучения). Это пример
переобучения
(overfitting), когда
модель «уделяет слишком много внимания» несущественным деталям обучающих
данных — до такой степени, что ее предсказания плохо обобщаются на не виденные
ею данные.
328
Часть III • Продвинутые возможности глубокого обучения с TensorFlow.js
8.2.3. Сокращаем переобучение за счет регуляризации
весов и визуализируем эффект от нее
В главе 4 мы сокращали переобучение сверточной сети за счет добавления в мо
дель слоев дропаута. Здесь мы рассмотрим еще один часто используемый подход
к снижению переобучения: регуляризацию весовых коэффициентов. Если выбрать
в UI демонстрации Jenaweather тип модели
MLP with L2 Regularization
(Многослойный
перцептрон с L2регуляризацией), то в коде будет создан MLP с помощью вызова
buildMLPModel()
(листинг 8.3):
model = buildMLPModel(inputShape, tf.regularizers.l2());
Второй аргумент — возвращаемое функцией
tf.regularizers.l2()
значение —
представляет собой
L2-регуляризатор
. Соотнеся вышеприведенный код с функцией
buildMLPModel()
в листинге 8.3, вы увидите, что L2регуляризатор попадает в параметр
kernelRegularizer
конфигурации скрытого плотного слоя, в результате чего при
меняется к ядру этого плотного слоя. А когда к весу (например, ядра плотного слоя)
применяется регуляризатор, говорят, что он
регуляризован
. Аналогично, когда часть
или все веса модели регуляризованы, говорят, что регуляризована модель в целом.
Так что же делает регуляризатор с ядром плотного слоя и MLP в целом? Он до
бавляет к функции потерь дополнительный член. Функция потерь нерегуляризован
ного MLP вычисляется просто как MAE между целями и предсказаниями модели.
В псевдокоде это можно выразить следующим образом:
loss = meanAbsoluteError(targets, predictions)
При регуляризации весов функция потерь модели включает дополнительный
член. В псевдокоде:
loss = meanAbsoluteError(targets, prediciton) + 12Rate * 12(kernel)
12Rate
*
12(kernel)
представляет собой дополнительный член L2регуляризации
функции потерь. В отличие от MAE этот член
не
зависит от предсказаний модели,
а только от регуляризуемого ядра (весового коэффициента) слоя. Для заданного
ядра он выдает число, связанное лишь со значениями этого ядра. Это число можно
рассматривать как меру нежелательности текущего значения ядра.
Теперь рассмотрим подробное описание функции L2регуляризации:
l2(kernel)
.
Она вычисляет сумму квадратов всех значений весовых коэффициентов. Например,
если ради простоты форма нашего ядра невелика:
[2,
2]
, а его значения —
[[0.1,
0.2],
[-0.3,
-0.4]]
, то:
l2(kernel) = 0.1^2 + 0.2^2 + (-0.3)^2 + (-0.4)^2 = 0.3
Следовательно, функция
l2(kernel)
всегда возвращает положительное число,
делающее невыгодными большие значения весов в
kernel
. Этот член при включении
его в общие потери поощряет меньшие по модулю значения элементов
kernel
при
прочих равных условиях.
Теперь общие потери включают два различных члена: расхождение цели с пред
сказанием и член, отражающий величину значений
kernel
. В результате в процессе
Do'stlaringiz bilan baham: |