Как сделать сложные нейронные сети без переобучения!

Введение

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

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

Однако как выбрать количество нейронов для этой нейронной сети?

Определение количества нейронов

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

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

Это можно увидеть на изображении ниже:

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

Одна формула, которую я обнаружил во время исследования этой проблемы:

N_h - количество нейронов, N_s - количество обучающих выборок, N_i - количество входных нейронов, N_o - количество выходных нейронов, а альфа - гиперпараметр, который нужно выбрать.

Степень свободы в наборе данных составляет N_s (N_i + N_o), и цель состоит в том, чтобы ограничить количество свободных параметров в вашей модели небольшой долей степеней свободы в ваших данных. Если ваши данные являются хорошим представлением, это должно позволить модели хорошо обобщать слишком много параметров, и это означает, что модель может переобучать на обучающий набор.

Альфа показывает, на сколько больше степеней свободы у ваших данных по сравнению с вашей моделью. При alpha = 2 в ваших данных будет вдвое больше степеней свободы, чем в вашей модели. Рекомендуется значение альфа 2–10, и вы можете просмотреть его в цикле, чтобы найти оптимальное значение альфа.

Один из методов, который помог мне интуитивно понять формулу, заключался в том, чтобы разрешить beta = 1 / alpha (сохраняя альфа от 2 до 10), а затем увеличить beta представляет возрастающую сложность. Для более нелинейной задачи потребуется более крупная бета.

Основное правило - сохранять альфа ≥ 1, поскольку это означает, что степени свободы модели никогда не превышают степени свободы в наборе данных.

Пример

Примером является Jupyter Notebook, в котором сравниваются рекомендации Джеффа Хитона при выборе количества нейронов в слое. Я выбрал этот совет, поскольку новички, скорее всего, последуют совету Джеффа Хитона из-за его важности в этой области.

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

Совет Джеффа Хитона:

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

2. Количество скрытых нейронов должно составлять 2/3 размера входного слоя плюс размер выходного слоя.

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

использованная литература

[1] Ссылка на формулу из StackExchange https://stats.stackexchange.com/questions/181/how-to-choose-the-number-of-hidden-layers-and-nodes -в-прямой-нейронной-сети

[2] Джеффа Хитона. Количество скрытых слоев. Исследования Хитон. https://www.heatonresearch.com/2017/06/01/hidden-layers.html

[3] Джереми Ховард и Сильвен Гуггер. fastai: многоуровневый API для глубокого обучения. arXiv. arXiv: 2002.04688 https://arxiv.org/abs/2002.04688. 2020.