Содержание статьи
Нейронные сети на Python: обучающая, проверочная и тестовая выборки. Переобучение нейронной сети
Библиотеки для работы с нейронными сетями на Python
Этот метод в применении к глубоким сверточным сетям почти всегда успешно достигает своей цели — ускорить обучение. Более того, он может служить отличным регуляризатором, позволяя не так осмотрительно выбирать темп обучения, мощность регуляризатора и dropout (иногда необходимость в них совсем отпадает). Регуляризация здесь — следствие того факта, что результат работы сети для определенного примера больше не детерминировано (он зависит от всего батча, в рамках которого данный результат получен), что упрощает обобщение [4].
Переобучение возникает, когда модель слишком хорошо приспосабливается к обучающим данным, заучивая их шумы и случайные закономерности, вместо того чтобы выучить общие закономерности. Это может привести к плохой обобщающей способности модели на новые данные.
Одной из важных характеристик алгоритмов машинного обучения является обобщающая способность [1]. Обобщающая способность – это свойство модели отражать исходные данные в требуемые результаты (X -> Y) на всем множестве исходных данных (во всех сценариях, а не только на тренировочных примерах). Величину обобщения оценивают через обратную величину – отклонение или ошибку. Ошибка – это численно выраженная разница между ответом модели и требуемым (реальным) значением. В более общем смысле обобщающая способность – способность модели найти некое соответствие, которое будет описывать неизвестную нам и скрытую взаимосвязь входных и выходных данных. Однако с ней связаны еще два понятия: недообучение и переобучение [1].
Чтобы помочь сети не утратить способности к обобщению при переобучении, вводятся приемы регуляризации: вместо сокращения количества параметров, накладываются ограничения на параметры модели во время обучения, не позволяя нейронам изучать шум обучающих данных [7].
В данной статье мы рассмотрели ключевые концепции работы с нейронными сетями на языке программирования Python, включая работу с обучающими, проверочными и тестовыми выборками, а также методы предотвращения переобучения. Понимание этих концепций поможет вам эффективно создавать и обучать нейронные сети для различных задач.
Где β и γ — параметры батч-нормализации, которым системы можно обучить (их можно оптимизировать методом градиентного спуска на обучающих данных). Это обобщение также означает, что батч-нормализацию может быть полезно применять непосредственно к входным данным нейронной сети [4].
Переобучение или недообучение сети свидетельствует о несоответствии сложности сети характеру зависимостей в данных. Недообучение говорит о том, что сеть недостаточно сложна для воспроизведения зависимостей. Переобучение, напротив, свидетельствует о том, что сеть строит слишком сложную модель.
Батч-нормализация — метод ускорения глубокого обучения, предложенный Ioffe и Szegedy в начале 2015 года, уже процитированный на arXiv 560 раз [3]. Метод решает следующую проблему, препятствующую эффективному обучению нейронных сетей: по мере распространения сигнала по сети, даже если он нормализован на входе, пройдя через внутренние слои, он может сильно исказиться как по математическому ожиданию, так и по дисперсии (данное явление называется внутренним ковариационным сдвигом), что чревато серьезными несоответствиями между градиентами на различных уровнях. Поэтому нам приходится использовать более сильные регуляризаторы, замедляя тем самым темп обучения.
Обучающая, проверочная и тестовая выборки
Нейронные сети – это мощный инструмент машинного обучения, для классификации, регрессии, а также обработки изображений и текстов. Рассмотрим основные концепции обучения нейронных сетей на языке программирования Python, включая работу с обучающими, проверочными и тестовыми выборками, а также проблему переобучения.
Обучение сетей обычно начинается с малых случайных значений весов. Пока значения весов малы по сравнением с характерным масштабом нелинейной функции активации (обычно принимаемом равным единице), вся сеть представляет из себя суперпозицию линейных преобразований, т.е. является также линейным преобразованием с эффективным числом параметров равным числу входов, умноженному на число выходов. По мере возрастания весов и степень нелинейности, а вместе с ней и эффективное число параметров возрастает, пока не сравняется с общим числом весов в сети [6].
Противоположное такому явлению – переобучение. Его суть состоит в том, что вероятность ошибки натренированного алгоритма на объектах Тренировочной выборки оказывается существенно меньше, чем на объектах тестовой. Зачастую переобучение появляется из-за использования слишком сложных моделей, либо наборов данных, в которых вхождения похожи друг на друга.
Недообучение возникает при обучении по прецедентам и характеризуется тем, что алгоритм обучения нейросети не дает удовлетворительно малой средней ошибки на обучающем множестве. Как правило, это явление появляется вследствие использования недостаточно сложных моделей [2].
Батч-нормализация предлагает весьма простое решение данной проблемы: нормализовать входные данные таким образом, чтобы получить нулевое математическое ожидание и единичную дисперсию. Нормализация выполняется перед входом в каждый слой [3]. Это значит, что во время обучения происходит нормализация размеров пакетов примеров, а во время тестирования нормализуется статистика, полученная на основе всего обучающего множества, так как увидеть заранее тестовые данные нет возможности. А именно, вычисляется математическое ожидание и дисперсия для определенного батча (пакета) следующим образом:
Одна интересная особенность нейронных сетей, которую можно заметить, когда они используются для распределения данных на более чем два класса — это то, что при различных начальных условиях обучения им легче дается распределение по одним классам, в то время как другие приходят в замешательство [5]. На примере MNIST можно обнаружить, что отдельно взятая нейронная сеть прекрасно умеет отличать тройки от пятерок, но не учится правильно отделять единицы от семерок, в то время как дела с другой сетью обстоят, наоборот.