Лучшая ошибка тестирования!

В детстве мне очень нравилась игра слов скороговорки Пушистый Вуззи был медвежонком… (наверное, слишком). Это задело меня за живое не только потому, что было трудно сказать в пять раз быстрее, но и из-за образа лысого медведя (забавного, когда мне было 7-8 лет) и иронии того, что вы могли бы назвать бесшерстный медведь Пушистый. Точно так же, хотя я уже пару раз обсуждал проблему переобучения и шума в данных, я все еще получаю удовольствие от того, насколько лучше могут быть прогнозы машинного обучения, когда вы вводите в них нечеткость посредством регуляризации. Намеренно ухудшать свои прогнозы при обучении и, как следствие, улучшать производительность полученной модели на тестовых и реальных данных — это просто странно. Я понимаю теорию — так же, как восьмилетний Джейсон понял, что имя не обязательно определяет вас в каком-либо физическом смысле, — но я все еще ценю иронию.

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

Стохастический градиентный спуск

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

Допустим, эта визуализация представляла все наши доступные данные:

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

Как упоминалось в моем первом посте на SGD, быть точным и находить ближайший локальный минимум (т. е. набор значений веса и смещения, которые дают плоскую сумму градиентов…) здесь не является целью. Вы хотите найти набор значений веса и смещения, чтобы потери предсказания оставались относительно стабильными, даже если значения веса и смещения несколько смещаются в том или ином направлении. Вот что значит найти «широкий локальный минимум». Таким образом, SGD достаточно небрежен, поэтому маловероятно, что он будет удовлетворительно сходиться, если найденные значения веса и смещения не останутся точными для разных подмножеств данных в наборах данных.

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

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

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

Более быстрые, менее затратные в вычислительном отношении и более точные прогнозы? Это не намного лучше, чем это!

Распад веса

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

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

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

Выбывать

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

По сути, использование отсева означает, что вы выбираете определенный процент узлов в каждом скрытом слое вашей нейронной сети (скажем, от 10% до 50% — еще один гиперпараметр, с которым вам нужно поэкспериментировать), и вы просто отключаете их. Для этого прямого прохода влияние этих значений веса и смещения на этих этапах просто не учитывается с точки зрения расчета потерь и, следовательно, не влияет на обновления веса в этой итерации. На следующей итерации вы отключаете одно и то же количество узлов на каждом уровне, но выбор узлов каждый раз происходит случайным образом — точно так же, как деревья решений Random Forest в каждой точке разделения. И опять же, конечный результат тот же — нейронная сеть корректирует веса и часто не имеет преимуществ от признаков с сильным сигналом, поэтому должна выяснить, как минимизировать общие потери, уделяя больше внимания более слабым признакам.

Краткое содержание

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

Нечеткие нейронные сети Wuzzy
Ошибки при тестировании становятся лучше!
Если ошибка нечетких моделей низкая
Нечеткие сети затмевают всех.