проблемы обучения нейронных сетей

Проблемы нейронных сетей

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

Содержание

Взрывающийся и затухающий градиент [ править ]

Определение [ править ]

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

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

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

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

Причины [ править ]

проблемы обучения нейронных сетей. 300px SigmoidDerivative. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-300px SigmoidDerivative. картинка проблемы обучения нейронных сетей. картинка 300px SigmoidDerivative.

Такая проблема может возникнуть при использовании нейронных сетях классической функцией активации (англ. activation function) сигмоиды (англ. sigmoid):

Способы определения [ править ]

Взрывающийся градиент [ править ]

Возникновение проблемы взрывающегося градиента можно определить по следующим признакам:

Более непрозрачные признаки, которые могут подтвердить возникновение проблемы:

Затухающий градиент [ править ]

Признаки проблемы затухающего градиента:

Способы устранения [ править ]

Использование другой функции активации [ править ]

проблемы обучения нейронных сетей. 300px SigmoidTanhReLUSoftplus. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-300px SigmoidTanhReLUSoftplus. картинка проблемы обучения нейронных сетей. картинка 300px SigmoidTanhReLUSoftplus.

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

Tanh [ править ]

ReLU [ править ]

Недостатком функции является отсутствие производной в нуле, что можно устранить доопределением производной в нуле слева или справа. Также эту проблему устраняет использование гладкой аппроксимации, Softplus.

Существуют модификации ReLU:

Softplus [ править ]

Гладкий, везде дифференцируемый аналог функции ReLU, следовательно, наследует все ее преимущества. Однако, эта функция более сложна для вычисления. Эмпирически было выявлено, что по качеству не превосходит ReLU.

Графики всех функций активации приведены на рисунок 2.

Изменение модели [ править ]

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

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

Использование Residual blocks [ править ]

проблемы обучения нейронных сетей. 300px Residual. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-300px Residual. картинка проблемы обучения нейронных сетей. картинка 300px Residual.

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

Регуляризация весов [ править ]

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

Обрезание градиента [ править ]

Источник

Проблемы обучения нейронных сетей

проблемы обучения нейронных сетей. 5e2438232fab979db64e34dcade59229. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-5e2438232fab979db64e34dcade59229. картинка проблемы обучения нейронных сетей. картинка 5e2438232fab979db64e34dcade59229.

Рубрика: Информационные технологии

Дата публикации: 05.04.2020 2020-04-05

Статья просмотрена: 720 раз

Библиографическое описание:

Кураева, Е. С. Проблемы обучения нейронных сетей / Е. С. Кураева. — Текст : непосредственный // Молодой ученый. — 2020. — № 14 (304). — С. 72-74. — URL: https://moluch.ru/archive/304/68605/ (дата обращения: 15.11.2021).

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

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

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

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

Если использовать в качестве функции активации — сигмоиду, то при слишком больших значениях входных данных, прямая будет выглядеть, как прямая. Поэтому рекомендуется задавать небольшие значения. Однако слишком маленькие значения также будут плохо сказываться на обучение, так как точность компьютерных вычислений снижается. Поэтому советуется выбирать значения входных данных от 0.0 до 1.0. При этом можно ввести смещение равное 0.01. [2, c. 124].

На рисунке 1 видно, что при увеличении входных данных, способность нейронной сети к обучению снижается, так как сигмоида почти выпрямляется.

проблемы обучения нейронных сетей. 68605.001. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-68605.001. картинка проблемы обучения нейронных сетей. картинка 68605.001.

Рис. 1. Подготовка входных данных

Выходные значения следует подбирать, в зависимости от выбранной функции активации. Если она не способна обеспечивать значения свыше 1.0, но выходные значения мы хотим получить больше 1.0, то весовые коэффициенты будут увеличиваться, чтобы подстроиться под ситуацию. Но ничего не выйдет, выходные значения все равно не будут больше максимального значения функции активации. Поэтому выходные значения следует масштабировать в пределах от 0.0 до 1.0. Так как граничные значения не достигаются, то советуется выбирать значения от 0.01 до 0.99. На рис. 2 продемонстрировано данное правило.

проблемы обучения нейронных сетей. 68605.002. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-68605.002. картинка проблемы обучения нейронных сетей. картинка 68605.002.

Рис. 2. Ограничение по выходных значениям

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

