Однослойный персептрон (пример)
Материал из MachineLearning.
|  (→Смотри также) | |||
| Строка 1: | Строка 1: | ||
| {{TOCright}} | {{TOCright}} | ||
| - | '''Однослойный персептрон''' — это модель  | + | '''Однослойный персептрон''' — это модель [[нейрон]]а, простейший пример [[нейронная сеть|нейронной сети]]. Фактически представляет собой [[Линейный классификатор | линейный пороговый классификатор]]. | 
| + | <ref>Желательно переписать введение. Неясно, что такое модель нейрона. В каком смысле однослойный персептрон -- простейший пример нейронной сети? Если возможно, более детально.</ref> | ||
| + | <ref>Обязательно проверить грамматику. Исправил несколько ошибок, но специально их поиском, конечно, не занимался.</ref> | ||
| - | == Постановка задачи линейного разделения классов== | + | == Постановка задачи линейного разделения классов == | 
| - | Пусть <tex>X</tex> - пространство объектов; <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>X</tex> - пространство объектов; | 
| + | <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>, то нейрон возбуждается | ||
| и выдаёт на выходе 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,x \rangle)</tex>, где <tex>\varphi(z)=[z \geq 0]</tex></center> | ||
| Требуется найти значения параметров, при которых алгоритм наилучшим образом аппроксимирует целевую зависимость, заданную на объектах обучающей выборки. | Требуется найти значения параметров, при которых алгоритм наилучшим образом аппроксимирует целевую зависимость, заданную на объектах обучающей выборки. | ||
| - | + | <ref>Уточнить что такое "наилучшим образом". Для этого нужно перенести сюда первые два предложения следующего раздел и откорректировать.</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>. Применим для минимизации метод градиентного спуска:  | ||
| - | <center><tex>w:=w - \eta \nabla Q(w)</tex> | + | <center><tex>w:=w - \eta \nabla Q(w),</tex></center>  | 
| где <tex>\eta > 0</tex> величина шага в направлении антиградиента, называемая также темпом обучения (learning rate). Будем выбирать прецеденты <tex>(x_i, y_i)</tex> по одному в случайном порядке, для каждого делать градиентный шаг и сразу обновлять вектор весов:  | где <tex>\eta > 0</tex> величина шага в направлении антиградиента, называемая также темпом обучения (learning rate). Будем выбирать прецеденты <tex>(x_i, y_i)</tex> по одному в случайном порядке, для каждого делать градиентный шаг и сразу обновлять вектор весов:  | ||
| - | <center><tex>w:= w - \eta(a(x_i,w)-y_i)(1-\varphi(\langle w,x_i \rangle))\varphi(\langle w,x_i \rangle)x_i</tex> | + | <center><tex>w:= w - \eta(a(x_i,w)-y_i)(1-\varphi(\langle w,x_i \rangle))\varphi(\langle w,x_i \rangle)x_i.</tex></center>  | 
| + | <ref>Скобки трудно читать, советую <tex>\phi\bigl(f(x)\bigr).</tex></ref> | ||
| + | Значение функционала оцениваем: <center><tex>Q = (1-\lambda)Q+\lambda \eps_i,</tex></center> где <tex>\eps_i = (a(x_i,w)-y_i)^2</tex>. | ||
| + | <ref>Написать, какой смысл несут <tex>\eta, \lambda</tex> и как они задаются.</ref> | ||
| Процедура останавливается после того, как изменение значения функционала функционала <tex>Q</tex> становится меньше заданной константы: <center><tex>|Q_n - Q_{n-1}|< \delta</tex></center> | Процедура останавливается после того, как изменение значения функционала функционала <tex>Q</tex> становится меньше заданной константы: <center><tex>|Q_n - Q_{n-1}|< \delta</tex></center> | ||
| Строка 19: | Строка 29: | ||
| Показана работа алгоритма в серии задач, основанных как на реальных, так и на модельных данных. | Показана работа алгоритма в серии задач, основанных как на реальных, так и на модельных данных. | ||
| - | + | === Пример на реальных данных: ирисы === | |
| - | Из  | + | Из задачи о классификации ирисов выбраны 2 вида ирисов: Versicolour и Virginica, которые предлагается классифицировать по двум признакам — длине и ширине лепестка. Данные содержат информацию о 50 цветках каждого вида[http://mlalgorithms.svn.sourceforge.net/viewvc/mlalgorithms/OneLayerPerceptron/iris.txt iris.txt]. | 
| [[Изображение:Iris.jpg|Iris.jpg]] | [[Изображение:Iris.jpg|Iris.jpg]] | ||
| [[Изображение:iris.png|300px]] | [[Изображение:iris.png|300px]] | ||
| - | На графике показаны результаты классификации. По оси  | + | На графике показаны результаты классификации. По оси абсцисс отложено значение одного признака (длина лепестка в см.), а по оси ординат — значение второго признака (ширина лепестка в см.). Различные классы показаны крестиками различных цветов, а результат классификации показан кружочками соотвествующего цвета. Зеленой линией показана граница между классами, построенная алгоритмом.  | 
| <source lang="matlab"> | <source lang="matlab"> | ||
| %load data | %load data | ||
| load 'iris.txt'; | load 'iris.txt'; | ||
| x = iris; | x = iris; | ||
| - | x(:,1) = []; %eliminating first two attributes | + | x(:,1:2) = []; %eliminating first two attributes | 
| - | + | ||
| y = [repmat(0,50,1);repmat(1,50,1)]; %creating class labels | y = [repmat(0,50,1);repmat(1,50,1)]; %creating class labels | ||
| Строка 54: | Строка 63: | ||
| </source> | </source> | ||
| - | Заметим, что данные линейно не разделимы, но алгоритм показывает хороший результат, допустив  | + | Заметим, что данные линейно не разделимы, но алгоритм показывает хороший результат, допустив 5 ошибок классификации. | 
| - | + | === Модельные данные (простой вариант): 2 нормально распределенных класса линейно разделимы === | |
| <source lang="matlab"> | <source lang="matlab"> | ||
| Строка 94: | Строка 103: | ||
| [[Изображение:simple.png|300px]] | [[Изображение:simple.png|300px]] | ||
| - | Алгоритм  | + | Алгоритм не допустил при классификации ни одной ошибки. | 
| == Исходный код == | == Исходный код == | ||
| - | Скачать листинги алгоритмов можно здесь [http://mlalgorithms.svn.sourceforge.net/viewvc/mlalgorithms/OneLayerPerceptron/ | + | Скачать листинги алгоритмов можно здесь [http://mlalgorithms.svn.sourceforge.net/viewvc/mlalgorithms/OneLayerPerceptron/ Func.m, OneLayerPerc.m, PercTest.m, GetNormClass.m]. | 
| == Смотри также == | == Смотри также == | ||
| - | [[Линейный классификатор]] | + | * [[Линейный классификатор]] | 
| + | * <ref>На этом сайте есть еще статья или несколько по данной теме. Желательно их найти и сделать ссылки.</ref> | ||
| - | == Литература == | + | == Литература ==  | 
| + | * <ref>Желательно пополнить список литературы.</ref> | ||
| * К. В. Воронцов, Лекции по линейным алгоритмам классификации | * К. В. Воронцов, Лекции по линейным алгоритмам классификации | ||
| * Bishop, C. Pattern Recognition And Machine Learning. Springer. 2006. | * Bishop, C. Pattern Recognition And Machine Learning. Springer. 2006. | ||
| {{Задание|Максим Панов|В.В. Стрижов|28 мая 2009}} | {{Задание|Максим Панов|В.В. Стрижов|28 мая 2009}} | ||
| [[Категория:Учебные материалы]] | [[Категория:Учебные материалы]] | ||
| + | |||
| + | |||
| + | == Замечания ==  | ||
| + | <references/> | ||
Версия 17:52, 2 мая 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
Алгоритм не допустил при классификации ни одной ошибки.
Исходный код
Скачать листинги алгоритмов можно здесь Func.m, OneLayerPerc.m, PercTest.m, GetNormClass.m.
Смотри также
Литература
- [1]
- К. В. Воронцов, Лекции по линейным алгоритмам классификации
- Bishop, C. Pattern Recognition And Machine Learning. Springer. 2006.
|   | Данная статья является непроверенным учебным заданием. 
 До указанного срока статья не должна редактироваться другими участниками проекта MachineLearning.ru. По его окончании любой участник вправе исправить данную статью по своему усмотрению и удалить данное предупреждение, выводимое с помощью шаблона {{Задание}}. См. также методические указания по использованию Ресурса MachineLearning.ru в учебном процессе. | 




