Прореживание двухслойной нейронной сети (пример)
Материал из MachineLearning.
|  (→Литература) |  (→Литература:  ссылки на участников) | ||
| Строка 78: | Строка 78: | ||
| [[Категория:Нейронные сети]] | [[Категория:Нейронные сети]] | ||
| - | {{ЗаданиеВыполнено|Михаил Кузнецов|В.В.Стрижов|28 мая 2010}} | + | {{ЗаданиеВыполнено|Михаил Кузнецов|В.В.Стрижов|28 мая 2010|Mikethehuman|Strijov}} | 
| [[Категория:Практика и вычислительные эксперименты]] | [[Категория:Практика и вычислительные эксперименты]] | ||
Версия 17:06, 28 октября 2010
Прореживание двухслойной нейронной сети (optimal brain damage) — метод упрощения структуры нейронной сети. Идея прореживания состоит в том, что из сети удаляются параметры, оказывающие малое влияние на ошибку аппроксимации. Таким образом, модель упрощается, а ошибка аппроксимации возрастает незначительно.
| Содержание | 
Постановка задачи
Задана обучающая выборка . Требуется решить задачу классификации с использованием двухслойной нейронной сети, настроив параметры сети - весовые матрицы 
 и 
, соответствующие соответственно первому и второму слою.  Посчитать гессиан 
, где 
 - вектор параметров, 
 - функция стоимости; посчитать функцию выпуклости и упростить сеть, выбросив из нее параметры, соответствующие наименьшей степени выпуклости. Среднеквадратичная ошибка классификации 
 при этом не должна сильно возрасти.
Настройка нейронной сети
 
 
Двухслойная нейронная сеть состоит из одного скрытого слоя и выходного слоя. Входной слой - это объект со своим признаковым описанием . Первый и второй слои сети состоят из так называемых нейронов, или персептронов. Каждый нейрон вычисляет 
-арную функцию вида 
. В нашем случае 
 - сигмоидальная функция активации 
. Значения признаков 
 поступают на вход первому (скрытому) слою сети с весовой матрицей 
, выходы первого слоя поступают на вход второму с весовой матрицей 
.На выходе второго слоя вычисляется вектор-функция 
, где 
 - количество нейронов на втором слое. Необходимо настроить параметры сети, используя алгоритм обратного распространения (back propagation).  
Введем функции ошибок:  - нормированная среднеквадратичная ошибка, 
 - ошибка на конкретном объекте. Пусть 
 - вес, соединяющий нейрон 
 с нейроном 
 следующего слоя. Тогда коррекция веса, применяемая к 
, определяется согласно правилу 
, где 
 - локальный градиент нейрона 
. Здесь 
 - выход 
-го нейрона, 
 - значение, которое получает на вход функция активации, соответствующая 
-му нейрону (
 - количество его входов), 
 - темп обучения. Для выходного слоя 
, и для него справедливо 
.
Соответственно, для первого, скрытого, слоя справедлива формула обратного распространения 
.  
 
Отметим, что эти формулы взяты из книги С. Хайкина "Нейронные сети. Полный курс".
Алгоритм оптимального прореживания
Описание метода второго порядка приводится в статье Оптимальное прореживание нейронных сетей.  
Локальная аппроксимация функции ошибки в окрестности стационарного положения: 
где 
 — возмущение вектора параметров 
, 
 — градиент 
,
и 
 — матрица вторых производных 
.  
Необходимо минимизировать квадратичную форму  по отношению к 
при ограничении 
. Для решения этой условной задачи строится лагранжиан 
. Получаем, что оптимальное приращение вектора весов 
, а соответствующее ему оптимальное значение лагранжиана для элемента 
:  
Основное отличие данного метода состоит в допущении, что матрица Гессе является диагональной. Таким образом, алгоритм немного видоизменяется:
Задана выборка , модель 
, функция ошибки 
. Для упрощения структуры сети выполняем следующие шаги: 
1. настраиваем модель, получаем параметры . 
2. пока значение ошибки не превосходит заранее заданного (3-5): 
3. вычисляем гессиан согласно формуле 
обозначим за  аргумент функции активации нейрона 
 на слое 
. Тогда частные производные на втором слое:  
 
 при 
 = 
 и равны 0 при 
,
а на первом слое 
 и  
 
4. вычисляем функцию выпуклости , находим 
, соответствующее наименьшей степени выпуклости. 
5. вес  удаляется из сети 
Примеры на модельных данных
Пример 1: выборка линейно разделима
На графике показаны результаты классификации. На первом и втором слое сети - по 5 нейронов, количество признаков - 4. Итого получается 45 весов. Видно, что алгоритм сработал без ошибок.
 
 
 Ниже приведены графики функции выпуклости (одная кривая - зависимость функции выпуклости от суммы модулей параметров) и график зависимости ошибки от количества удаленных параметров.

Видно, что из сети с 45 параметрами можно удалить 18, практически не проиграв в качестве.
Пример 2: выборка линейно неразделима
Те же самые 45 весов. Алгоритм допустил 4 ошибки при классификации:

Графики функции выпуклости и количества ошибок: 

Результат прореживания здесь более наглядный: можно удалить 35 из 45 параметров без потери качества. 
Для этого случая построим график функции ошибки ()в зависимости от параметров. На этом графике красным показаны параметры первого слоя, а синим - второго. В результате применения алгоритма OBD сначала удалялись те параметры, которые на графике видны плохо - именно они не оказывают большого значения на аппроксимацию.
Приведем график зависимости ошибки от количества удаленных параметров для тех же данных и 50 нейронов на каждом из слоев.
Исходный код
Скачать листинги алгоритмов можно здесь: ComputeHessianAndConvexity.m, ComputeResult.m, PlotErrors.m,PlotHessian.m, PlotOBD.m, TuneNet.m, mainNet.m
См. также
- Оптимальное прореживание нейронных сетей
- Регрессионный анализ
- Вычисление матриц Якоби и Гессе
- Оптимальное прореживание нейронных сетей (пример)
Литература
- Хайкин С. Нейронные сети, полный курс. 2е издание, испр.
- К. В. Воронцов, Лекции по линейным алгоритмам классификации
|   | Данная статья была создана в рамках учебного задания. 
 
 См. также методические указания по использованию Ресурса MachineLearning.ru в учебном процессе. | 