Если грубо описать правило, то оно звучит так: «Весовые коэффициенты инициализируются числами, случайно выбираемыми из диапазона, которые определяются обратной величиной квадратного корня из количества связей, ведущих к узлу» [2, с. 126].

На рис. 3 иллюстрируются подходы для выбора начальных весов.

проблемы обучения нейронных сетей. 68605.003. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-68605.003. картинка проблемы обучения нейронных сетей. картинка 68605.003.

Рис. 3. Подходы к выбору весовых коэффициентов

Советуется не задавать одинаковые веса. Таким образом бы в узлы пришли бы одинаковые сигналы и выходные значения получились бы одинаковыми. И после обновления весов, их значения все равно будут равными.

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

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

Входные и выходные значения должна быть масштабированными.

1. Хайкин С. Нейронные сети. — М.: Вильямс, 2006.

2. Рашид Т. Создает нейронную сеть. — М.: Диалектика, 2019.

Источник

Нейросети и глубокое обучение, глава 5: почему глубокие нейросети так сложно обучать?

Представьте, что вы – инженер, и вас попросили разработать компьютер с нуля. Как-то раз вы сидите в офисе, изо всех сил проектируете логические контуры, распределяете вентили AND, OR, и так далее,- и вдруг входит ваш босс и сообщает вам плохие новости. Клиент только что решил добавить неожиданное требование к проекту: схема работы всего компьютера должна иметь не более двух слоёв:

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

Вы поражены, и говорите боссу: «Да клиент спятил!»

Босс отвечает: «Я тоже так думаю. Но клиент должен получить то, что хочет».

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

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

К примеру, допустим, мы проектируем логическую схему для перемножения двух чисел. Вполне вероятно, что мы захотим построить её из подсхем, реализующих такие операции, как сложение двух чисел. Подсхемы сложения, в свою очередь, будут состоять из подподсхем, складывающих два бита. Грубо говоря, наша схема будет выглядеть так:

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

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

Поэтому глубокие схемы облегчают процесс проектирования. Но они помогают не только в проектировании. Есть математические доказательства того, что для вычисления некоторых функций в очень неглубоких схемах требуется использовать экспоненциально большее количество элементов, чем в глубоких. К примеру, есть знаменитая серия научных работ 1980-х годов, где показано, что вычисление чётности набора битов требует экспоненциально большего количества вентилей с неглубокой схемой. С другой стороны, при использовании глубоких схем легче вычислять чётность при помощи небольшой схемы: вы просто вычисляете чётность пар битов, а потом используете результат для подсчёта чётности пар пар битов, и так далее, быстро приходя к общей чётности. Поэтому глубокие схемы могут быть гораздо более мощными, чем неглубокие.

Пока что в этой книге использовался подход к нейросетям (НС), похожий на запросы безумного клиента. Почти у всех сетей, с которыми мы работали, был единственный скрытый слой нейронов (плюс входной и выходной слои):

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

Эти простые сети оказались весьма полезными: в предыдущих главах мы использовали такие сети для классификации рукописных чисел с точностью, превышающей 98%! Тем не менее, интуитивно понятно, что сети с большим количеством скрытых слоёв будут гораздо более мощными:

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

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

Как нам обучать подобные глубокие нейросети (ГНС)? В данной главе мы попробуем обучить ГНС используя нашу рабочую лошадку среди обучающих алгоритмов – стохастический градиентный спуск с обратным распространением. Однако мы столкнёмся с проблемой – наши ГНС не будут работать сильно лучше (если вообще превзойдут), чем неглубокие.

Эта неудача кажется странной в свете дискуссии, приведённой выше. Но вместо того, чтобы махнуть на ГНС рукой, мы углубимся в проблему и попытаемся понять, почему ГНС тяжело обучать. Когда мы поближе познакомимся с вопросом, мы обнаружим, что разные слои в ГНС обучаются с крайне разными скоростями. В частности, когда последние слои сети обучаются хорошо, первые часто застревают во время обучения, и почти ничему не обучаются. И дело не в простом невезении. Мы обнаружим фундаментальные причины для замедления обучения, которые связаны с использованием техник обучения на основе градиента.

Зарывшись в эту проблему поглубже, мы узнаем, что может происходит и обратное явление: ранние слои могут обучаться хорошо, а более поздние — застревать. На самом деле, мы обнаружим внутреннюю нестабильность, связанную с обучением градиентным спуском в глубоких многослойных НС. И из-за этой нестабильности либо ранние, либо поздние слои часто застревают при обучении.

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

