Обучение нейронных сетей

6.1. Функция стоимости

Пусть дана сеть, изображенная на рис. 6.1, и обучающее множество, состоящее из т пар ( , yt ) — обучающих примеров

у(1)), (х(2 у(2)),..., (х(т), у(т))}.

Пример четырехуровневой нейронной сети

Рисунок 6.1 - Пример четырехуровневой нейронной сети

Нейронная сеть имеет следующие параметры:

L - общее количество слоёв в сети. Для рассматриваемой сети L = 4.

SL- количество элементов (нейронов) в слое L, не считая корректировочной константы.

В нейронной сети, представленной на рисунке 6.1, 5г= 3.

В этой сети S1 (входной слой) равен трем элементам, 52 равен пяти элементам, S3 равен пяти элементам, S4 (результирующий слой) равен четырем элементам.

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

  • 1. Бинарная классификация, когда классы обозначаются через ноль или один.
  • 2. Многоклассовая классификация, где может быть К различных классов. К - количество нейронов в результирующем слое.

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

Функция стоимости:

6.2. Алгоритм обратного распространения ошибки

Задачей алгоритма является подобрать такие параметры 0 , чтобы функция7(0) стремилась к минимуму. В качестве примера используется сеть, изображенная на рисунке 6.2, на которой добавлены обозначения величин функции активации а^

Нейронная сеть с распределенными величинами функций активации слоев

Рисунок 6.2 - Нейронная сеть с распределенными величинами функций активации слоев

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

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

гдеа^,а®,а® - величины функции активации первого, второго и третьего слоев, соответственно, которые эквивалентны функции вероятности от переменной z этого слоя, функция g(z) - функция вероятности, z - аргумент функции вероятности.

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

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

Нейронная сеть с указанием ошибок для каждого выходного узла Ошибка 8 j-ro узла четвертого (последнего) уровня равна

Рисунок 6.3 - Нейронная сеть с указанием ошибок для каждого выходного узла Ошибка 8 j-ro узла четвертого (последнего) уровня равна:

(4Л

где аI - входное значение этого узла; у, - наблюдаемое значение обучающего примера.

Для вычисления значения ошибки 8 для узлов нейронной сети, находящихся на предыдущем слое, используется следующая формула:

где 0® - параметры сети слоя /; б^г+1') - ошибки в слое 1+1; - производная функции вероятности от аргумента слоя /.

6.3. Реализация метода обратного распространения ошибки для вычисления производных по параметрам

Есть набор т обучающих примеров: {(х^1), у*-1-*),...»(x(m);y(m))}.

А® - матрица значений частных производных ](в) по 0®.

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

Затем нужно итерировать каждый элемент матрицы Д® по всему учебному набору. Для этого используют цикл по i, где i принимает значения от 1 до т. На каждой итерации работают с одним примером из обучающего множества (я*, у*).

Инициализируем вход а= х^ где t принимает значения от 1 до т.

Воспользуемся методом прямого распространения для нейронной сети для вычисления активаций второго, третьего и так далее до последнего L-ro слоя. Затем используем yi (значение i-го выхода в этом примере) для вычисления ошибки выходного слоя 8^ : 8^ = — у® . Переменные

матрицы значений частных производных Д® используются для суммирования частных производных:

Находим матрицу частных производных Dфункции стоимости, в которую включена регуляризация. Когда j равно нулю, то решение соответствует значению составляющей смещения (—Я0^) , поэтому при j, равном нулю отсутствует дополнительный член регуляризации.

Вычисленные значения матрицы D?9 можно использовать в алгоритме градиентного спуска (рассмотренного в гл. 2) или любом другом алгоритме оптимизации.

В случае, если у® - действительное число, можно пренебречь регуляризацией (6.17).

6i

Обозначим функцию стоимости для /-го обучающего примера:

Функция стоимости /-го примера эквивалентна ошибке среднеквадратичного отклонения:

где /10(3:®) - фактическое значение; у1 - значение на выходе нейронной сети.

Как и в случае с логистической регрессией (подробнее в гл. 4), лучше использовать более сложную функцию стоимости (6.18), однако в расчетах можно применить и квадратичную функцию стоимости (6.19). Эти ошибки /-го примера показывают, насколько точно работает сеть на /-м наблюдении.

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

6.4. Развертка параметров

При реализации нейронных сетей используется следующий набор матриц: 0^, 0^2 0® и т.д. (матрицы параметров) и D^ D^2 и т.д.

(матрицы градиентов).

Большая часть функций оптимизации, используемых в Octave (например, fminunc()), в качестве входных параметров принимает вектор. В Octave это преобразование матрицы в вектор (развертка) осуществляется при помощи оператора (:). Код, который переводит набор исходных матриц в вектор, изображен на рисунке 6.4.

Код перевода набора исходных матриц в вектор

Рисунок 6.4 - Код перевода набора исходных матриц в вектор

Обратная процедура восстановления матриц из вектора осуществляется при помощи встроенной функции reshapeQ, пример реализации которой в Octave изображен на рисунке 6.5. Входными параметрами для данной функции являются необходимый вектор, число строк и число столбцов.

Пример реализации процедуры восстановления матриц из вектора

Рисунок 6.5 - Пример реализации процедуры восстановления матриц из вектора

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

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

6.5. Проверка градиента

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

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

