Поздравляем, вы создали нейронную сеть! Теперь вы можете обучить его и использовать для классификации вещей. Если вы использовали популярный курс, вы, вероятно, сделали курс, который классифицирует написанные от руки цифры как числа, возможно, вы сделали курс, который определяет, является ли изображение кошкой или собакой, действительно полезный материал. Вы, вероятно, даже добавили некоторые дополнительные вещи, чтобы помочь ему лучше обучаться, возможно, нормализацию или перетасовку данных, возможно, улучшения в градиентном спуске, но это не то, о чем мы будем говорить здесь, потому что это может не помочь вам в достижении целей. ваша сеть. Но это и есть цель, тренироваться быстрее или с меньшими ошибками? все эти вещи помогают этому, да, но они уменьшают тренировочную ошибку. Уменьшение ошибки обучения — это хорошо, но только до тех пор, пока оно также уменьшает ошибку при запуске сети на новых данных.

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

В этот момент ваша сеть обучена, и вы можете использовать ее на реальных данных. Но насколько хорошо он справляется с реальными данными? Хорошо, если у вас есть больше данных, которые предварительно помечены, вы можете использовать их в качестве данных проверки, они будут похожи на набор обучающих данных, просто новый для сети. Предоставьте сети свои данные проверки, и она будет давать прогнозы, и, поскольку они помечены, вы можете рассчитать ошибку. Это ошибка проверки. Это то, что мы действительно хотим свести к минимуму: ошибку, которую сеть допускает при прогнозировании данных, которых она никогда раньше не видела. Часто, даже когда ошибка обучения действительно мала, ошибка проверки на практике может быть намного выше. Это несоответствие может быть вызвано переоснащением большой проблемы в нейронных сетях, которую необходимо решить.

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

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

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

Итак, ваша сеть переоснащена, вы получаете больше ошибок, чем хотите, как вы можете уменьшить это? Мы рассмотрим несколько разных методов, каждый из которых имеет свои плюсы и минусы, но каждый из них поможет вашей модели лучше прогнозировать. Самый простой способ, как правило, не вариант, это увеличить ваш тренировочный набор. Получите больше изображений помеченных данных. Это определенно может помочь устранить проблемы, возникающие из-за переобучения, но обычно это невозможно. Если у вас нет готовых фотографий, получить их может быть сложно или дорого, особенно если их еще нет. Поэтому мы действительно хотим сосредоточиться на том, что мы можем сделать, просто изменив нашу модель.

Что ж, если мы не можем получить больше данных, мы можем притвориться. Простым методом имитации большего количества данных является аугментация данных. Увеличение данных выполняется путем добавления к вашим данным большего количества точек, но вместо получения целых новых точек данных просто манипулируйте данными обучения, которые вы уже используете. Например, вы можете умножить размер вашего набора на четыре, если включите копии каждого изображения, повернутые на 90 градусов. Это, очевидно, не так хорошо, если у вас есть новые данные, но это помогает уменьшить влияние шума в данных, что на практике уменьшает перенастройку. Другими вариантами увеличения данных могут быть изменение масштаба изображения или перемещение изображения влево или вправо в пределах кадра. Есть много других вариантов в зависимости от данных, но это зависит от того, что это за данные, поэтому они не всегда хорошо обобщаются. Например, изображение кошки можно отразить как увеличение, но если вы смотрите на число, то при повороте 6 оно становится 9, что может дать еще худшие результаты, чем без увеличения.

Мы бы предпочли использовать методы, которые можно использовать, не беспокоясь о специфике данных. Для этого мы используем набор методов под названием Rуравнение. «Регуляризация — это метод, который вносит небольшие изменения в алгоритм обучения, чтобы модель лучше обобщала». [1] Существует много типов регуляризации, мы рассмотрим четыре, которые являются общими и полезными для нейронных сетей.

Первые два метода часто группируются вместе, потому что они оба подпадают под категорию снижения веса: Регуляризация L1 и L2. Эти методы корректируют функцию стоимости, которая используется при распространении для корректировки переменных в вашей сети. Основными переменными, которые корректируются при распространении, являются веса и смещения, которые применяются к входящим данным (и затем применяются к каждому слою, если вы используете многослойную сеть). Эти корректировки выполняются путем определения того, насколько далеко они находятся от того места, где вы хотели бы, чтобы они уменьшали ошибку. Эта разница между текущим значением и желаемым значением обычно называется стоимостью (имейте в виду, что иногда используются другие соглашения об именах переменных). Обычный способ расчета стоимости — это просто функция текущих весов и функция активации (что касается активации нейронов, мы не будем сейчас вдаваться в подробности, потому что вам нужно знать, что такое нейрон, чтобы построить нейронную сеть). . Вместо этого для регуляризации L1 и L2, чтобы найти стоимость, мы уменьшаем это значение до нуля, так что в некотором смысле веса «наказываются» [1], и любой отдельный вес будет иметь меньшее влияние на окончательные прогнозы.

