Как нейронные сети изучают функции, а не запоминают их? - PullRequest
0 голосов
/ 10 мая 2018

Для проекта класса я спроектировал нейронную сеть, чтобы приблизить sin (x), но в итоге получил NN, который просто запомнил мою функцию по точкам данных, которые я ей дал. Мой NN принял значения x с размером пакета 200. Каждое значение x было умножено на 200 различных весов, отображая 200 различных нейронов в моем первом слое. Мой первый скрытый слой содержал 200 нейронов, каждый из которых представлял собой линейную комбинацию значений x в пакете. Мой второй скрытый слой также содержал 200 нейронов, и моя функция потерь была вычислена между 200 нейронами в моем втором слое и 200 значениями sin (x), которым был сопоставлен вход.

Проблема в том, что мой NN идеально "аппроксимировал" sin (x) с потерей 0, но я знаю, что он не будет обобщаться на другие точки данных.

Что я сделал не так при проектировании этой нейронной сети, и как я могу избежать запоминания и вместо этого спроектировать свои NN, чтобы «узнать» о шаблонах в моих данных?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

То же самое с любым алгоритмом машинного обучения. У вас есть набор данных, на основе которого вы пытаетесь изучить «функцию» f(x), которая фактически генерирует данные. В реальных наборах данных невозможно получить исходную функцию из данных, и поэтому мы приближаем ее, используя что-то g(x).

Основная цель любого алгоритма машинного обучения - предсказать невидимые данные как можно лучше, используя функцию g(x).

Учитывая набор данных D, вы всегда можете обучить модель, которая будет отлично классифицировать все точки данных (вы можете использовать хэш-карту, чтобы получить 0 ошибок в наборе поездов), но это переобучение или запоминание.

Чтобы избежать таких вещей, вы сами должны убедиться, что модель не запоминает и не запоминает функцию. Есть несколько вещей, которые можно сделать. Я пытаюсь записать их неформально (со ссылками).

Поезд, Валидация, Тест

Если у вас достаточно большой набор данных, используйте Train, Validation, Test split. Разделите набор данных на три части. Обычно 60%, 20% и 20% для обучения, проверки и тестирования, соответственно. (Эти числа могут варьироваться в зависимости от необходимости, также в случае несбалансированных данных проверьте, как получить стратифицированных разделов , которые сохраняют отношения классов в каждом разделении). Далее, забудьте о тестовом разделе, держите его где-нибудь в безопасности, не трогайте его. Ваша модель будет проходить обучение с использованием раздела «Обучение». После того, как вы обучите модель, оцените производительность модели, используя набор проверки. Затем выберите другой набор конфигурации гиперпараметров для вашей модели (например, номер скрытого слоя, алгоритм разветвления, другие параметры и т. Д.), А затем снова обучите модель и проведите оценку на основе набора проверки. Продолжайте делать это для нескольких таких моделей. Затем выберите модель, которая принесла вам лучший результат проверки.

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

После выбора окончательной модели на основе набора проверки. Теперь возьмите тестовый набор, как будто вы только что получили новый набор данных из реальной жизни, который никто никогда не видел. Предсказание модели в этом наборе тестов будет показателем того, насколько хорошо ваша модель «научилась», поскольку сейчас она пытается предсказать точки данных, которые она никогда не видела (прямо или косвенно).

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

Кросс-валидация и начальная выборка

С другой стороны, если ваш набор данных маленький. Вы можете использовать начальную выборку или перекрестную проверку k-кратных значений . Эти идеи похожи. Например, для перекрестной проверки в k-кратном порядке, если k=5, то вы разбиваете набор данных на 5 частей (также будьте осторожны с многослойной выборкой). Назовем детали a,b,c,d,e. Используйте разделы [a,b,c,d] для обучения и получения результатов прогноза только на [e]. Затем используйте разделы [a,b,c,e] и используйте прогнозные оценки только на [d], и продолжайте 5 раз, причем каждый раз вы оставляете один раздел в отдельности и обучаете модель другим 4. После этого возьмите среднее из этих баллы. Это свидетельствует о том, что ваша модель может работать, если она видит новые данные. Это также хорошая практика, чтобы сделать это несколько раз и выполнить в среднем. Например, для небольших наборов данных выполните 10-кратную 10-кратную перекрестную проверку, которая даст довольно стабильную оценку (в зависимости от набора данных), которая будет показывать эффективность прогнозирования.

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

Другие

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

В нейронной сети вы можете использовать Ранняя остановка , чтобы остановить тренировку. Что это делает, так это тренируется в наборе данных Train, но в каждую эпоху он оценивает производительность в наборе данных Validation. Если модель начинает переопределяться с определенной эпохи, то ошибка для набора данных обучения будет продолжать уменьшаться, но ошибка набора данных проверки начнет увеличиваться, указывая на то, что ваша модель переизбирается. На основании этого можно прекратить тренировку.

Большой набор данных из реального мира имеет тенденцию не слишком сильно перегонять (необходима цитата). Кроме того, если в вашей модели слишком много параметров (для множества скрытых элементов и слоев), и если модель неоправданно сложна, она будет иметь тенденцию к переобучению. Модель с меньшим значением pameter никогда не будет соответствовать (хотя может и соответствовать, если параметры слишком малы).

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

Еще одно важное замечание: если вы попытаетесь выполнить перекрестную валидацию Train, Validation, Test или k-fold для данных, сгенерированных набором данных функции sin, то разделение их обычным способом не будет работают, так как в этом случае мы имеем дело с временными рядами, и для этих случаев можно использовать техники , упомянутые здесь

0 голосов
/ 10 мая 2018

Прежде всего, я думаю, что это отличный проект, чтобы приблизить грех (х).Было бы замечательно, если бы вы могли поделиться фрагментом или некоторыми дополнительными деталями, чтобы мы могли точно определить проблему.Тем не менее, я думаю, что проблема в том, что вы перегружаете данные, поэтому вы не можете обобщить их на другие точки данных.

Несколько хитростей, которые могут сработать,

  1. Получить большетренировочные очки
  2. Пройдите регуляризацию
  3. Добавьте набор тестов, чтобы вы знали, что вам подходит или нет.

Имейте в виду, что 0 потеря или 100%Точность на тренировочном наборе не очень хорошая.

...