Лекция №2. Обучение персептрона

Персептрон представляет собой элементарную часть нейронной сети. Одиночный персептрон является линейным бинарным классификатором. В этой лекции мы рассмотрим процедуру обучения персептрона для классификации данных. Поскольку персептрон представляет собой бинарный классификатор, то мы будем рассматривать лишь два класса.

Пусть мы рассматриваем некоторое множество (конечное или бесконечное) n-мерных векторов, которые будем обозначать

x=[x1,x2,...,xn]

Будем считать, что это множество разбивается на два класса, которые мы будем обозначать +1 и -1. Поэтому возникает задача построения функции, которая задана на нашем множестве векторов, и принимает значения в множестве {+1, -1}.

В качестве такой функции может выступать персептрон. С алгебраической точки зрения персептрон состоит из вектора весов

w=[w1,w2,...,wn].

При этом персептрон работает по формуле
y=sign[(x,w)],

где через (x,w) обозначено скалярное произведение векторов.

Более подробно об обучении персептрона смотрите нашу видео-лекцию:

Приведем алгоритм обучения персептрона. Пусть у нас есть набор обучающих данных

{(x,d)},

где x - это различные вектора, а d из множества {+1,-1} указывает к какому классу относится наш вектор.

  1. Положим вектор весов w равным нулю.
  2. Повторять N раз следующие шаги:
  3. Для каждого тестового набора (x,d):
  4. Вычислить y = sing[(x,w)].
  5. Если y*d < 0, то скорректировать веса
    w = w + a*d*x

Описанный алгоритм довольно легко программировать. Рассмотрим программу обучения персептрона на языке Python, которую Вы можете скачать AI-Liner.

Сначала рассмотрим основной класс персептрона, который умеет учиться по тестовым данным:

Copy Source | Copy HTML
  1. # класс, который реализует персептрон и его обучение
  2. class TPerceptron:
  3.     def __init__(self, N):
  4.         # создать нулевые веса
  5.         self.w = list()
  6.         for i in range(N):
  7.             self.w.append( 0)
  8.     # метод для вычисления значения персептрона
  9.     def calc(self, x):
  10.         res =  0
  11.         for i in range(len(self.w)):
  12.             res = res + self.w[i] * x[i]
  13.         return res
  14.     # пороговая функция активации персептрона
  15.     def sign(self, x):
  16.         if self.calc(x) >  0:
  17.             return 1
  18.         else:
  19.             return -1
  20.     # обучение на одном примере
  21.     def learn(self, la, x, y):
  22.         # обучаем только, когда результат неверный
  23.         if y * self.calc(x) <=  0:
  24.             for i in range(len(self.w)):
  25.                 self.w[i] = self.w[i] + la * y * x[i]
  26.     # обучение по всем данным T - кортеж примеров
  27.     def learning(self, la, T):
  28.         # цикл обучения 
  29.         for n in range(100):
  30.             # обучение по всем набору примеров
  31.             for t in T:
  32.                 self.learn(la, t[ 0], t[1])
В строке 25 мы осуществляем корректировку весов.

Посмотрим, как учится и работает наш персептрон.

Copy Source | Copy HTML
  1. import TPerceptron
  2. # создаем класс двумерного персептрона
  3. perceptron = TPerceptron.TPerceptron(2)
  4. la =  0.1 # константа обучения
  5. # создаем примеры
  6. T = list()
  7. T.append([[2,1], 1])
  8. T.append([[3,2], 1])
  9. T.append([[4,1], 1])
  10. T.append([[1,2], -1])
  11. T.append([[2,3], -1])
  12. T.append([[5,7], -1])
  13. perceptron.learning(la, T) # обучение персептрона
  14. print(perceptron.w) # печатаем веса
  15. # проверим работу на тестовых примерах
  16. print(perceptron.sign([1.5, 2]))
  17. print(perceptron.sign([3, 1.5]))
  18. print(perceptron.sign([5,1]))
  19. print(perceptron.sign([5,10]))

Запустим эту программу:

[0.1, -0.1]
-1
1
1
-1

Видим, что что наш персептрон отлично научился распознавать образы, относя к классу 1 те вектора, у которых первая компонента больше второй, и к классу -1 в противном случае.

Хотя устройство персептронов довольно простое эти конструкции могут решать и практические задачи. Кроме того, из таких персептронов состоят нейронные сети.

Home | Лекции | Python | Видео | Скачать | Ссылки
Copyright (c) 2017, Roman Shamin
28
13122
17