В чем причина очень высоких различий в точности значений для нескольких прогонов модели?

У меня есть двухслойная нейронная сеть, которую я обучаю примерно 10000 функциям (геномным данным) с примерно 100 образцами в моем наборе данных. Теперь я понял, что каждый раз, когда я запускаю свою модель (т.е. компилирую и подбираю), я получаю различную точность проверки/тестирования, даже если я оставляю разделение обучения/тестирования/проверки нетронутым. Иногда около 70%, иногда около 90%.

Из-за стохастической природы НС я ожидаю некоторых изменений, но могут ли эти сильные колебания быть признаком чего-то еще?


person Mortina    schedule 26.10.2020    source источник
comment
Меняется ли это поведение, когда вы пробуете разные оптимизаторы?   -  person MichaelJanz    schedule 26.10.2020
comment
На сколько эпох вы обучаете свою модель? Если только для некоторых, дисперсия, которую вы можете увидеть, может быть связана со случайной инициализацией. Другой кандидат — скорость обучения вашего оптимизатора. 100 выборок — это очень мало для нейронной сети с десятками тысяч параметров. Поэтому вам, вероятно, нужно запустить его примерно на 500 эпох с относительно высокой скоростью обучения (например, 1e-2 или около того), чтобы увидеть согласованность между запусками.   -  person Addy    schedule 26.10.2020
comment
@MichaelJanz Как именно оптимизатор может повлиять на изменение val acc? Я пробовал несколько разных оптимизаторов, но не нашел разницы. Валидация acc колеблется как минимум на +/-8.   -  person Mortina    schedule 26.10.2020
comment
@Addy В зависимости от скорости обучения я пробовал разные числа в эпохи, чтобы точность обучения не повышалась до 100%. Меньше с высокой скоростью обучения, наоборот. У меня также были прогоны с 50 эпохами, но все же наблюдались колебания. Если я попробую 500 с высокой скоростью обучения, не сильно ли я переобучу нейронную сеть? Или что вы имеете в виду?   -  person Mortina    schedule 26.10.2020
comment
Можете ли вы поделиться размерами наборов данных для обучения/проверки/тестирования? Каков размер ваших слоев (я полагаю, это плотные слои) и ваш вывод? Кроме того, вы достигаете постоянной точности поезда?   -  person Addy    schedule 26.10.2020
comment
Train/val/test 64/17/21, у меня есть обычная последовательная NN с 2 плотными слоями по 12 нейронов в каждом и выходом бинарной классификации. Точность обучения всегда достигает значений от 98 до 100%.   -  person Mortina    schedule 26.10.2020


Ответы (1)


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

Даже имея всего 12 нейронов на слой, у вас все еще есть 12 * 10000 + 12 = 120012 параметров в первом слое. Теперь подумайте о том, что нейронная сеть делает под капотом. Он принимает ваши 10000 входных данных, умножает каждый вход на некоторый вес, а затем суммирует все эти входные данные. Теперь вы предоставляете ему только 64 обучающих примера, на которых алгоритм обучения должен решать, каковы правильные входные веса. Просто исходя из интуиции, с чисто комбинаторной точки зрения будет большое количество весовых заданий, которые хорошо работают на ваших 64 тренировочных выборках. И у вас нет гарантии, что алгоритм обучения выберет такое назначение весов, которое также будет хорошо работать с вашими данными вне выборки.

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

Другими словами, то, что вы видите, является переоснащением. В NN общее эмпирическое правило заключается в том, что вам нужно по крайней мере в несколько раз больше выборок, чем у вас есть параметров (посмотрите на неравенство Хёффдинга для теоретического обоснования этого), и, по сути, чем больше у вас выборок, тем меньше у вас будет. опасаюсь переоснащения.