Проблема исчезающего градиента

Так что же идёт не так, когда мы пытаемся обучить глубокую сеть?

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

Если хотите повторять все эти действия на компьютере, у вас должны быть установлены Python 2.7, библиотека Numpy, и копия кода, которую можно взять с репозитория:

Можно обойтись и без git, просто скачав данные и код. Перейдите в подкаталог src и из оболочки python загрузите данные MNIST:

У такой сети есть 784 нейрона во входном слое, соответствующие 28×28=784 пикселям входного изображения. Мы используем 30 скрытых нейронов и 10 выходных, соответствующих десяти возможным вариантам классификации цифр MNIST (‘0’, ‘1’, ‘2’, …, ‘9’).

Попробуем обучать нашу сеть в течение 30 целых эпох с использованием мини-пакетов из 10 обучающих примеров за раз, скорость обучения η=0,1 и параметр регуляризации λ=5,0. Во время обучения мы будем отслеживать точность классификации через validation_data:

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

Давайте добавим ещё один скрытый слой, также содержащий 30 нейронов, и попытаемся обучить сеть с теми же гиперпараметрами:

Точность классификации улучшается до 96,90%. Это вдохновляет – небольшое увеличение глубины помогает. Давайте добавим ещё один скрытый слой из 30 нейронов:

Это никак не помогло. Результат даже упал до 96,57%, значения, близкого к первоначальной неглубокой сети. А если мы добавим ещё один скрытый слой:

Тогда точность классификации опять упадёт, уже до 96,53%. Статистически это падение, вероятно, незначительно, однако и ничего хорошего в этом нет.

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

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

Чтобы понять, что пошло не так, давайте визуализируем процесс обучения сети. Ниже я построил часть сети [784,30,30,10], в которой есть два скрытых слоя, в каждом из которых по 30 скрытых нейронов. На диаграмме у каждого нейрона есть полоска, обозначающая скорость изменения в процессе обучения сети. Большая полоска значит, что веса и смещения нейрона меняются быстро, а маленькая – что они меняются медленно. Точнее, полоска обозначает градиент ∂C/∂b нейрона, то есть, скорость изменения стоимости по отношению к смещению. В главе 2 мы увидели, что эта величина градиента контролирует не только скорость изменения смещения в процессе обучения, но и скорость изменения входных весов нейрона. Не волнуйтесь, если вы не можете вспомнить эти детали: надо просто иметь в виду, что эти полоски обозначают, насколько быстро меняются веса и смещения нейронов в процессе обучения сети.

Для упрощения диаграммы я нарисовал только шесть верхних нейронов в двух скрытых слоях. Я опустил входящие нейроны, поскольку у них нет весов или смещений. Я опустил и выходные нейроны, поскольку мы сравниваем два слоя, и имеет смысл сравнивать слои с одинаковым количеством нейронов. Диаграмма построена при помощи программы generate_gradient.py в самом начале обучения, то есть, сразу после того, как сеть была инициализирована.

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

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

Чтобы узнать точно, хорошо будет иметь общий способ сравнения скорости обучения в первом и втором скрытых слоях. Для этого давайте обозначим градиент как δ l j = ∂C/∂b l j, то есть, как градиент нейрона №j в слое №l. Во второй главе мы называли это «ошибкой», но здесь я будут неформально называть это «градиентом». Неформально – поскольку в эту величину не входят явно частные производные стоимости по весам, ∂C/∂w. Градиент δ 1 можно представлять себе как вектор, чьи элементы определяют, насколько быстро обучается первый скрытый слой, а δ 2 — как вектор, чьи элементы определяют, насколько быстро обучается второй скрытый слой. Длины этих векторов мы используем, как приблизительные оценки скорости обучения слоёв. То есть, к примеру, длина || δ 1 || измеряет скорость обучения первого скрытого слоя, а длина || δ 2 || измеряет скорость обучения второго скрытого слоя.

С такими определениями и с той же конфигурацией, что указана выше, мы обнаружим, что || δ 1 || = 0,07, а || δ 2 || = 0,31. Это подтверждает наши подозрения: нейроны во втором скрытом слое обучаются гораздо быстрее, чем нейроны в первом скрытом слое.

