Как решить проблему переобучения перцептрона?

vasya

Новичок
#1
Привет,
к сожалению у меня нет математического бэкграунда, нейронные сети просто хобби, поэтому не могу понять загугленное.

Какие методы борьбы с переобучением применимы к простому однослойному перцептрону/нейрону?
То есть куча входов, веса к ним, сумматор и логистическая функция активации. Такая штука легко переобучается, как решают такие проблемы на простейшей модели?
 

vasya

Новичок
#3
Нормальный совет, не сложный :)
Я уже знал про DropOut (но это для многослойных), а вот DropConnect (для весов а не узлов) пропустил. Нужно было догадаться.

Вообще где можно найти/прочитать все подобные актуальные фишки?

Я прочитал книгу Тарика Рашида «Создай свою нейросеть» и имею некоторые простые представления. А потом вдруг узнаю из какой-то статьи что логистическая функция давно не в моде и все использовали ReLU, а пока я не знал об этом она уже вышла из зоны комильфо и сейчас тру это LeakyReLU ))

p.s.--
А дочитав книгу (жаль что этот сайт не обновляется) я запрограммировал градиентный спуск, стал разумнее подходить к скорости и начальным весам - и переобучение уже не проблема. Хотя вероятно регуляризаторы ещё улучшат результат если их добавить.
Так что я бы сам ответил на свой вопрос более грубо - типа, "чувак, переобучение это из-за того что веса слишком сильно увеличиваются, тебе нужно понять что ты делаешь, почему так происходит и делать это лучше".
 
#4
Dropout Вы знаете, скорее всего, в перепеве Абрамовича. Если бы Вы прочитали оригинальную статью Хинтона с соавторами (вернее, было 2 статьи - препринт в Архиве и затем журнальный вариант) - то там увидели бы упоминание применения обнуляющего шума для входов сети.
А обнуляющий или аддитивный шум на входах - это давний классический рецепт борьбы с переобучением, применимый и для однослойных сеток. И будет попроще ДропКоннекта - не требует запоминания вектора-маски для весов.

Ладно, расскажу немного и про другое.
Наиболее универсально - методы регуляризации через штраф абсолютных значений весов синапсов (weight decay). Тоже попроще Дропконнекта в реализации.
Если много (или ОЧЕНЬ много) примеров - то бэггинг или бустинг, т.е. способы построения коллектива моделей и усреднения их ответов.
Из почти никогда никем не применявшегося - flat minima search. Методы более явного отрезания избыточных входов и синапсов - раньше применялись, теперь (для глубоких нейросеток) тоже уже практически нет. Поэтому, видимо, сюда даже ради самообразовательных целей лезть не стоит (ну или стоит ограничиться только пониманием идеи - но затем в программирование не лезть).

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