Однослойный персептрон (пример)
Материал из MachineLearning.
(→Смотри также) |
(→Постановка задачи линейного разделения классов) |
||
Строка 9: | Строка 9: | ||
<ref> Если не используются аксиомы пространства, желательно использовать слово множество. См. напр. определения предгильбертова или Банахова пространства.</ref> | <ref> Если не используются аксиомы пространства, желательно использовать слово множество. См. напр. определения предгильбертова или Банахова пространства.</ref> | ||
- | <tex>Y</tex> - множество допустимых ответов. Будем считать, что <tex>x = (x^0,x^1,\dots,x^n) \in \{-1\}\times\mathbb{R}^n</tex>, где <tex>x^j = f_j(x), j \geq 1</tex> - признаковое описание объекта, а <tex>x_0 = -1</tex> - дополнительный константный признак; <tex>Y = \{0,1\}</tex>. Задана обучающая выборка <tex>\{(\mathbf{x}_i,y_i)\}_{i=1}^\ell</tex>. Значения признаков <tex>x^j = f_j(x)</tex> рассматриваются как импульсы, поступающие на вход нейрона, которые складываются с весами <tex>w_1,\dots,w_n</tex>. Если суммарный импульс превышает порог активации <tex>w_0</tex>, то нейрон возбуждается | + | <tex>Y</tex> - множество допустимых ответов. Будем считать, что <tex>\vec{x} = (x^0,x^1,\dots,x^n) \in \{-1\}\times\mathbb{R}^n</tex>, где <tex>x^j = f_j(x), j \geq 1</tex> - признаковое описание объекта, а <tex>x_0 = -1</tex> - дополнительный константный признак; <tex>Y = \{0,1\}</tex>. Задана обучающая выборка <tex>\{(\mathbf{x}_i,y_i)\}_{i=1}^\ell</tex>. Значения признаков <tex>x^j = f_j(x)</tex> рассматриваются как импульсы, поступающие на вход нейрона, которые складываются с весами <tex>w_1,\dots,w_n</tex>. Если суммарный импульс превышает порог активации <tex>w_0</tex>, то нейрон возбуждается |
и выдаёт на выходе 1, иначе выдаётся 0. Таким образом, нейрон вычисляет <tex>n</tex>-арную булеву функцию вида | и выдаёт на выходе 1, иначе выдаётся 0. Таким образом, нейрон вычисляет <tex>n</tex>-арную булеву функцию вида | ||
- | <center><tex>a(x) = \varphi(\sum_{i=1}^{\ell}w_jx^j-w_0) = \varphi(\langle w,x \rangle)</tex>, где <tex>\varphi(z)=[z \geq 0]</tex></center> | + | <center><tex>a(x) = \varphi(\sum_{i=1}^{\ell}w_jx^j-w_0) = \varphi(\langle w,\vec{x} \rangle)</tex>, где <tex>\varphi(z)=[z \geq 0]</tex></center> |
Требуется найти значения параметров, при которых алгоритм наилучшим образом аппроксимирует целевую зависимость, заданную на объектах обучающей выборки. | Требуется найти значения параметров, при которых алгоритм наилучшим образом аппроксимирует целевую зависимость, заданную на объектах обучающей выборки. | ||
<ref>Уточнить что такое "наилучшим образом". Для этого нужно перенести сюда первые два предложения следующего раздел и откорректировать.</ref> | <ref>Уточнить что такое "наилучшим образом". Для этого нужно перенести сюда первые два предложения следующего раздел и откорректировать.</ref> | ||
<ref>Мы различаем вектор <tex>\mathbf{x}</tex> и скаляр <tex>x</tex>, хоть это на данном движке Wiki плохо видно. Нужно исправить везде.</ref> | <ref>Мы различаем вектор <tex>\mathbf{x}</tex> и скаляр <tex>x</tex>, хоть это на данном движке Wiki плохо видно. Нужно исправить везде.</ref> | ||
+ | |||
== Описание алгоритма == | == Описание алгоритма == | ||
Для настройки вектора весов воспользуемся методом стохастического градиента. Возьмем квадратичную функцию потерь: <tex>Q(w) = \sum_{i=1}^{\ell}(a(x_i)-y_i)^2</tex>, а в качестве функции активации возьмем сигмоидную функцию: <tex>\varphi(z) = \frac{1}{1+e^{-z}}</tex>. Согласно принципу [[Минимизация эмпирического риска | минимизации эмпирического риска]] задача сводится к поиску вектора, доставляющего минимум функционалу <tex> Q(w) \rightarrow \min_w</tex>. Применим для минимизации метод градиентного спуска: | Для настройки вектора весов воспользуемся методом стохастического градиента. Возьмем квадратичную функцию потерь: <tex>Q(w) = \sum_{i=1}^{\ell}(a(x_i)-y_i)^2</tex>, а в качестве функции активации возьмем сигмоидную функцию: <tex>\varphi(z) = \frac{1}{1+e^{-z}}</tex>. Согласно принципу [[Минимизация эмпирического риска | минимизации эмпирического риска]] задача сводится к поиску вектора, доставляющего минимум функционалу <tex> Q(w) \rightarrow \min_w</tex>. Применим для минимизации метод градиентного спуска: |
Версия 17:23, 6 мая 2009
|
Однослойный персептрон — это модель нейрона, простейший пример нейронной сети. Фактически представляет собой линейный пороговый классификатор. [1] [1]
Постановка задачи линейного разделения классов
Пусть - пространство объектов; [1] [1]
- множество допустимых ответов. Будем считать, что , где - признаковое описание объекта, а - дополнительный константный признак; . Задана обучающая выборка . Значения признаков рассматриваются как импульсы, поступающие на вход нейрона, которые складываются с весами . Если суммарный импульс превышает порог активации , то нейрон возбуждается и выдаёт на выходе 1, иначе выдаётся 0. Таким образом, нейрон вычисляет -арную булеву функцию вида
Требуется найти значения параметров, при которых алгоритм наилучшим образом аппроксимирует целевую зависимость, заданную на объектах обучающей выборки. [1] [1]
Описание алгоритма
Для настройки вектора весов воспользуемся методом стохастического градиента. Возьмем квадратичную функцию потерь: , а в качестве функции активации возьмем сигмоидную функцию: . Согласно принципу минимизации эмпирического риска задача сводится к поиску вектора, доставляющего минимум функционалу . Применим для минимизации метод градиентного спуска:
где величина шага в направлении антиградиента, называемая также темпом обучения (learning rate). Будем выбирать прецеденты по одному в случайном порядке, для каждого делать градиентный шаг и сразу обновлять вектор весов:
Вычислительный эксперимент
Показана работа алгоритма в серии задач, основанных как на реальных, так и на модельных данных.
Пример на реальных данных: ирисы
Из задачи о классификации ирисов выбраны 2 вида ирисов: Versicolour и Virginica, которые предлагается классифицировать по двум признакам — длине и ширине лепестка. Данные содержат информацию о 50 цветках каждого видаiris.txt.
На графике показаны результаты классификации. По оси абсцисс отложено значение одного признака (длина лепестка в см.), а по оси ординат — значение второго признака (ширина лепестка в см.). Различные классы показаны крестиками различных цветов, а результат классификации показан кружочками соотвествующего цвета. Зеленой линией показана граница между классами, построенная алгоритмом.
%load data load 'iris.txt'; x = iris; x(:,1:2) = []; %eliminating first two attributes y = [repmat(0,50,1);repmat(1,50,1)]; %creating class labels %plotting data plot(x(y == 0,1),x(y == 0,2),'*r'); hold on plot(x(y == 1,1),x(y == 1,2),'*b'); %invoke One layer perceptron algorithm w = OneLayerPerc(x,y); %getting classification y = PercTest(x,w); %plotting resulting classification plot(x(y == 0,1),x(y == 0,2),'or'); plot(x(y == 1,1),x(y == 1,2),'ob'); plot([w(3)/w(1),0],[0,w(3)/w(2)],'g'); hold off;
Заметим, что данные линейно не разделимы, но алгоритм показывает хороший результат, допустив 5 ошибок классификации.
Модельные данные (простой вариант): 2 нормально распределенных класса линейно разделимы
%generating 2 sample normal classes x = GetNormClass(100,[0,0],[1,1]); s = GetNormClass(100,[4,4],[1,1]); x = [x;s]; y = [repmat(1,100,1);repmat(0,100,1)]; %invoke One layer perceptron algorithm w = OneLayerPerc(x,y); %generating control data with the same distribution x = GetNormClass(100,[0,0],[1,1]); s = GetNormClass(100,[4,4],[1,1]); x = [x;s]; %plotting control data plot(x(:,1),x(:,2),'*r'); hold on plot(s(:,1),s(:,2),'*b'); %getting classification y = PercTest(x,w); %plotting classified data plot(x(y == 0,1),x(y == 0,2),'ob'); plot(x(y == 1,1),x(y == 1,2),'or'); plot([w(3)/w(1),0],[0,w(3)/w(2)],'g'); hold off
Алгоритм не допустил при классификации ни одной ошибки.
Модельные данные (сложный вариант): задача исключающего ИЛИ
%generate 2 sample classes x = GetNormClass(100,[0,0],[1,1]); s = GetNormClass(100,[6,6],[1,1]); x = [x;s]; s = GetNormClass(100,[0,6],[1,1]); x = [x;s]; s = GetNormClass(100,[6,0],[1,1]); x = [x;s]; y = [repmat(1,200,1);repmat(0,200,1)]; %invoke One layer perceptron algorithm w = OneLayerPerc(x,y); %generate control data with the same distribution x = GetNormClass(100,[0,0],[1,1]); s = GetNormClass(100,[6,6],[1,1]); x = [x;s]; s = GetNormClass(100,[0,6],[1,1]); x = [x;s]; s = GetNormClass(100,[6,0],[1,1]); x = [x;s]; %plot control data plot(x(y == 1,1),x(y == 1,2),'*r'); hold on plot(x(y == 0,1),x(y == 0,2),'*b'); %get classification y = PercTest(x,w); %plot classified data plot(x(y == 0,1),x(y == 0,2),'ob'); plot(x(y == 1,1),x(y == 1,2),'or'); plot([w(3)/w(1),0],[0,w(3)/w(2)],'g'); hold off
Алгоритм допустил около 50% ошибок классификация, что неудивительно, т.к. входные данные были принципиально линейно неразделимы.
Исходный код
Скачать листинги алгоритмов можно здесь Func.m, OneLayerPerc.m, PercTest.m, GetNormClass.m.
Смотри также
Литература
- Nabney Ian, NetLab Algotithms for Pattern Recognition. Springer. 2001.
- К. В. Воронцов, Лекции по линейным алгоритмам классификации
- Bishop, C. Pattern Recognition And Machine Learning. Springer. 2006.
Данная статья является непроверенным учебным заданием.
До указанного срока статья не должна редактироваться другими участниками проекта MachineLearning.ru. По его окончании любой участник вправе исправить данную статью по своему усмотрению и удалить данное предупреждение, выводимое с помощью шаблона {{Задание}}. См. также методические указания по использованию Ресурса MachineLearning.ru в учебном процессе. |