Что будет, если мы добавим больше скрытых слоёв? С тремя скрытыми слоями в сети [784,30,30,30,10] соответствующие скорости обучения составят 0,012, 0,060 и 0,283. Опять первые скрытые слои обучаются гораздо медленнее последних. Добавим ещё один скрытый слой с 30 нейронами. В данном случае соответствующие скорости обучения составят 0,003, 0,017, 0,070 и 0,285. Закономерность сохраняется: ранние слои обучаются медленнее поздних.

Мы изучали скорость обучения в самом начале – сразу после инициализации сети. Как же меняется эта скорость по мере обучения? Давайте вернёмся и посмотрим на сеть с двумя скрытыми слоями. Скорость обучения меняется в ней так:

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

Для получения этих результатов я использовал пакетный градиентный спуск с 1000 обучающих изображений и обучение в течение 500 эпох. Это немного отличается от наших обычных процедур – я не использовал мини-пакеты и взял всего 1000 обучающих изображений, вместо полного набора из 50 000 штук. Я не пытаюсь хитрить и обманывать вас, но оказывается, что использование стохастического градиентного спуска с мини-пакетами привносит в результаты гораздо больше шума (но если усреднять шум, то результаты получаются похожими). Используя выбранные мною параметры легко сгладить результаты, чтобы мы могли увидеть, что происходит.

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

Что насчёт более сложных сетей? Вот результаты похожего эксперимента, но уже с сетью с тремя скрытыми слоями [784,30,30,30,10]:

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

И снова первые скрытые слои обучаются гораздо медленнее последних. Наконец, попробуем добавить четвёртый скрытый слой (сеть [784,30,30,30,30,10]), и посмотрим, что произойдёт при её обучении:

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

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

Мы провели важное наблюдение: по крайней мере, в некоторых ГНС градиент уменьшается при движении в обратную сторону по скрытым слоям. То есть, нейроны в первых слоях обучаются гораздо медленнее нейронов в последних. И хотя мы наблюдали этот эффект всего в одной сети, существуют фундаментальные причины того, почему это происходит во многих НС. Это явление известно под названием «проблемы исчезающего градиента» (см. работы 1, 2).

Почему возникает проблема исчезающего градиента? Есть ли способы её избежать? Как нам быть с ней при обучении ГНС? На самом деле вскоре мы узнаем, что она не является неизбежной, хотя альтернатива ей и не выглядит очень уж привлекательное: иногда в первых слоях градиент оказывается гораздо больше! Это уже проблема взрывного роста градиента, и в ней не больше хорошего, чем в проблеме исчезающего градиента. В целом оказывается, что градиент в ГНС нестабилен, и склонен либо к взрывному росту, либо к исчезновению в первых слоях. Эта нестабильность является фундаментальной проблемой для градиентного обучения ГНС. Это то, что нам нужно понять, и по возможности как-то решить.

Одна из реакций на исчезающий (или нестабильный) градиент – подумать, а является ли это на самом деле серьёзной проблемой? Ненадолго отвлечёмся от НС, и представим, что мы пытаемся численным образом минимизировать функцию f(x) от одного переменного. Разве не было бы здорово, если бы производная f′(x) была малой? Не означало бы это, что мы уже близки к экстремуму? И точно так же, не означает ли небольшой градиент в первых слоях ГНС, что нам уже не нужно сильно подстраивать веса и смещения?

Конечно же, нет. Вспомним, что мы случайным образом инициализировали веса и смещения сети. Крайне маловероятно, что наши изначальные веса и смешения хорошо справятся с тем, чего мы хотим от нашей сети. В качестве конкретного примера рассмотрим первый слой весов в сети [784,30,30,30,10], классифицирующей цифры MNIST. Случайная инициализация означает, что первый слой выбрасывает большую часть информации о входящем изображении. Даже если бы более поздние слои были тщательно обучены, им бы было чрезвычайно сложно определять входящее сообщение, просто из-за недостатка информации. Поэтому совершенно невозможно представить, что первому слою просто не нужно обучаться. Если мы собираемся обучать ГНС, нам надо понять, как решать проблему исчезающего градиента.

Что вызывает проблему исчезающего градиента? Нестабильные градиенты в ГНС

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

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

