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
. В результате в процессе