При обучении модели глубокого обучения возникают различные проблемы, такие как исчезающие градиенты, взрывные градиенты и Dying ReLU. Так как же вовремя заметить эти проблемы и найти решения? На примере проблемы Dying ReLU в этой статье рассказывается, как использовать инструмент визуализации TensorBoard для поиска этой проблемы, и предлагаются различные решения.
В этой статье описывается, как использовать инструмент визуализации TensorBoard для обнаружения «проблемы умирающего ReLU».
Что такое РеЛУ?
ReLU, Rectified Linear Unit, представляет собой функцию активации в искусственных нейронных сетях. Как правило, ReLU является наиболее часто используемой функцией активации. Основная причина этого в том, что ReLU не страдает от проблемы исчезающего градиента. Математическая формула ReLU:
Другое выражение:
Его функциональное изображение выглядит следующим образом:
Обратите внимание, что функция нелинейна, ее выход нелинейный.
Производная ReLU:
Когда x=0, производная ReLU не определена.
В чем проблема Dying ReLU?
Основное преимущество ReLU заключается в том, что его вывод равен 0 и 1 (без умножения на очень маленькие значения при обратном распространении), что решает проблему исчезающего градиента. Однако и у него есть недостатки. Поскольку он выводит 0 для каждого отрицательного значения, нейрон ReLU может застревать в отрицательных значениях, постоянно выводить 0 и не иметь возможности восстановиться. Это называется проблемой Dying ReLU. Эта проблема серьезна, потому что когда нейрон умирает, он практически ничему не учится, что делает большие части сети неработоспособными.
Обнаружение умирающих проблем ReLU с помощью TensorBoard
Создайте случайную выборку со следующим кодом:
x представляет собой массив размером 200k x 4, значения которого равномерно выбираются из интервала (-1,0). Большинство значений в этом массиве отрицательные, что является наименее любимым типом ввода для ReLU. Данные разбиты на обучающую и тестовую выборки в соотношении 7:3.
Используйте простую однослойную сеть с функцией активации ReLU. Случайным образом инициализируйте веса и инициализируйте смещение до 0.
Теперь инициализируйте переменные TensorBoard. Градиенты требуются для каждой эпохи, поэтому инициализируйте write_grads значением True.
Наконец, подгоните модель, используя переменную TensorBoard в параметре callbacks.
Постройте изображения потери обучения и потери проверки.
Потери при проверке (вверху) и потери при обучении (внизу) для всех эпох.
Из приведенного выше графика ясно видно, что потери модели не уменьшились, что означает, что модель перестала обучаться. Теперь используйте TensorBoard для визуализации градиентов и выходных данных плотного слоя.
Выход плотного слоя (слева) и градиент плотного слоя (справа).
На изображении выше мы видим, что для всех эпох градиент плотного слоя равен 0, и выход также равен 0. График градиента показывает, что как только градиент достигает 0, модель пытается выйти из ситуации, но она полностью мертва, что также можно увидеть на графике потерь, поскольку потери не изменились с течением времени, что указывает на то, что модель прекратила обучение или не узнала никакой информации.
добавить слои
Теперь используйте трехуровневую сеть с той же функцией ReLU и посмотрите, решена ли вышеуказанная проблема. В этой статье используются следующие сети:
Это трехслойная сеть, все функции активации всех слоев — RELU.
Теперь наблюдайте за градиентами всех слоев через TensorBoard:
Градиент Dense_3 (слева), градиент Dense_2 (посередине), градиент Dense_1 (справа).
Как видно из рисунка выше, добавление слоев не решило проблему умирания ReLU, градиенты всех слоев по-прежнему равны 0, и эти градиенты распространяются обратно на другие слои модели, что влияет на производительность модели.
решение
1. Поможет ли увеличение размера данных?
Не буду! Если новые данные принадлежат к тому же распределению, что и исходные данные, добавлять эти новые данные в обучающий набор бесполезно. Однако сбор нового набора данных для той же проблемы может быть решением.
2. Поможет ли добавление отсева?
Dropout не имеет ничего общего с выводом ReLU, поэтому добавление или изменение Dropout не влияет на умирание ReLU.
3. Поможет ли добавление слоев?
Не буду. Как упоминалось выше, добавление слоев не поможет решить проблему умирания ReLU.
4. Поможет ли увеличение тренировочных эпох?
Нет, хотя веса обновляются после каждой эпохи, градиент равен 0 из-за гибели нейронов, поэтому веса обновлять нельзя. Веса всегда одинаковы, и вычисление градиента с одинаковыми весами даст вам только 0, так что это не поможет с умирающей проблемой ReLU.
5. Поможет ли изменение инициализации веса?
Давайте сначала попробуем разные инициализаторы весов и построим их градиенты и выходные данные. На рисунке ниже показан график градиента плотного слоя с использованием функции активации ReLU.Инициализаторы веса, используемые четырьмя сетями: he_normal, he_uniform, eun_normal и random_uniform.
he_normal (слева) и he_uniform (справа).
lecun_uniform (слева) и random_uniform (справа).
Как видно из изображения выше, инициализация веса не помогает решить проблему умирания ReLU. Как видно из графиков he_normal, he_uniform и lecun_normal, на фазе инициализации наблюдается небольшое улучшение, но производная стремится к 0 по мере увеличения числа эпох.
Поскольку ввод в основном отрицательный, мы используем следующий код для инициализации весов отрицательными значениями:
Значения, присвоенные весам, равномерно выбираются случайным образом из интервала (-1,0), который является тем же распределением, что и вход. Градиент и выход этой сети показаны на следующем рисунке:
Выход плотности_1 (слева), градиент плотности_1 (справа).
Из приведенного выше рисунка также видно, что по мере увеличения количества эпох градиент становится равным 0, и выходные данные также центрируются на 0. Таким образом, мы можем думать, что изменение начальных весов — это способ решить проблему умирания ReLU, но нам нужно убедиться, что модель не работает слишком много эпох, так как это снова вызовет проблему умирания ReLU. На самом деле, как вы можете видеть из этих графиков, изменение начальных весов не очень помогает в проблеме умирания ReLU.
6. Поможет ли изменение функции активации?
может быть. Итак, какую функцию использовать вместо ReLU? Мы можем использовать tanh и сигмовидные функции. Этой проблемы также можно избежать, используя вариант ReLU, Leaky ReLU. Однако в примере, созданном для этого эксперимента, все вышеперечисленные функции терпят неудачу, потому что все они страдают от проблемы исчезающего градиента. Когда нам нужно найти компромисс между исчезающими градиентами и Dying ReLU, движение лучше, чем ничего. Столкнувшись с проблемой исчезающего градиента, модель все еще обучается, тогда как в Dying ReLU обучения нет, и процесс обучения прерывается.
На этот раз вам пригодится расширенная версия Leaky ReLU SELU (Scaled Exponential Linear Units). Функция активации SELU может сама нормализовать нейронную сеть, то есть среднее значение веса и смещения сети после нормализации равно 0, а дисперсия равна 1. Основное преимущество SELU заключается в том, что он не сталкивается с исчезновением градиента и взрывом градиента, а также с феноменом гибели функции активации. Для получения дополнительной информации о SELU см. документ Самонормализующиеся нейронные сети.
Примечание. SELU необходимо использовать с инициализацией lecun_normal с AlphaDropout в качестве исключения. Для приведенного выше набора данных мы можем использовать следующие сети:
Градиент и выход плотного слоя этой сети показаны на следующем рисунке:
Как видно из графика градиента, градиент улучшился, отойдя от 0. Как видно из выходного графика, плотный слой с активацией SELU имеет небольшое выходное значение, но тоже не 0, как в предыдущем примере. Таким образом, SELU превосходит ReLU даже в худшем случае.
в заключении
При обучении и использовании глубоких нейронных сетей рекомендуется отслеживать потери и градиенты в режиме реального времени, что может помочь найти большинство проблем при обучении моделей глубокого обучения. Нет смысла писать глубокие сети, если вы не знаете, как находить и решать проблемы. Эта статья затронула лишь верхушку айсберга многих проблем. Каждый, кто использует глубокое обучение и искусственные нейронные сети, всегда будет сталкиваться с проблемой смерти функции активации, и вы потратите часы на переобучение модели, если не будете внимательны, ведь менять параметры модели в это время бесполезно. Поскольку ReLU является наиболее часто используемой функцией активации в большинстве задач глубокого обучения, вы должны быть осторожны, чтобы избежать этой проблемы. С TensorBoard вы можете легко обнаружить эту проблему.
Оригинальная ссылка:medium.com/@
jithinjayan1993/is-relu-dead-27943b50102