Методы инициализации весовых коэффициентов нейронной сети

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

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

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

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

Инициализация весов единым значением

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

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

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

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

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

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

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

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

Инициализация весовых коэффициентов случайными значениями #

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

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

Кроме того, в глубоких нейронных сетях существует риск так называемых «взрыва градиента» и «затухания градиента».

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

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

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

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

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

На момент написания книги общей практикой считается инициализация нейронов по методу Xavier, предложенному в 2010 году. Ксавье Глорот (Xavier Glorot) и Йошуа Бенжио (Yoshua Bengio) предложили проводить инициализацию нейронной сети случайными числами из непрерывного нормального распределения с центром в точке 0 и дисперсией (δ2), равной 1/n.

Такой подход позволяет генерировать такие синаптические коэффициенты, при которых средняя из активаций нейронов будет равна нулю, а их дисперсия будет одинаковой для всех слоев нейронной сети. Наиболее актуальна инициализация Xavier при использовании гиперболического тангенса (tanh) в качестве функции активации.

Теоретическое обоснование такого похода было дано в статье "Understanding the difficulty of training deep feedforward neural networks".

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

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

Решение было предложено Каймин Хе (Kaiming He) в феврале 2015 года в статье "Delving Deep into Rectifiers: Surpassing Human—Level Performance on ImageNet Classification". В статье предложено веса для нейронов с активацией ReLU инициализировать из непрерывного нормального распределения с дисперсией (δ2), равной 2/n. А при использовании PReLU в качестве активации дисперсия распределения должна составлять 2/((1+a2)*n). Данный метод инициализации синаптических весов получил название «Хе-инициализация».

Инициализация случайной ортогональной матрицей

В декабре 2013 года Эндрю Сакс (Andrew M. Saxe) в статье "Exact solutions to the nonlinear dynamics of learning in deep linear neural networks" представил трехслойную нейронную сеть в виде матричного умножения и таким образом показал соответствие нейронной сети и сингулярного разложения. Матрица синаптических весов первого слоя представляется ортогональной матрицей, векторы которых являются координатами исходных данных в некоем n-мерном пространстве.

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

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

Использование предварительно обученных нейронных сетей

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

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

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

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

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

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