Итак, вот несколько возможных решений:

  1. Используйте алгоритм, который больше подходит для случая, когда у вас большая входная размерность и небольшое количество выборок, например Kernel SVM (машина опорных векторов). При таком малом количестве выборок вполне возможно, что алгоритм Kernel SVM обеспечит лучшую и более стабильную точность проверки. (Вы можете легко проверить это, они доступны в пакете scikit-learn, очень просты в использовании)

  2. Если вы настаиваете на использовании NN — используйте регуляризацию. Учитывая тот факт, что у вас уже есть рабочий код, это будет легко, просто добавьте kernel_regularizer ко всем вашим слоям, я бы попробовал регуляризацию L1 и L2 (возможно, по отдельности). Регуляризация L1 имеет тенденцию сбрасывать веса до нуля, поэтому это может помочь уменьшить количество параметров в вашей задаче. L2 просто пытается сделать все веса маленькими. Используйте свой проверочный набор, чтобы определить наилучшее значение для каждой регуляризации. Вы можете оптимизировать как для наилучшей средней точности, так и для наименьшей дисперсии точности ваших проверочных данных (выполните что-то вроде 20 тренировочных прогонов для каждого значения параметра регуляризации L1 и L2, обычно достаточно просто попробовать разные порядки величины, например 1e- 4, 1д-3, 1д-2, 1д-1, 1, 1д1).

  3. Если большинство ваших входных признаков на самом деле не являются прогнозирующими или если они сильно коррелированы, PCA (анализ основных компонентов) можно использовать для проецирования ваших входных данных в гораздо более низкое размерное пространство (например, от 10000 до 20), где у вас было бы много меньшая нейронная сеть (тем не менее я бы использовал L1 или L2 для регуляризации, потому что даже тогда у вас будет больше весов, чем у обучающих выборок)

И последнее замечание: смысл набора для тестирования заключается в том, чтобы использовать его очень редко (в идеале только один раз). Это должен быть окончательный отчетный показатель после того, как все ваши исследования и настройка модели завершены. Вы не должны оптимизировать какие-либо значения на нем. Вы должны сделать все это на своем наборе проверки. Чтобы избежать переобучения в вашем наборе проверки, изучите перекрестную проверку в k-кратном порядке.

person Addy    schedule 26.10.2020
comment
качественный ответ здесь - person MichaelJanz; 27.10.2020
comment
Большое спасибо за ваш подробный ответ и объяснение! Мне действительно нужен NN. К сожалению, я уже пробовал PCA и получил худшую точность обучения без изменения вариаций точности проверки. Только что попробовал регуляризацию, но это также не принесло никаких реальных улучшений. Когда я выполняю k-кратную перекрестную проверку, чтобы избежать переобучения данных val, я заметил, что точность валидации в первом сгибе всегда намного ниже (например, 30% по сравнению со средним значением 85% или даже хуже). Может у вас есть идея, из-за чего это может быть? - person Mortina; 27.10.2020
comment
Это потому, что у вас очень мало данных в каждом разделении, я ожидаю увидеть такие дикие различия в точности проверки, так что все в порядке. Когда вы говорите, что пробовали регуляризацию, и она не помогла, что вы имеете в виду? Что именно вы пробовали? Я бы увеличивал константы регуляризации в основном до тех пор, пока не увидел бы одинаковую точность при обучении и при проверке данных. Пока вы видите 100% в своем тренировочном наборе, вы можете быть уверены, что вы переоснащаетесь (если данные являются данными реального мира, а не синтетическими). - person Addy; 27.10.2020
comment
На самом деле была проблема с тем, что мои данные не перетасовывались. Но я все еще вижу довольно большие вариации. С 20-кратной перекрестной проверкой я получаю среднюю точность проверки по всем сгибам 81% +/- 17% для базовой модели. Я пробовал l1 и l2 для штрафов от 1 до 0,00001 и даже пробовал комбинировать l2 со слоями отсева, но я получаю либо аналогичную, либо худшую точность проверки. Колебания/отклонение от +/-11% до +/-22%. С колебаниями +/- dev даже между несколькими запусками перекрестной проверки одной и той же конфигурации параметров. - person Mortina; 27.10.2020
comment
Как я уже сказал, вариации, которые вы видите, соответствуют количеству образцов, я ожидал такого результата. Под 20 прогонами я имел в виду не 20-кратный CV, а скорее, например. 4-кратное CV выполнить 20 раз. 20-кратное CV неразумно, потому что если у вас есть 81 обучающая выборка, это будет означать, что у вас есть 2 выборки в каждом разделении проверки, это слишком мало. Просто подумайте на секунду, что вы на самом деле измеряете и на каком количестве выборок, конечно, метрики будут зашумлены. Можете ли вы сообщить размер пакета, количество эпох, оптимизатор и скорость обучения? На самом деле вы можете опубликовать свой сценарий обучения? - person Addy; 27.10.2020