Здесь w1, w2,… – это веса, b1, b2,… – смещения, С – некая функция стоимости. Просто для напоминания скажу, что выход aj с нейрона №j равен σ(zj), где σ — обычная сигмоидная функция активации, а zj = wjaj−1+bj — взвешенный вход нейрона. Функцию стоимости я изобразил в конце, чтобы подчеркнуть, что стоимость является функцией от выхода сети, a4: если реальный выход близок к желаемому, тогда стоимость будет маленькой, а если далёк – то большой.

Изучим градиент ∂C/∂b1, связанный с первым скрытым нейроном. Найдём выражение для ∂C/∂b1 и, изучив его, поймём, почему возникает проблема исчезающего градиента.

Начнём с демонстрации выражения для ∂C/∂b1. Выглядит неприступно, но на самом деле структура его проста, и я скоро опишу её. Вот это выражение (пока игнорируйте саму сеть и отметьте, что σ′ — просто производная от функции σ):

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

Структура выражения такова: для каждого нейрона в сети имеется член умножения σ′(zj), для каждого веса имеется wj, и ещё есть последний член, ∂C/∂a4, соответствующий функции стоимости. Заметьте, что я разместил соответствующие члены над соответствующими частями сети. Поэтому сама сеть является мнемоническим правилом для выражения.

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

Представьте, что мы внесли небольшое изменение Δb1 в смещение b1. Это отправит серию каскадных изменений по всей остальной сети. Сначала это заставит измениться выход первого скрытого нейрона Δa1. Это, в свою очередь, заставить измениться Δz2 во взвешенном входе на второй скрытый нейрон. Затем произойдёт изменение Δa2 в выходе второго скрытого нейрона. И так далее, вплоть до изменения ΔC в стоимости выхода. Получится, что:

проблемы обучения нейронных сетей. 3927c63a82502744f25c8135fb721189. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-3927c63a82502744f25c8135fb721189. картинка проблемы обучения нейронных сетей. картинка 3927c63a82502744f25c8135fb721189.

Это говорит о том, что мы можем вывести выражение для градиента ∂C/∂b1, тщательно отслеживая влияние каждого шага в этом каскаде.

Для этого подумаем, как Δb1 заставляет меняться выход a1 первого скрытого нейрона. Имеем a1 = σ(z1) = σ(w1a0+b1), поэтому

проблемы обучения нейронных сетей. 5b98b453d99d985d169ccd8218745774. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-5b98b453d99d985d169ccd8218745774. картинка проблемы обучения нейронных сетей. картинка 5b98b453d99d985d169ccd8218745774.

проблемы обучения нейронных сетей. f275eda355afcb1e549774b7bc251b94. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-f275eda355afcb1e549774b7bc251b94. картинка проблемы обучения нейронных сетей. картинка f275eda355afcb1e549774b7bc251b94.

Член σ′(z1) должен выглядеть знакомым: это первый член нашего выражения для градиента ∂C/∂b1. Интуитивно понятно, что он превращает изменение смещения Δb1 в изменение Δa1 выходной активации. Изменение Δa1 в свою очередь вызывает изменение взвешенного входа z2 = w2a1+b2 второго скрытого нейрона:

проблемы обучения нейронных сетей. 5febf1bb8a7f78eabb481e01cb846559. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-5febf1bb8a7f78eabb481e01cb846559. картинка проблемы обучения нейронных сетей. картинка 5febf1bb8a7f78eabb481e01cb846559.

проблемы обучения нейронных сетей. 80dbbc672513674185c41a67a6678564. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-80dbbc672513674185c41a67a6678564. картинка проблемы обучения нейронных сетей. картинка 80dbbc672513674185c41a67a6678564.

Комбинируя выражения для Δz2 и Δa1, мы видим, как изменение смещения b1 распространяется вдоль сети и влияет на z2:

проблемы обучения нейронных сетей. a2bedfcb89fbe96122b0d0d793cb73ee. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-a2bedfcb89fbe96122b0d0d793cb73ee. картинка проблемы обучения нейронных сетей. картинка a2bedfcb89fbe96122b0d0d793cb73ee.

И это тоже должно быть знакомо: это два первых члена в нашем заявленном выражении для градиента ∂C/∂b1.

Так можно продолжать и далее, отслеживая, как изменения распространяются по остальной сети. На каждом нейроне мы подбираем член σ′(zj), и через каждый вес мы подбираем член wj. В итоге получается выражение, связывающее конечное изменение ΔC функции стоимости с начальным изменением Δb1 смещения:

