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

Введение

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

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

Понимание проблемы с большим количеством слоев

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

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

Решение проблемы исчезающего градиента

По сути, остаточные сети - это решение этой проблемы. В остаточной сети мы добавляем ярлыки, которые пропускают 2 или 3 слоя, в то время как этот ярлык изменит способ вычисления градиента на каждом слое. Короче говоря, передача входа в выход позволяет некоторым слоям не изменять значения градиента, что означает, что мы пропускаем обучение для некоторых слоев. Это лучшее представление, объясняющее, как градиент течет обратно в сети.

По мере обучения модель узнает, какие слои стоит сохранить, а те, которые не помогают, будут преобразованы в сопоставления идентичности. это еще один фактор успеха остаточных сетей, очень легко сделать слои сопоставленными с функцией идентичности, это так же просто, как сделать F (x) = 0.

Тот факт, что мы можем «скрыть» слои, которые не помогают, переводится в динамическое количество слоев, где мы начинаем со всех слоев, а затем выясняем, какие слои оставить.

Ознакомьтесь с этими замечательными статьями:

Остаточные блоки - строительные блоки ResNet

Обратное распространение очень просто. Кто усложнил это?

Как градиент течет через остаточную сеть?