Прореживание двухслойной нейронной сети (пример)

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
(Алгоритм оптимального прореживания)
(викификация)
Строка 1: Строка 1:
-
'''Прореживание двухслойной нейронной сети '''(optimal brain damage) - метод упрощения структуры нейронной сети. Идея прореживания состоит в том, что из сети удаляются параметры, оказывающие малое влияние на ошибку аппроксимации. Таким образом, модель упрощается, а ошибка аппроксимации возрастает незначительно.
+
'''Прореживание двухслойной нейронной сети '''(optimal brain damage) — метод упрощения структуры нейронной сети. Идея прореживания состоит в том, что из сети удаляются параметры, оказывающие малое влияние на ошибку аппроксимации. Таким образом, модель упрощается, а ошибка аппроксимации возрастает незначительно.
-
 
+
== Постановка задачи ==
== Постановка задачи ==
Строка 10: Строка 9:
== Алгоритм оптимального прореживания ==
== Алгоритм оптимального прореживания ==
 +
Описание метода второго порядка приводится в статье [[Оптимальное прореживание нейронных сетей]].
-
Описание метода второго порядка приводится в статье [http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D1%80%D0%B5%D0%B6%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%B5%D1%82%D0%B5%D0%B9 "Оптимальное прореживание нейронных сетей"]. Основное отличие данного метода состоит в допущении, что матрица Гессе является диагональной. Таким образом, алгоритм немного видоизменяется:
+
Основное отличие данного метода состоит в допущении, что матрица Гессе является диагональной. Таким образом, алгоритм немного видоизменяется:
Задана выборка <tex>X</tex>, модель <tex>f(w)</tex>, функция ошибки <tex>E_X</tex>. Для упрощения структуры сети выполняем следующие шаги: <br />
Задана выборка <tex>X</tex>, модель <tex>f(w)</tex>, функция ошибки <tex>E_X</tex>. Для упрощения структуры сети выполняем следующие шаги: <br />
Строка 58: Строка 58:
== См. также ==
== См. также ==
-
[http://www.machinelearning.ru/wiki/index.php?title=%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D1%80%D0%B5%D0%B6%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%B5%D1%82%D0%B5%D0%B9 Оптимальное прореживание нейронных сетей] <br />[http://www.machinelearning.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7 Регрессионный анализ]
+
* [[Оптимальное прореживание нейронных сетей]]
 +
* [[Регрессионный анализ]]
== Литература ==
== Литература ==
* Хайкин С. Нейронные сети, полный курс. 2е издание, испр.
* Хайкин С. Нейронные сети, полный курс. 2е издание, испр.
* К. В. Воронцов, Лекции по линейным алгоритмам классификации
* К. В. Воронцов, Лекции по линейным алгоритмам классификации
 +
 +
[[Категория:Нейронные сети]]

Версия 19:02, 19 апреля 2010

Прореживание двухслойной нейронной сети (optimal brain damage) — метод упрощения структуры нейронной сети. Идея прореживания состоит в том, что из сети удаляются параметры, оказывающие малое влияние на ошибку аппроксимации. Таким образом, модель упрощается, а ошибка аппроксимации возрастает незначительно.

Содержание

Постановка задачи

Задана обучающая выборка X^l, Y^l. Требуется решить задачу классификации с использованием двухслойной нейронной сети; затем упростить сеть, выбросив из нее параметры, соответствующие наименьшей степени выпуклости; среднеквадратичная ошибка классификации при этом не должна сильно возрасти.

Настройка нейронной сети

Двухслойная нейронная сеть состоит из одного скрытого слоя и выходного слоя. Каждый нейрон сети имеет сигмоидальную функции активации \phi(z) = 1 / (1 + e^{-z}). Значения признаков x^i поступают на вход первому (скрытому) слою сети с весовой матрицей W_1, выходы первого слоя поступают на вход второму с весовой матрицей W_2.На выходе второго слоя вычисляется вектор-функция \bf{F} = (F_1(x),...,F_P(x)), где P - количество нейронов на втором слое. Необходимо настроить параметры сети, используя алгоритм обратного распространения (back propagation). \bf{E}(\bf{w}) = \frac{1}{2N} \sum_{n = 1}^N \sum_{p = 1}^P(F_p(n) - Y_p(n))^2 - нормированная среднеквадратичная ошибка. Пусть w_{ji} - вес, соединяющий нейрон i с нейроном j следующего слоя. Тогда коррекция веса, применяемая к w_{ji}(n), определяется согласно правилу \Delta w_{ji} = \eta \bf{\delta}_j(n)y_i(n), где \bf{\delta}_j(n) = - \frac{\partial \bf{E}(n)}{\partial y_j(n)}\phi_j'(v_j(n)) - локальный градиент нейрона j. Здесь y_i(n) - выход i-го нейрона, v_j(n) = \sum_{i = 1}^m w_{ji}(n)y_i(n) - значение, которое получает на вход функция активации, соответствующая j-му нейрону (m - количество его входов), \eta - темп обучения. Поскольку ошибка представляется в виде \bf{E}(n) = \frac{1}{2}\sum_{p = 1}^P (F_p(n) - y_p(n))^2, то для выходного слоя \frac {\partial \bf{E}(n)}{\partial y_j(n)} = y_j(n) - F_j(n) =: e_j(n), и для него справедливо \Delta w_{ji} = - \eta e_j(n)\phi_j'(v_j(n))y_i(n). Соответственно, для первого, скрытого, слоя справедлива формула обратного распространения \delta_j(n) = \phi_j'(v_j(n)) \sum_{p = 1}^P \delta_p(n) w_{pj}(n) .

Алгоритм оптимального прореживания

Описание метода второго порядка приводится в статье Оптимальное прореживание нейронных сетей.

Основное отличие данного метода состоит в допущении, что матрица Гессе является диагональной. Таким образом, алгоритм немного видоизменяется:

Задана выборка X, модель f(w), функция ошибки E_X. Для упрощения структуры сети выполняем следующие шаги:
1. настраиваем модель, получаем параметры \bf{w}.
2. пока значение ошибки не превосходит заранее заданного (3-5):
3. вычисляем гессиан Hсогласно формуле
H_{jk} = \frac{1}{N}\sum_{n = 1}^N \sum_{p = 1}^P ((\frac{\partial F_p}{\partial w_{kj}})^2 - \frac{\partial^2 F_p}{\partial w_{kj}^2}(F_p(n) - y_p(n)))
обозначим за U_j^{(l)} аргумент функции активации нейрона j на слое l. Тогда частные производные на втором слое:
\frac{\partial F_p}{\partial w_{kj}} = \phi'(U_k^{(2)}) \phi (U_j^{(1)});
 \frac{\partial^2 F_p}{\partial w_{kj}^2} = \phi''(U_k^{(2)}) \phi^2 (U_j^{(1)}) при p = k и равны 0 при p \neq k,
а на первом слое
\frac{\partial F_p}{\partial w_{ji}} = \phi'(U_p^{(2)})w_{pj}\phi'(U_j^{(1)})x_iw_{ij} и
\frac{\partial^2 F_p}{\partial w_{ji}^2} = \phi''(U_p^{(2)})(w_{pj} \phi' (U_j^{(1)})x_iw_{ij})^2 + \phi' (U_p^{(2)})w_{pj} \phi'' (U_j^{(1)})(x_iw_{ij})^2

4. вычисляем функцию выпуклости S_i = \frac{w_i^2 H_i}{2}, находим i, соответствующее наименьшей степени выпуклости.
5. вес w_i удаляется из сети

Примеры на модельных данных

Пример 1: выборка линейно разделима

На графике показаны результаты классификации. На первом и втором слое сети - по 5 нейронов, количество признаков - 4. Итого получается 45 весов. Видно, что алгоритм сработал без ошибок.


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


Видно, что из сети с 45 параметрами можно удалить 18, практически не проиграв в качестве.

Пример 2: выборка линейно неразделима

Те же самые 45 весов. Алгоритм допустил 3 ошибки при классификации:


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


Результат прореживания здесь более наглядный: можно удалить 35 из 45 параметров без потери качества.

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


Исходный код

Скачать листинги алгоритмов можно здесь: ComputeHessianAndConvexity.m, ComputeResult.m, PlotErrors.m,PlotHessian.m, PlotOBD.m, TuneNet.m, mainNet.m

См. также

Литература

  • Хайкин С. Нейронные сети, полный курс. 2е издание, испр.
  • К. В. Воронцов, Лекции по линейным алгоритмам классификации
Личные инструменты