проблемы обучения нейронных сетей. 7c59f29b89cc92ac30d89faecdc94cd5. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-7c59f29b89cc92ac30d89faecdc94cd5. картинка проблемы обучения нейронных сетей. картинка 7c59f29b89cc92ac30d89faecdc94cd5.

Разделив его на Δb1, мы действительно получим нужное выражение для градиента:

проблемы обучения нейронных сетей. afbf836648b0da5a25569a5907b19953. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-afbf836648b0da5a25569a5907b19953. картинка проблемы обучения нейронных сетей. картинка afbf836648b0da5a25569a5907b19953.

Почему возникает проблема исчезающего градиента?

Чтобы понять, почему возникает проблема исчезающего градиента, давайте подробно распишем всё наше выражение для градиента:

проблемы обучения нейронных сетей. ef8a1104e69d02adf876df1d8d6e4b87. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-ef8a1104e69d02adf876df1d8d6e4b87. картинка проблемы обучения нейронных сетей. картинка ef8a1104e69d02adf876df1d8d6e4b87.

Кроме последнего члена, это выражение есть произведение членов вида wjσ′(zj). Чтобы понять, как ведёт себя каждый из них, посмотрим на график функции σ′:

проблемы обучения нейронных сетей. image loader. проблемы обучения нейронных сетей фото. проблемы обучения нейронных сетей-image loader. картинка проблемы обучения нейронных сетей. картинка image loader.

График достигает максимума в точке σ′(0)=1/4. Если мы используем стандартный подход к инициализации весов сети, то мы выбираем веса с использованием распределения Гаусса, то есть, среднеквадратичным нулём и стандартным отклонением 1. Поэтому обычно веса будут удовлетворять неравенству |wj| l ) – диагональная матрица, чьи элементы – это значения σ′(z) для взвешенных входов слоя №l. w l — это матрицы весов для разных слоёв. А ∇aC – вектор частных производных C по выходным активациям.

Это выражение гораздо сложнее случая с одним нейроном. И всё же, если приглядеться, его суть окажется весьма похожей, с кучей пар вида (w j ) T Σ′(z j ). Более того, у матриц Σ′(z j ) по диагонали стоят небольшие значения, не больше 1/4. Если весовые матрицы w j будут не слишком крупными, каждый дополнительный член (w j ) T Σ′(z l ) склонен уменьшать градиентный вектор, что ведёт к исчезающему градиенту. В общем случае, большее количество членов перемножения ведёт к нестабильному градиенту, как в нашем предыдущем примере. На практике эмпирически обычно в сигмоидных сетях градиенты в первых слоях исчезают экспоненциально быстро. В итоге в этих слоях замедляется обучение. И замедление не является случайностью или неудобством: это фундаментальное следствие избранного нами подхода к обучению.

Другие препятствия на пути к глубокому обучению

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

В качестве первого примера в работе 2010 года было найдено свидетельство тому, что использование сигмоидных функций активации может привести к проблемам с обучением НС. В частности, было обнаружено свидетельство того, что использование сигмоид приведёт к тому, что активации последнего скрытого слоя будут во время обучения насыщаться в районе 0, что будет серьёзно замедлять обучение. Было предложено несколько альтернативных функций активации, не страдающих так сильно от проблемы насыщения (см. также ещё одну работу с обсуждением).

В качестве первого примера в работе 2013 года изучалось влияние на ГО как случайной инициализации весов, так и график импульсов в стохастическом градиентном спуске на основе импульса. В обоих случаях хороший выбор значительно влиял на возможность обучать ГНС.

Эти примеры говорят о том, что вопрос «Почему ГНС так сложно обучать?» очень сложный. В данной главе мы сконцентрировались на нестабильностях, связанных с градиентным обучением ГНС. Результаты двух предыдущих параграфов говорят о том, что роль играет ещё и выбор функции активации, способ инициализации весов и даже детали реализации обучения на основе градиентного спуска. И, естественно, важными будут выбор архитектуры сети и других гиперпараметров. Поэтому множество факторов может сыграть роль в затруднении обучения глубоких сетей, и вопрос понимания этих факторов является объектом текущих исследований. Но всё это кажется довольно мрачным и внушает пессимизм. Однако есть и хорошие новости – в следующей главе мы обернём всё в нашу пользу, и разработаем несколько подходов в ГО, которые до некоторой степени смогут преодолеть или обойти все эти проблемы.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *