Использование техники глубокого обучения для борьбы с переобучением простой модели линейной регрессии.

Я тестировал пример с сайта scikit-learn, который демонстрирует проблемы недостаточного и переобучения, а также то, как мы можем использовать линейную регрессию с полиномиальными функциями для аппроксимации нелинейных функций, согласно статье. Ниже представлена ​​измененная версия этого кода.

Degree:  1  Coefficients:  [-1.60931179]
Degree:  4  Coefficients:  [  0.46754142 -17.78954475  23.5926603   -7.26289872]
Degree:  15  Coefficients:  [-2.98294669e+03  1.03899932e+05 -1.87417069e+06  2.03717225e+07
 -1.44873987e+08  7.09318780e+08 -2.47066977e+09  6.24564048e+09
 -1.15677067e+10  1.56895696e+10 -1.54006776e+10  1.06457788e+10
 -4.91379977e+09  1.35920330e+09 -1.70381654e+08]

Этот код был предназначен для демонстрации того, что модель не подходит, если мы выберем полиномиальную модель степени 1 (то есть линейную функцию), будет хорошо соответствовать полиномиальной модели степени 4 и будет лучше соответствовать полиномиальной модели степени 15. Это хорошо видно на графиках выше. Кривая, предсказанная последней моделью, не является гладкой, и, хотя она очень хорошо соответствует данным обучения, она не соответствует данным теста. Если вы посмотрите на коэффициенты (напечатанные выше), вы увидите, что они очень большие, что также указывает на переоснащение модели.

Что мне показалось странным, так это то, что когда я повторно реализовал алгоритм в TensorFlow, у меня не было переобучения для степени 15, но кривая была почти идентична кривой для полинома 4 степени. Тогда я подумал, что это действительно имеет смысл. Принцип работы scikit-learn заключается в том, что если я не укажу решатель явно, для небольших наборов данных система не будет использовать итерационные алгоритмы оптимизации, а вместо этого выберет решение в закрытой форме:

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

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

Precision:  0.001  Coefficients:  [-1.39643577 -6.11889248  0.28314865  3.86307571  4.14759799  2.67764034
  0.72228739 -0.97903546 -2.08818249 -2.51091926 -2.28201919 -1.4942374
 -0.25855014  1.31619122  3.13246963]
Iterations:  [5]
Precision:  1e-05  Coefficients:  [-1.93501535 -3.88730173 -1.9530687   2.53485144  4.69825473  4.11597739
  2.03932122 -0.33779526 -2.27218909 -3.39309999 -3.55644046 -2.73960954
 -0.98212465  1.64432236  5.05061194]
Iterations:  [8]
Precision:  1e-07  Coefficients:  [    3.3793661    -85.44850536   486.98966891 -1252.45510959
  1066.77967223   661.60279476  -716.29325314  -938.97967844
   -80.15991922   781.02879244   852.50582781   108.82090525
  -809.84249688  -913.13924961   834.71764111]
Iterations:  [20]
Precision:  1e-11  Coefficients:  [-5.31511710e+01  1.20818460e+03 -1.26725939e+04  6.79389251e+04
 -1.98651349e+05  3.02119011e+05 -1.53189889e+05 -1.57101976e+05
  1.60948956e+05  1.20392494e+05 -1.32735137e+05 -9.65907000e+04
  1.28854048e+05 -2.22026449e+04 -8.26616085e+03]
Iterations:  [47]

Из этого вы можете видеть, что для точности по умолчанию, равной 0,001, модель выполняет всего 5 итераций до достижения желаемой точности. Кроме того, все коэффициенты находятся в разумном диапазоне, и модель дает кривую, почти идентичную истинной функции. По мере того, как мы увеличиваем наши требования к точности, мы видим, что количество итераций растет, и модель начинает переобучаться. Тем не менее, он не так сильно переоснащен, как в случае закрытого решения.

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

Вывод

Ранняя остановка - это хорошо известный метод регуляризации для глубокого обучения. Здесь мы продемонстрировали его полезность для простого случая полиномиальной регрессии.