Причина, по которой вы видите такую большую нестабильность с точностью проверки, заключается в том, что ваша нейронная сеть огромна по сравнению с данными, на которых вы ее обучаете.
Даже имея всего 12 нейронов на слой, у вас все еще есть 12 * 10000 + 12 = 120012
параметров в первом слое. Теперь подумайте о том, что нейронная сеть делает под капотом. Он принимает ваши 10000 входных данных, умножает каждый вход на некоторый вес, а затем суммирует все эти входные данные. Теперь вы предоставляете ему только 64 обучающих примера, на которых алгоритм обучения должен решать, каковы правильные входные веса. Просто исходя из интуиции, с чисто комбинаторной точки зрения будет большое количество весовых заданий, которые хорошо работают на ваших 64 тренировочных выборках. И у вас нет гарантии, что алгоритм обучения выберет такое назначение весов, которое также будет хорошо работать с вашими данными вне выборки.
Данная нейронная сеть способна представлять самые разнообразные функции (доказано, что при определенных предположениях она может аппроксимировать любую функцию, это называется общим приближением). Чтобы выбрать нужную функцию, вы предоставляете обучающему алгоритму данные, чтобы ограничить пространство всех возможных функций, которые сеть может представлять, подпространством функций, которые соответствуют вашим данным. Однако никоим образом не гарантируется, что такая функция представляет истинную базовую связь между входом и выходом. И особенно, если количество параметров больше, чем количество выборок (в данном случае на несколько порядков), вы почти гарантированно увидите, что ваша сеть просто запоминает выборки в ваших обучающих данных просто потому, что у нее есть возможность сделать это, и вы недостаточно ограничили его.
Другими словами, то, что вы видите, является переоснащением. В NN общее эмпирическое правило заключается в том, что вам нужно по крайней мере в несколько раз больше выборок, чем у вас есть параметров (посмотрите на неравенство Хёффдинга для теоретического обоснования этого), и, по сути, чем больше у вас выборок, тем меньше у вас будет. опасаюсь переоснащения.
Итак, вот несколько возможных решений:
Используйте алгоритм, который больше подходит для случая, когда у вас большая входная размерность и небольшое количество выборок, например Kernel SVM (машина опорных векторов). При таком малом количестве выборок вполне возможно, что алгоритм Kernel SVM обеспечит лучшую и более стабильную точность проверки. (Вы можете легко проверить это, они доступны в пакете scikit-learn, очень просты в использовании)
Если вы настаиваете на использовании NN — используйте регуляризацию. Учитывая тот факт, что у вас уже есть рабочий код, это будет легко, просто добавьте kernel_regularizer ко всем вашим слоям, я бы попробовал регуляризацию L1 и L2 (возможно, по отдельности). Регуляризация L1 имеет тенденцию сбрасывать веса до нуля, поэтому это может помочь уменьшить количество параметров в вашей задаче. L2 просто пытается сделать все веса маленькими. Используйте свой проверочный набор, чтобы определить наилучшее значение для каждой регуляризации. Вы можете оптимизировать как для наилучшей средней точности, так и для наименьшей дисперсии точности ваших проверочных данных (выполните что-то вроде 20 тренировочных прогонов для каждого значения параметра регуляризации L1 и L2, обычно достаточно просто попробовать разные порядки величины, например 1e- 4, 1д-3, 1д-2, 1д-1, 1, 1д1).
Если большинство ваших входных признаков на самом деле не являются прогнозирующими или если они сильно коррелированы, PCA (анализ основных компонентов) можно использовать для проецирования ваших входных данных в гораздо более низкое размерное пространство (например, от 10000 до 20), где у вас было бы много меньшая нейронная сеть (тем не менее я бы использовал L1 или L2 для регуляризации, потому что даже тогда у вас будет больше весов, чем у обучающих выборок)
И последнее замечание: смысл набора для тестирования заключается в том, чтобы использовать его очень редко (в идеале только один раз). Это должен быть окончательный отчетный показатель после того, как все ваши исследования и настройка модели завершены. Вы не должны оптимизировать какие-либо значения на нем. Вы должны сделать все это на своем наборе проверки. Чтобы избежать переобучения в вашем наборе проверки, изучите перекрестную проверку в k-кратном порядке.
person
Addy
schedule
26.10.2020