График функции стоимости Для численной аппроксимации производной надо вычислить значения в точках 0 + ? и 0 - ?, потом взять эти две точки и соединить их прямой

Рисунок 6.6 - График функции стоимости Для численной аппроксимации производной надо вычислить значения в точках 0 + ? и 0 - ?, потом взять эти две точки и соединить их прямой

63

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

Математически наклон линии - это высота, разделенная на ширину. В таком случае производная по 0 функции /(0) при данном значении приблизительно равна:

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

Есть и другая формула для оценки производной:

Эта формула (6.22) - односторонняя разность. А рассмотренная раньше (6.21) - двусторонняя разность. Двусторонняя разность дает несколько более точную оценку, в Octave это реализуется при помощи кода, изображенного на рисунке 6.7

Код вычисления аппроксимированного значения производной

Рисунок 6.7 - Код вычисления аппроксимированного значения производной

Пусть в = 123,... ,9п], Тогда для аппроксимации всех элементов частной производной нужно использовать схожую идею:

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

Численное вычисление производных

Рисунок 6.8 - Численное вычисление производных

В нейронной сети реализуется цикл for для того, чтобы вычислить приближенную частную производную функции потерь по каждому параметру в сети. Затем используется градиент, полученный с помощью алгоритма обратного распространения. DVec - вектор производных, полученный с помощью алгоритма обратного распространения, gradApprox - вектор производных, полученный при помощи аппроксимации. Если gradApprox « DVec, то реализация обратного распространения ошибки с большой долей вероятности является правильной.

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

  • 1. Реализовать алгоритм обратного распространения ошибки для вычисления DVec.
  • 2. Для вычисления gradApprox реализовать численную проверку градиента.
  • 3. Убедиться, что DVec и gradApprox выдают схожие значения.
  • 4. Перед началом использования кода обучения важно отключить проверку градиента, так как код численной проверки градиента является очень медленным методом аппроксимации производной.

Алгоритм обратного распространения ошибки является более быстрым методом в сравнении с проверкой градиента.

6.6. Случайная инициализация

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

Инициализация всех параметров нулевыми значениями не сработает при тренировке нейронной сети. Чтобы обойти проблему симметричных весов (когда все значения матрицы весов равны), в методе, которым заполняются веса нейронной сети, используется инициализация случайными значениями, при помощи которой нарушается симметрия. Инициализируется каждое значение 0® случайным числом в диапазоне [—е; s] . Таким образом, веса для параметров будут случайно инициализированы значениям < 0® < ?. В Octave это реализуется при помощи кода, представленного на рисунке 6.9.

Случайная инициализация значений веса для параметров

Рисунок 6.9 - Случайная инициализация значений веса для параметров

Е обозначают, как INIT_EPSILON, для того чтобы отличить от параметра s в проверке градиента.

6.7. Подведение итогов

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

  • • Количество входных единиц равняется размерности вектора х®.
  • • Количество выходных единиц равняется числу классов.
  • • При увеличении числа узлов в скрытом слое точность вычислений нейронной сети увеличивается, однако при этом увеличивается и время вычислений.

Последовательность действий при обучении нейронной сети:

  • 1. Случайная инициализация весов.
  • 2. Реализация алгоритма прямого распространения для получения значения функции активации для каждого узла.
  • 3. Вычисление значений функции стоимости.
  • 4. Реализация метода обратного распространения ошибки для вычисления частных производных.
  • 5. Использование проверки градиента для подтверждения правильности работы алгоритма обратного распространения ошибки. В случае успеха отключить проверку градиента.
  • 6. Использование метода градиентного спуска или иного алгоритма оптимизации для минимизации функции стоимости с весами 0.

Практикум 6.1. Нахождение градиента функции сигмоиды

6.1. Нахождение градиента функции сигмоиды Цель: практическое применение функции сигмоиды.

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

Ход выполнения:

  • 1. Ознакомиться с теоретическими сведениями данного учебного пособия.
  • 2. Запустить Octave.
  • 3. Сделать текущей папку ML.Lab-rab/lab6/lab6_l.
  • 4. Открыть файл run.m и ознакомиться с последовательностью действий в работе.
  • 5. Открыть файл sigmoidGradient.m и добавить в указанном месте функцию вычисления градиента сигмоиды.
  • 6. Запустить файл run.m в Octave.
  • 7. Убедиться, что на третьем шаге работы программы написанная функция работает правильно (будут показаны ожидаемые значения и полученные).
  • 8. Подготовить отчет, содержащий помимо обязательных элементов выводы о

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

Практикум 6.2. Реализация метода обратного распространения ошибки Цель: практическое применение метода обратного распространения ошибки. Задачи: используя знания о методе обратного распространения ошибки, реализовать его на языке Octave.

Ход выполнения:

  • 1. Ознакомиться с теоретическими сведениями данного учебного пособия.
  • 2. Запустить Octave.
  • 3. Сделать текущей папку ML.Lab-rab/lab6/lab6_2.
  • 4. Открыть файл run.m и ознакомиться с последовательностью действий в работе.
  • 5. Открыть файл nnCostFunction.m и добавить в указанном месте реализацию метода обратного распространения ошибки.
  • 6. Запустить файл run.m в Octave.
  • 7. Убедиться, что на пятом шаге работы программы написанная функция работает правильно (будут показаны ожидаемые значения и полученные).
  • 8. Подготовить отчет с выводами.
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >