Прореживание двухслойной нейронной сети (пример)
Материал из MachineLearning.
(→Настройка нейронной сети) |
(→Настройка нейронной сети) |
||
Строка 6: | Строка 6: | ||
== Настройка нейронной сети == | == Настройка нейронной сети == | ||
[[Изображение:Something.jpg|500px]] <br /> | [[Изображение:Something.jpg|500px]] <br /> | ||
- | Двухслойная нейронная сеть состоит из одного скрытого слоя и выходного слоя. Каждый нейрон сети имеет сигмоидальную функции активации <tex>\phi(z) = 1 / (1 + e^{-z})</tex>. Значения признаков <tex>x_i</tex> поступают на вход первому (скрытому) слою сети с весовой матрицей <tex>W_1</tex>, выходы первого слоя поступают на вход второму с весовой матрицей <tex>W_2</tex>.На выходе второго слоя вычисляется вектор-функция <tex>\bf{F} = (F_1(x),...,F_P(x))</tex>, где <tex>P</tex> - количество нейронов на втором слое. Необходимо настроить параметры сети, используя алгоритм обратного распространения (back propagation). <tex>\bf{E}(\bf{w}) = \frac{1}{2N} \sum_{n = 1}^N \sum_{p = 1}^P(F_p(n) - Y_p(n))^2</tex> - нормированная среднеквадратичная ошибка. Пусть <tex>w_{ji}</tex> - вес, соединяющий нейрон <tex>i </tex> с нейроном <tex>j</tex> следующего слоя. Тогда коррекция веса, применяемая к <tex>w_{ji}(n)</tex>, определяется согласно правилу <tex>\Delta w_{ji} = \eta \bf{\delta}_j(n)y_i(n)</tex>, где <tex>\bf{\delta}_j(n) = - \frac{\partial \bf{E}(n)}{\partial y_j(n)}\phi_j'(v_j(n))</tex> - локальный градиент нейрона <tex>j</tex>. Здесь <tex>y_i(n)</tex> - выход <tex>i</tex>-го нейрона, <tex>v_j(n) = \sum_{i = 1}^m w_{ji}(n)y_i(n)</tex> - значение, которое получает на вход функция активации, соответствующая j-му нейрону (m - количество его входов), <tex>\eta</tex> - темп обучения. Поскольку ошибка представляется в виде <tex>\bf{E}(n) = \frac{1}{2}\sum_{p = 1}^P (F_p(n) - y_p(n))^2</tex>, то для выходного слоя <tex>\frac {\partial \bf{E}(n)}{\partial y_j(n)} = y_j(n) - F_j(n) =: e_j(n)</tex>, и для него справедливо <tex>\Delta w_{ji} = - \eta e_j(n)\phi_j'(v_j(n))y_i(n)</tex>. | + | Двухслойная нейронная сеть состоит из одного скрытого слоя и выходного слоя. Каждый нейрон сети имеет сигмоидальную функции активации <tex>\phi(z) = 1 / (1 + e^{-z})</tex>. Значения признаков <tex>x_i</tex> поступают на вход первому (скрытому) слою сети с весовой матрицей <tex>W_1</tex>, выходы первого слоя поступают на вход второму с весовой матрицей <tex>W_2</tex>.На выходе второго слоя вычисляется вектор-функция <tex>\bf{F} = (F_1(x),...,F_P(x))</tex>, где <tex>P</tex> - количество нейронов на втором слое. Необходимо настроить параметры сети, используя алгоритм обратного распространения (back propagation). <tex>\bf{E}(\bf{w}) = \frac{1}{2N} \sum_{n = 1}^N \sum_{p = 1}^P(F_p(n) - Y_p(n))^2</tex> - нормированная среднеквадратичная ошибка. Пусть <tex>w_{ji}</tex> - вес, соединяющий нейрон <tex>i </tex> с нейроном <tex>j</tex> следующего слоя. Тогда коррекция веса, применяемая к <tex>w_{ji}(n)</tex>, определяется согласно правилу <tex>\Delta w_{ji} = \eta \bf{\delta}_j(n)y_i(n)</tex>, где <tex>\bf{\delta}_j(n) = - \frac{\partial \bf{E}(n)}{\partial y_j(n)}\phi_j'(v_j(n))</tex> - локальный градиент нейрона <tex>j</tex>. Здесь <tex>y_i(n)</tex> - выход <tex>i</tex>-го нейрона, <tex>v_j(n) = \sum_{i = 1}^m w_{ji}(n)y_i(n)</tex> - значение, которое получает на вход функция активации, соответствующая <tex>j</tex>-му нейрону (<tex>m</tex> - количество его входов), <tex>\eta</tex> - темп обучения. Поскольку ошибка представляется в виде <tex>\bf{E}(n) = \frac{1}{2}\sum_{p = 1}^P (F_p(n) - y_p(n))^2</tex>, то для выходного слоя <tex>\frac {\partial \bf{E}(n)}{\partial y_j(n)} = y_j(n) - F_j(n) =: e_j(n)</tex>, и для него справедливо <tex>\Delta w_{ji} = - \eta e_j(n)\phi_j'(v_j(n))y_i(n)</tex>. |
Соответственно, для первого, скрытого, слоя справедлива формула обратного распространения <tex>\delta_j(n) = \phi_j'(v_j(n)) \sum_{p = 1}^P \delta_p(n) w_{pj}(n) </tex>. | Соответственно, для первого, скрытого, слоя справедлива формула обратного распространения <tex>\delta_j(n) = \phi_j'(v_j(n)) \sum_{p = 1}^P \delta_p(n) w_{pj}(n) </tex>. | ||
Версия 17:40, 21 апреля 2010
Прореживание двухслойной нейронной сети (optimal brain damage) — метод упрощения структуры нейронной сети. Идея прореживания состоит в том, что из сети удаляются параметры, оказывающие малое влияние на ошибку аппроксимации. Таким образом, модель упрощается, а ошибка аппроксимации возрастает незначительно.
Содержание |
Постановка задачи
Задана обучающая выборка . Требуется решить задачу классификации с использованием двухслойной нейронной сети; затем упростить сеть, выбросив из нее параметры, соответствующие наименьшей степени выпуклости; среднеквадратичная ошибка классификации при этом не должна сильно возрасти.
Настройка нейронной сети
Двухслойная нейронная сеть состоит из одного скрытого слоя и выходного слоя. Каждый нейрон сети имеет сигмоидальную функции активации . Значения признаков поступают на вход первому (скрытому) слою сети с весовой матрицей , выходы первого слоя поступают на вход второму с весовой матрицей .На выходе второго слоя вычисляется вектор-функция , где - количество нейронов на втором слое. Необходимо настроить параметры сети, используя алгоритм обратного распространения (back propagation). - нормированная среднеквадратичная ошибка. Пусть - вес, соединяющий нейрон с нейроном следующего слоя. Тогда коррекция веса, применяемая к , определяется согласно правилу , где - локальный градиент нейрона . Здесь - выход -го нейрона, - значение, которое получает на вход функция активации, соответствующая -му нейрону ( - количество его входов), - темп обучения. Поскольку ошибка представляется в виде , то для выходного слоя , и для него справедливо .
Соответственно, для первого, скрытого, слоя справедлива формула обратного распространения .
Алгоритм оптимального прореживания
Описание метода второго порядка приводится в статье Оптимальное прореживание нейронных сетей.
Основное отличие данного метода состоит в допущении, что матрица Гессе является диагональной. Таким образом, алгоритм немного видоизменяется:
Задана выборка , модель , функция ошибки . Для упрощения структуры сети выполняем следующие шаги:
1. настраиваем модель, получаем параметры .
2. пока значение ошибки не превосходит заранее заданного (3-5):
3. вычисляем гессиан согласно формуле
обозначим за аргумент функции активации нейрона на слое . Тогда частные производные на втором слое:
при = и равны 0 при ,
а на первом слое
и
4. вычисляем функцию выпуклости , находим , соответствующее наименьшей степени выпуклости.
5. вес удаляется из сети
Примеры на модельных данных
Пример 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е издание, испр.
- К. В. Воронцов, Лекции по линейным алгоритмам классификации