для регуляризации L1 используем уравнение

стоимость = (стоимость без регуляризации) + λ/ (2m) * нормализовано (веса)

m — количество используемых точек данных. lambda — это параметр, который мы выбираем, чтобы решить, насколько быстро или медленно мы хотим уменьшать веса, часто около 0,1. Веса являются вектором и поэтому должны быть нормализованы.

Это близко к регуляризации L2, но регуляризация L2 использует квадрат нормализованных весов.

стоимость = (стоимость без регуляризации) + λ/ (2 млн) * нормализованный (вес)²

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

И L1, и L2 являются регуляризациями уменьшения веса. Веса воздействуют на нейроны, но нам не нужно использовать уменьшение веса, вместо этого, если мы хотим, мы можем добиться аналогичного результата, повторно используя только части тренировочного набора в том, что называется Выпадение. Во время каждого шага вместо уменьшения всех весов мы можем случайным образом выбрать некоторые веса без учета этой итерации. Игнорирование или удаление этих весов аналогично удалению нейрона, на который влияет вес, поскольку они умножаются, поэтому, если вы установите его равным 0, он не будет использоваться для этого шага. Причина, по которой это так хорошо работает, заключается в том, что во время обычного обучения без отсева некоторые переменные изменяются в зависимости друг от друга, и это часть того, что может вызвать переобучение. Выброс или шум распространяются на другие переменные и также изменяют их, поэтому модель хуже работает с данными, которые не являются обучающим набором. Но из-за исключения разных случайных переменных во время каждой итерации данные, которые мы хотим исключить, не могут быть включены в другие переменные так же легко, потому что они представлены ненадежно, в то время как данные, которые нам нужны, будут получены из нескольких примеров и, следовательно, будут присутствовать даже при выбывать. На практике отсев полезен и даже проще в реализации, чем уменьшение веса, но поскольку мы отбрасываем переменные на каждой итерации, эффект отбрасывания может быть большим, если у нас нет достаточно большой сети для начала. Во многих случаях отсев используется одновременно с уменьшением веса (обычно L2), что дает большой эффект.

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

Ошибка проверки следует аналогичной схеме, но по мере того, как обучение проходит за идеальный уровень, ошибка проверки может снова возрасти, поскольку модель проходит уровни идеального соответствия и переходит к переобучению. В этом смысле перетренированность является прямой причиной переобучения и, следовательно, плохого обобщения модели. Это обоснование нашего последнего метода регуляризации, метко названного Ранней остановкой. Это именно то, на что это похоже, и, по крайней мере, теоретически это самый простой из методов регуляризации. Прекратите обучение, когда вы больше не подгоняете сеть к полезным данным, а когда сеть начинает подгонять ее к выбросам, шуму, данным переобучения. Это не означает плохие данные, такие как плохой пример, например, рукописная цифра с плохим почерком, а скорее глубокая функция, которой модель придает значение, часто поздно в модели, и поэтому ее очень трудно точно определить для прямого учета. Но поскольку мы знаем, что это обычно происходит на более поздних этапах обучения, мы можем объяснить это, полностью игнорируя это и не тренируясь так много. На практике трудной задачей является решить, когда прекратить тренировку. Многое было исследовано в отношении этого и базовых методов, включающих определение некоторых новых параметров для скорости обучения, и если модель больше не тренируется с этой скоростью (ошибка все еще уменьшается, но слишком медленно), вы можете остановить обучение прямо здесь и сейчас. Затем используйте модель как есть и получите лучшие результаты, чем если бы вы продолжали тренироваться! Мой пример сине-красного графика делает его похожим на простой случай, к сожалению, часто график нелинейный и может быть довольно уродливым, поэтому может быть довольно сложно решить, когда остановиться, потому что слишком рано или поздно, а ошибка все равно остается высокой.

Увеличение данных, регуляризация L1 и L2, отсев и ранняя остановка — все это мощные инструменты, которые работают для достижения одной и той же цели — борьбы с переоснащением и получения более точных данных из нейронной сети. Однако ни один из них не является единственным ответом. Часто несколько используются вместе, и полезно ознакомиться с каждым из них, чтобы получить наилучшие результаты от любой модели. Переобучение — это реальная проблема с нейронными сетями, но проблема, которую можно решить.

Источники:

[1] https://www.analyticsvidhya.com/blog/2018/04/fundamentals-deep-learning-regularization-techniques/

[2] https://en.wikipedia.org/wiki/Переоснащение

[3] https://pgaleone.eu/deep-learning/regularization/2017/01/10/anaysis-of-dropout/