Нейрокомпьютерная техника алгоритм обучения персептрона


Содержание

Алгоритм обучения персептрона

Фрэнк Розенблатт предложил алгоритм обучения для одного типа однослойной нейронной сети, получившей название персептрона. Входные значения персептрона являются биполярными (равны -1 или 1), а вес – вещественным числом. Уровень активации персептрона вычисляется как взвешенная сумма его входов, Σxiwi. Выходное значение персептрона вычисляется с помощью строгой пороговой функции: если уровень активации превышает или равен пороговому значению, выход персептрона принимается равным 1, в противном случае – -1. Таким образом, выходное значение персептрона вычисляется на основе его входных значений xi весовых коэффициентов wi, и порога t следующим образом.

w1*1 + w2*1 t (из второй строки таблицы истинности),

0 + w2*1 > t (из первой строки таблицы истинности),

Дата добавления: 2020-04-14 ; просмотров: 1118 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Нейрокомпьютерная техника алгоритм обучения персептрона

Способность искусственных нейронных сетей к обучению является их наиболее интригующим свойством. Подобно биологическим системам, которые они моделируют, эти нейронные сети сами совершенствуют себя в результате попыток создать лучшую модель поведения.

Используя критерий линейной разделимости, можно решить, способна ли однослойная нейронная сеть реализовывать требуемую функцию. Даже в том случае, когда ответ положительный, это принесет мало пользы, если у нас нет способа найти нужные значения для весов и порогов. Чтобы сеть представляла практическую ценность, нужен систематический метод (алгоритм) для вычисления этих значений. Ф.Розенблатт создал такой метод в своем алгоритме обучения персептрона и доказал: персептрон может быть обучен всему, что он может реализовывать.

Обучение может быть с учителем или без него. Для обучения с учителем нужен «внешний» учитель, который оценивал бы поведение системы и управлял ее последующими модификациями. При обучении без учителя, которое будет рассмотрено на последующих лекциях, сеть путем самоорганизации делает требуемые изменения. Обучение персептрона является обучением с учителем.

Алгоритм обучения персептрона может быть реализован на цифровом компьютере или другом электронном устройстве, и сеть становится в определенном смысле самоподстраивающейся. По этой причине процедуру подстройки весов обычно называют «обучением» и говорят, что сеть «обучается». Доказательство Розенблатта стало основной вехой и дало мощный импульс исследованиям в этой области. Сегодня в той или иной форме элементы алгоритма обучения персептрона встречаются во многих сетевых парадигмах.

Алгоритм обучения однослойного персептрона

Персептрон должен решать задачу классификации по бинарным входным сигналам. Набор входных сигналов будем обозначать -мерным вектором . Все элементы вектора являются булевыми переменными (переменными, принимающими значения «Истина» или «Ложь»). Однако иногда полезно оперировать числовыми значениями. Будем считать, что значению «ложь» соответствует числовое значение 0, а значению «Истина» соответствует 1.

Персептроном будем называть устройство, вычисляющее следующую систему функций:

\theta\Bigr],\quad j=1,\ldots, n, » src=»http://algmet.simulacrum.me/tai/l3/a8ec638de3fbfca8166469ed534245a5.png» w > (1)

где — веса персептрона , — порог, — значения входных сигналов, скобки означают переход от булевых (логических) значений к числовым значениям по правилам, изложенным выше.

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

Предложенный Ф.Розенблаттом метод обучения состоит в итерационной подстройке матрицы весов, последовательно уменьшающей ошибку в выходных векторах. Алгоритм включает несколько шагов:

Шаг 0 Начальные значения весов всех нейронов полагаются случайными
Шаг 1 Сети предъявляется входной образ , в результате формируется выходной образ .
Шаг 2 Вычисляется вектор ошибки , делаемой сетью на выходе. Дальнейшая идея состоит в том, что изменение вектора весовых коэффициентов в области малых ошибок должно быть пропорционально ошибке на выходе и равно нулю, если ошибка равна нулю.
Шаг 3 Вектор весов модифицируется по следующей формуле: . Здесь — темп обучения.
Шаг 4 Шаги 1—3 повторяются для всех обучающих векторов. Один цикл последовательного предъявления всей выборки называется эпохой . Обучение завершается по истечении нескольких эпох: а) когда итерации сойдутся, т.е. вектор весов перестает изменяться, или б) когда полная, просуммированная по всем векторам абсолютная ошибка станет меньше некоторого малого значения.

Объясним данный алгоритм более подробно. Подаем на вход персептрона такой вектор , для которого уже известен правильный ответ. Если выходной сигнал персептрона совпадает с правильным ответом, то никаких действий предпринимать не надо. В случае ошибки, необходимо обучить персептрон правильно решать данный пример. Ошибки могут быть двух типов. Рассмотрим каждый из них.

Первый тип ошибки: на выходе персептрона — 0, а правильный ответ — 1. Для того чтобы персептрон выдавал правильный ответ, необходимо, чтобы сумма в правой части (1) стала больше. Поскольку переменные принимают значения 0 или 1, увеличение суммы может быть достигнуто за счет увеличения весов . Однако нет смысла увеличивать веса при переменных , которые равны нулю. Таким образом, следует увеличить веса при тех переменных x i , которые равны 1.

Первое правило. Если на выходе персептрона получен 0, а правильный ответ равен 1, то необходимо увеличить веса связей между одновременно активными нейронами. При этом выходной персептрон считается активным. Второй тип ошибки: на выходе персептрона — 1, а правильный ответ равен нулю. Для обучения правильному решению данного примера следует уменьшить сумму в правой части (1). Следовательно, необходимо уменьшить веса связей при тех переменных, которые равны 1 (поскольку нет смысла уменьшать веса связей при равных нулю переменных

). Необходимо также провести эту процедуру для всех активных нейронов предыдущих слоев. В результате получаем второе правило.

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

Таким образом, процедура обучения сводится к последовательному перебору всех примеров обучающего множества с применением правил обучения для ошибочно решенных примеров. Если после очередного цикла предъявления всех примеров окажется, что все они решены правильно, то процедура обучения завершается.

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

Ответ на первый вопрос дают следующие теоремы.

Теорема о сходимости персептрона. Если существует вектор параметров , при котором персептрон правильно решает все примеры обучающей выборки, то при обучении персептрона по вышеописанному алгоритму решение будет найдено за конечное число шагов.

Теорема о «зацикливании» персептрона. Если не существует вектора параметров , при котором персептрон правильно решает все примеры обучающей выборки, то при обучении персептрона по данному правилу через конечное число шагов вектор весов начнет повторяться.

Таким образом, данные теоремы утверждают, что, запустив процедуру обучения персептрона , через конечное время мы либо получим обучившийся персептрон , либо ответ, что данный персептрон поставленной задаче обучится не может.

Доказательства этих теорем в данное учебное пособие не включены.

Целочисленность весов персептронов

Для ответа на вопрос о количественных характеристиках вектора w рассмотрим следующую теорему.

Теорема. Любой персептрон можно заменить другим персептроном того же вида с целыми весами связей.

Доказательство. Обозначим множество примеров одного класса (правильный ответ равен 0) через , а другого (правильный ответ равен 1) — через . Вычислим максимальное и минимальное значения суммы в правой части (1):

Определим допуск как минимум из и . Положим , где — число слагаемых в (1). Поскольку персептрон (1) решает поставленную задачу классификации и множество примеров в обучающей выборке конечно, то 0″ src=»http://algmet.simulacrum.me/tai/l3/6340ec0d87e406c7c38e90704096a1a8.png» w >. Из теории чисел известна теорема о том, что любое действительное число можно сколь угодно точно приблизить рациональными числами. Заменим веса на рациональные числа так, чтобы выполнялись следующие неравенства: .

Из этих неравенств следует, что при использовании весов персептрон будет работать с теми же результатами, что и первоначальный персептрон . Действительно, если правильным ответом примера является 0, имеем .

Подставив новые веса, получим:

Откуда следует необходимое неравенство

Аналогично, в случае правильного ответа равного 1, имеем , откуда, подставив новые веса и порог, получим:

s-(m+1)\delta=0. » src=»http://algmet.simulacrum.me/tai/l3/361cc24037117081ee36781afa0870a1.png» w >

Отсюда следует выполнение неравенства

0. » src=»http://algmet.simulacrum.me/tai/l3/1d3a0650cc4e269d835d798d7f644726.png» w > (3)

Неравенства (2) и (3) доказывают возможность замены всех весов и порога любого персептрона рациональными числами. Очевидно также, что при умножении всех весов и порога на одно и то же ненулевое число персептрон не изменится. Поскольку любое рациональное число можно представить в виде отношения целого числа к натуральному числу, получим

0\Bigr]= \Bigl[\sum_^m w_i’ x_i>0\Bigr]= \Bigl[\sum_^m \frac x_i>0\Bigr], » src=»http://algmet.simulacrum.me/tai/l3/3eb30fa8804b38a58a788ba622b733f9.png» w > (4)

где — целые числа. Обозначим через произведение всех знаменателей: . Умножим все веса и порог на . Получим веса целочисленные . Из (2), (3) и (4) получаем

0\Bigr]= \Bigl[\sum_^m w_i’ x_i>0\Bigr]= \Bigl[\sum_^m \frac x_i>0\Bigr]= \Bigl[\sum_^m w_i»’ x_i>0\Bigr], » src=»http://algmet.simulacrum.me/tai/l3/876efdb6faf3edd3d060395a6230e05f.png» w >

что и завершает доказательство теоремы.

Поскольку из доказанной теоремы следует, что веса персептрона являются целыми числами, то вопрос о выборе шага при применении правил обучения решается просто: веса и порог следует увеличивать (уменьшать) на единицу.

Двуслойность персептрона

Как уже упоминалось в начале лекции, алгоритм обучения персептрона возможно использовать и для многослойных персептронов . Однако теоремы о сходимости и зацикливании персептрона , приведенные выше, верны только при обучении однослойного персептрона — или многослойного персептрона при условии, что обучаются только веса персептрона , стоящего в последнем слое сети. В случае произвольного многослойного персептрона они не работают. Следующий пример демонстрирует основную проблему, возникающую при обучении многослойных персептронов .

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

В действительности, проблема настройки (обучения) многослойного персептрона решается следующей теоремой.

Теорема о двуслойности персептрона. Любой многослойный персептрон может быть представлен в виде двуслойного персептрона с необучаемыми весами первого слоя.

Для доказательства этой теоремы потребуется одна теорема из математической логики.

Теорема о дизъюнктивной нормальной форме. Любая булева функция булевых аргументов может быть представлена в виде дизъюнкции конъюнкций элементарных высказываний и отрицаний элементарных высказываний:

Напомним некоторые свойства дизъюнктивной нормальной формы.

Свойство 1. В каждый конъюнктивный член (слагаемое) входят все элементарные высказывания либо в виде самого высказывания, либо в виде его отрицания.

Свойство 2. При любых значениях элементарных высказываний в дизъюнктивной нормальной форме может быть истинным не более одного конъюнктивного члена (слагаемого).

Доказательство теоремы о двуслойности персептрона . Из теоремы о дизъюнктивной нормальной форме следует, что любой многослойный персептрон может быть представлен в следующем виде:

В силу второго свойства дизъюнктивной нормальной формы, равенство (5) можно переписать в виде

0\right]. » src=»http://algmet.simulacrum.me/tai/l3/7d6782b932b94b7cff6d148c958b3fb6.png» w > (6)

Переведем в арифметическую форму все слагаемые в выражении (6). Конъюнкцию заменяем на умножение, а отрицание на разность: . Произведя эту замену и приведя подобные члены, получим:

0\right], » src=»http://algmet.simulacrum.me/tai/l3/a359d1c3468b5701eea43f59ef563b5c.png» w > (7)

где — множество индексов сомножителей в -м слагаемом, — число, указывающее, сколько раз такое слагаемое встретилось в выражении (6) после замены и раскрытия скобок (число подобных слагаемых).

Заменим -е слагаемое в формуле (7) персептроном следующего вида:

|I_l|-1\right]. » src=»http://algmet.simulacrum.me/tai/l3/86eb903d6fa4d955a1ada791fbe0bd63.png» w > (8)

Подставив выражение (8) в формулу (7), получим равенство (1), то есть произвольный многослойный персептрон представлен в виде (1) с целочисленными коэффициентами. В качестве персептронов первого слоя используются персептроны вида (8) с необучаемыми весами. Теорема доказана.

Подводя итоги данной лекции, следует отметить следующие основные свойства персептронов :

  1. Любой персептрон может содержать один или два слоя. В случае двухслойного персептрона веса первого слоя не обучаются.
  2. Веса любого персептрона можно заменить на целочисленные.
  3. При обучении после конечного числа итераций возможны два исхода: персептрон обучится или вектор весов персептрона будет повторяться ( персептрон зациклится).

Знание этих свойств позволяет избежать «усовершенствований» типа модификации скорости обучения и других, столь же «эффективных» модернизаций.

Трудности с алгоритмом обучения персептрона

Иногда бывает сложно определить, выполнено ли условие разделимости для конкретного обучающего множества. Кроме того, во многих встречающихся на практике ситуациях входы часто меняются во времени и могут быть разделимы в один момент времени и неразделимы — в другой. В доказательстве алгоритма обучения персептрона ничего не говорится также о том, сколько шагов требуется для обучения сети. Мало утешительного знать, что обучение закончится за конечное число шагов, если необходимое для этого время сравнимо с геологической эпохой. Кроме того, не доказано, что персептронный алгоритм обучения более быстр по сравнению с простым перебором всех возможных значений весов, и в некоторых случаях этот примитивный подход может оказаться лучше.

На эти вопросы никогда не находилось удовлетворительного ответа, они относятся к природе обучающего материала. В различной форме они возникнут на последующих лекциях, где рассматриваются другие сетевые парадигмы. Ответы для современных сетей, как правило, не более удовлетворительны, чем для персептрона . Эти проблемы являются важной областью современных исследований.

Персептрон Розенблатта — машина, которая смогла обучаться

Персептрон – это нейронная сеть, которая представляет собой алгоритм для выполнения двоичной классификации. Он определяет, относится ли объект к определенной категории (например, является ли животное на рисунке кошкой или нет).

Персептрон занимает особое место в истории нейронных сетей и искусственного интеллекта, потому что первоначальные иллюзии по поводу его эффективности привели к появлению т. н. опровержения Минского-Паперта и застою в исследованиях нейронных сетей, который продлился несколько десятилетий. Лед тронулся после публикации работ Джеффа Хинтона в 2000-х годах, результаты которого преобразили все области машинного обучения.

Фрэнк Розенблатт, родоначальник персептрона, популяризировал его как устройство, а не алгоритм. Персептрон впервые вошел в мир в качестве аппаратного обеспечения. Розенблатт, психолог, который учился, а затем и читал лекции в Корнельском университете, получил финансирование от Управления по морским исследованиям в США, чтобы сконструировать машину, которая могла бы обучаться. Его машина, названная «Mark I», выглядела так:

Персептрон представляет собой линейный классификатор, то есть алгоритм, который классифицирует объект путем разделения двух категорий прямой. Объектом обычно является вектор-функция x, взятая с весом w и смещенная на b: y = w * x + b.

На выходе персептрон выдает результат y, основанный на нескольких вещественных входных объектах путем формирования линейной комбинации с использованием весовых коэффициентов (иногда с последующим пропусканием результата через нелинейную функцию активации). Вот как это выглядит на языке математики:

где w – вектор весовых коэффициентов, x – вектор входных объектов, b – смещение, φ – функция нелинейной активации.

Розенблатт разработал однослойный персептрон. Это значит, что его аппаратный алгоритм не включал в себя несколько уровней, которые позволяют нейронным сетям моделировать иерархию признаков. Это была мелкая нейронная сеть, которая мешала персептрону выполнять нелинейную классификацию, например, вычислять значение функции XOR (триггером оператора XOR является несовпадение двух объектов, другое название – «исключающее или»), как показали Минский и Паперт в своей книге.

Многослойный персептрон

Последующее исследование многослойных персептронов показало, что они способны аппроксимировать как оператор XOR, так и многие другие нелинейные функции.

Так же, как Розенблатт основал персептрон на нейроне Маккаллоха-Питса, разработанном в 1943 году, так и сами персептроны являются строительными блоками, которые могут быть полезны только в таких больших функциях, как многослойные персептроны.

Многослойный персептрон — это хорошая стартовая точка для изучения глубокого обучения.

Многослойный персептрон представляет собой глубокую искусственную нейронную сеть, включающую в себя несколько персептронов. Многослойные персептроны состоят из входного слоя для приема сигнала, выходного слоя, который принимает решение или делает предсказание о входном объекте, а между ними – произвольное количество скрытых слоев, которые являются истинным вычислительным движком. Многослойные персептроны с одним скрытым слоем способны аппроксимировать любую непрерывную функцию.

Как работает персептрон

Персептроны часто применяются для решения контролируемых задач обучения: они тренируются по набору пар входных/выходных объектов и учатся моделировать корреляции (т. е. зависимости) между этими данными. Обучение включает в себя настройку параметров модели (весовых коэффициентов, смещений) для минимизации погрешности. Для корректировки этих параметров относительно погрешности используется алгоритм обратного распространения, а сама погрешность может быть вычислена различными способами, в том числе путем вычисления среднеквадратичного отклонения (RMSE).

Сети прямого распространения, такие как многослойный персептрон, похожи на теннис или пинг-понг. Они в основном состоят из двух видов движений: вперед и назад. Получается своеобразная игра в пинг-понг между догадками и ответами, поскольку каждая догадка – это проверка того, что мы знаем, а каждый ответ – это обратная связь, позволяющая нам узнать, насколько сильно мы ошибаемся.

При шаге вперед поток сигнала перемещается от входного слоя через скрытые к выходному, а решение, полученное на выходном слое, сравнивается с априорно известным верным ответом.

При шаге назад с использованием правила дифференцирования сложных функций через персептрон в обратном направлении распространяются частные производные функции, погрешности по весовым коэффициентам и смещениям. Данный акт дифференцирования дает нам градиент погрешности, с использованием которого могут быть скорректированы параметры модели, так как они приближают МП на один шаг ближе к минимуму погрешности. Это можно сделать с помощью любого алгоритма градиентной оптимизации, например, методом стохастического градиентного спуска. Сеть продолжает играть в пинг-понг, пока погрешность не исчезнет. В этом случае, как говорят, наступает сходимость.

Совершенствование персептрона

Важно отметить, что программное обеспечение и аппаратные средства существуют на блок-схеме: программное обеспечение может быть представлено как аппаратное, так и наоборот. Когда программируются микросхемы (такие как FPGA) или конструируются интегральные схемы (например, ISIC), путем вытравливания определенного алгоритма в кремнии, мы всего навсего реализуем программное обеспечение на одном уровне ниже для увеличения скорости его работы. Аналогично, то, что вытравлено в кремнии или связано с лампами и потенциометрами (например, «Mark I» Розенблатта), также может быть выражено в виде кода. Вот почему Алан Кей сказал: «Люди, которые действительно серьезно относятся к программному обеспечению, должны создавать собственное оборудование». Но бесплатный сыр бывает только в мышеловке: выигрывая в скорости работы путем вытравливания алгоритмов, вы проигрываете в возможности их модификации. Это является реальной проблемой в машинном обучении, где алгоритмы самопроизвольно изменяются по мере обработки данных. Задача состоит в том, чтобы найти те части алгоритма, которые остаются стабильными даже при изменении параметров, например, операции с линейной алгеброй, которые в настоящее время обрабатываются GPU быстрее всего.

Дальнейшее изучение вопроса может привести вас к потребности разработки все более и более сложных и полезных алгоритмов. Мы переходим от одного нейрона к совокупности нескольких, называемой слоем; затем переходим от одного слоя к совокупности нескольких, называемой многослойным персептроном. Можем ли мы перейти от одного МП к нескольким, или же мы просто будем дальше нагромождать слои, как это сделала Microsoft со своим лидером ImageNet, ResNet, в котором было более 150 слоев? Или же правильным является комбинирование МП – ансамбля многих алгоритмов, голосующих в своего рода вычислительной демократии за лучший прогноз? Или это по сути лишь встраивание одного алгоритма в другой, как это происходит со сверточными графовыми сетями?


Персептроны. Обучение персептрона

Алгоритм обучения однослойного персептрона

Персептрон должен решать задачу классификации по бинарным входным сигналам. Набор входных сигналов будем обозначать -мерным вектором Все элементы вектора являются булевыми переменными (переменными, принимающими значения » Истина » или » Ложь «). Однако иногда полезно оперировать числовыми значениями. Будем считать, что значению » ложь » соответствует числовое значение 0, а значению » Истина » соответствует 1.

Персептроном будем называть устройство, вычисляющее следующую систему функций:

\theta\Bigr],\quad «> ( 1)

где — веса персептрона , — порог, — значения входных сигналов, скобки означают переход от булевых (логических) значений к числовым значениям по правилам, изложенным выше.

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

Предложенный Ф.Розенблаттом метод обучения состоит в итерационной подстройке матрицы весов , последовательно уменьшающей ошибку в выходных векторах. Алгоритм включает несколько шагов:

Шаг 0 Начальные значения весов всех нейронов полагаются случайными
Шаг 1 Сети предъявляется входной образ , в результате формируется выходной образ
Шаг 2 Вычисляется вектор ошибки , делаемой сетью на выходе. Дальнейшая идея состоит в том, что изменение вектора весовых коэффициентов в области малых ошибок должно быть пропорционально ошибке на выходе и равно нулю, если ошибка равна нулю.
Шаг 3 Вектор весов модифицируется по следующей формуле: Здесь — темп обучения.
Шаг 4 Шаги 1—3 повторяются для всех обучающих векторов. Один цикл последовательного предъявления всей выборки называется эпохой. Обучение завершается по истечении нескольких эпох: а) когда итерации сойдутся, т.е. вектор весов перестает изменяться, или б) когда полная, просуммированная по всем векторам абсолютная ошибка станет меньше некоторого малого значения.

Объясним данный алгоритм более подробно. Подаем на вход персептрона такой вектор , для которого уже известен правильный ответ. Если выходной сигнал персептрона совпадает с правильным ответом, то никаких действий предпринимать не надо. В случае ошибки, необходимо обучить персептрон правильно решать данный пример. Ошибки могут быть двух типов. Рассмотрим каждый из них.

Первый тип ошибки: на выходе персептрона — 0, а правильный ответ — 1. Для того чтобы персептрон выдавал правильный ответ , необходимо, чтобы сумма в правой части (1) стала больше. Поскольку переменные принимают значения 0 или 1, увеличение суммы может быть достигнуто за счет увеличения весов Однако нет смысла увеличивать веса при переменных , которые равны нулю. Таким образом, следует увеличить веса при тех переменных xi , которые равны 1.

Первое правило. Если на выходе персептрона получен 0, а правильный ответ равен 1, то необходимо увеличить веса связей между одновременно активными нейронами. При этом выходной персептрон считается активным. Второй тип ошибки: на выходе персептрона — 1, а правильный ответ равен нулю. Для обучения правильному решению данного примера следует уменьшить сумму в правой части (1). Следовательно, необходимо уменьшить веса связей при тех переменных, которые равны 1 (поскольку нет смысла уменьшать веса связей при равных нулю переменных ). Необходимо также провести эту процедуру для всех активных нейронов предыдущих слоев. В результате получаем второе правило.

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

Таким образом, процедура обучения сводится к последовательному перебору всех примеров обучающего множества с применением правил обучения для ошибочно решенных примеров. Если после очередного цикла предъявления всех примеров окажется, что все они решены правильно, то процедура обучения завершается.

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

Ответ на первый вопрос дают следующие теоремы.

Теорема о сходимости персептрона . Если существует вектор параметров , при котором персептрон правильно решает все примеры обучающей выборки, то при обучении персептрона по вышеописанному алгоритму решение будет найдено за конечное число шагов.

Теорема о «зацикливании» персептрона . Если не существует вектора параметров , при котором персептрон правильно решает все примеры обучающей выборки, то при обучении персептрона по данному правилу через конечное число шагов вектор весов начнет повторяться.

Таким образом, данные теоремы утверждают, что, запустив процедуру обучения персептрона , через конечное время мы либо получим обучившийся персептрон , либо ответ, что данный персептрон поставленной задаче обучиться не может.

Доказательства этих теорем в данное учебное пособие не включены.

Нейрокомпьютерная техника алгоритм обучения персептрона

В предыдущей главе вы усвоили необходимые общие теоретические сведения по ИНС: устройство искусственного нейрона и нейронных сетей, общие подходы к их обучению.

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

История персептрона

Понятия искусственного нейрона и искусственной нейронной сети появились достаточно давно, еще в 1943 году. Эта была чуть ли не первая статья, в которой предпринимались попытки смоделировать работу мозга. Ее автором был Уоррен Мак-Каллок.

Эти идеи продолжил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его «персептроном» (от латинского perceptio – восприятие) . В 1960 году Розенблатт представил первый нейрокомпьютер – «Марк-1», который был способен распознавать некоторые буквы английского алфавита.

Таким образом персептрон является одной из первых моделей нейросетей, а «Марк-1» – первым в мире нейрокомпьютером.

Персептроны стали очень активно исследовать. На них возлагали большие надежды. Однако, как оказалось, они имели серьезные ограничения. Был такой ученый Минский, который был сокурсником Розенблатта. Видимо, ему не очень понравилось, как все вокруг боготворили персептроны, и он написал целую книгу (1971 год), в которой провел детальнейший их анализ, попутно показав, что они не так уж много и умеют, да и вообще сильно ограничены.

Розенблатт не успел написать ответ Минскому, так как погиб в свой 43 день рождения при крушении лодки.

С тех пор энтузиазм ученых в исследовании персептронов и искусственных сетей поутих. Хотя Минский позднее говорил, что сожалеет, что его книга нанесла такой удар по концепции персептронов. Стали перспективными другие области. Про нейросети забыли. Но потом были открыты новые виды сетей, а также алгоритмы их обучения, что вновь возродило интерес к этой области.

Теперь подробно разберем, что из себя представляет персептрон.

Персептрон

В основе персептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.

Рассмотрим принцип работы персептрона.

Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен 0), либо в состоянии возбуждения (сигнал равен 1).

Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только -1, 0 или 1.

Затем сигналы от сенсорных элементов, прошедших по S-A связям попадают в A-элементы, которые еще называют ассоциативными элементами. Стоит заметить, что одному A-элементу может соответствовать несколько S-элементов. Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог ​ \( \theta \) ​, то этот A-элемент возбуждается и выдает сигнал, равный 1. В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал.

Почему A-элементы назвали ассоциативными? Дело в том, что A-элементы являются агрегаторами сигналов от сенсорных элементов. Например, у нас есть группа сенсоров, каждый из которых распознает кусок буквы «Д» на исследуемой картинке. Однако только их совокупность (то есть когда несколько сенсоров выдали сигнал, равный 1) может возбудить A-элемент целиком. На другие буквы А-элемент не реагирует, только на букву «Д». То есть он ассоциируется с буквой «Д». Отсюда и такое название.

Можно привести и другой пример. На самом деле ваши глаза состоят из невероятного количества S-элементов (сенсоров), улавливающих падающий свет (около 140 000 000). И у вас какой-то A-элемент, который распознает конкретную часть лица. И вот вы увидели на улице человека. Некоторые A-элементы, которые распознали конкретные части лица, возбуждаются.

Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого вам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса. Однако здесь они уже могут принимать любые значения (в отличие от S-A связей).

Финальный аккорд. R-элемент складывает друг с другом взвешенные сигналы от A-элементов и, если превышен определенный порог, генерирует выходной сигнал, равный 1. Это означает, что в общем потоке информации от глаз мы распознали лицо человека.

Если порог не превышен, то выход персептрона равен -1. То есть мы не выделили лицо из общего потока информации.

Так как R-элемент определяет выход персептрона в целом, его назвали реагирующим.

Теперь вы знаете, что такое персептрон и как он работает. Сформулируем теперь его точное определение:

Выше я рассказал о персептроне в самом общем виде. Есть несколько подвидов персептронов, на некоторых из которых мы и сконцентрируем все внимание.

Классификация персептронов

Исторически сложилось несколько типов персептронов. Их часто путают, так как разные авторы, писавшие статьи на эту тему, зачастую понимали под персептроном похожие, но все же разные математические модели. Именно поэтому человеку, который только начинает изучение ИНС бывает трудно разобраться, что такое персептрон, ведь в разных книгах на эту тему его определяют по-разному. Я постараюсь разъяснить все так, что вы не будете путаться в терминологии, читая другие книги.

Персептрон с одним скрытым слоем

Я уже приводил общее определение персептрона выше. Теперь рассмотрим его подвид – персептрон с одним скрытым слоем (или элементарный персептрон). Именно этот тип персептронов часто подразумевают, когда говорят о персептронах вообще.

Почему слой именно скрытый? Потому что слой А-элементов расположен между слоями S-элементов и R-элементов.

Обе картинки выше изображают именно персептрон с одним скрытым слоем.

Однослойный персептрон

Названия похожие. Но это не тоже самое, что и персептрон с одним скрытым слоем, хотя так может показаться. Именно этот тип персептронов мы и будем изучать подробнее всего. Этот тип персептронов, как и элементарные персептроны, тоже часто подразумевают, когда говорят о персептронах вообще.

Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный +1, а порог A элементов равен 1.

Объясню подробнее. Возьмем картинку персептрона в общем смысле и преобразуем ее в картинку однослойного персептрона.

Изначально персептрон в общем смысле выглядит так:

Исходя из ключевой особенности однослойного персептрона сенсор может быть однозначно связан только с одним ассоциативным элементом. Посмотрим на белый сенсор на картинке (левый верхний угол). Он передает сигнал салатовому (первому) и серому (четвертому) ассоциативным элементам. Непорядок. Сенсор может передавать сигнал только одному А-элементу. Убираем лишнюю связь. Ту же операцию проводим и с другими сенсорами.

Обязательно убедитесь, что поняли фразу «каждый S-элемент однозначно соответствует одному A-элементу». Это означает, что каждый сенсор может передавать сигнал только одному А-элементу. Однако это утверждение вовсе не запрещает ситуации, когда несколько сенсоров передают сигнал на один А-элемент, что и продемонстрировано на картинке выше (1, 2 и 3 А-элементы).

Далее, S-A связи всегда имеют вес, равный единице, а порог А-элементов всегда равен +1. С другой стороны нам известно, что сенсоры могут подавать сигнал равный только 0 или 1.

Рассмотрим первый S-элемент на последней картинке. Пусть он генерирует сигнал, равный единице. Сигнал проходит по S-A связи и не изменяется, так как любое число, умноженное на 1 равно самому себе. Порог любого А-элемента равен 1. Так как сенсор произвел сигнал, равный 1, то А-элемент однозначно возбудился. Это означает, что он выдал сигнал, равный 1 (так как он тоже может генерировать только 1 или 0 на своем выходе). Далее этот единичный сигнал умножается на произвольный вес A-R связи и попадает в соответствующий R-элемент, который суммирует все поступившие на него взвешенные сигналы, и если они превышают его порог, выдает +1. В противном случае выход данного R-элемента равен -1.

Ничего на напоминает? Правильно, не считая сенсорных элементов и S-A связей, мы только что описали схему работы искусственного нейрона. И это неслучайно. Однослойный персептрон действительно представляет собой искусственный нейрон с небольшим отличием. В отличие от искусственного нейрона, у однослойного персептрона входные сигналы могут принимать фиксированные значения: 0 или 1. У искусственного нейрона на вход можно подавать любые значения.

В персептроне R-элементы суммируют взвешенные входные сигналы и, если взвешенная сумма выше некоторого порога, выдают 1. Иначе выходы R-элементов были бы равны -1.

Нетрудно догадаться, что такое поведение легко задается функцией активации под названием функция единичного скачка, которую мы уже рассматривали во 2 главе. Отличие заключается в том, что функция единичного скачка выдает 0, если порог не превышен, а здесь выдает -1, но это не существенно.

Таким образом становится ясно, что часть однослойного персептрона (выделена черным прямоугольником на картинке выше) можно представить в виде искусственного нейрона, но ни в коем случае не путайте два этих понятия. Во-первых, никто не отменял S-элементы, которых в искусственном нейроне просто нет. Во-вторых, в однослойном персептроне S-элементы и A-элементы могут принимать только фиксированные значения 0 и 1, тогда как в искусственном нейроне таких ограничений нет.

Часть однослойного персептрона соответствует модели искусственного нейрона.

Однослойный персептрон может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.

Многослойный персептрон

Под многослойным персептроном понимают два разных вида: многослойный персептрон по Розенблатту и многослойный персептрон по Румельхарту.

Многослойный персептрон по Розенблатту содержит более 1 слоя А-элементов.

Многослойный персептрон по Румельхарту является частным случаем многослойного персептрона по Розенблатту, с двумя особенностями:

  1. S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями.
  2. Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.

Этот метод является краеугольным камнем обучения всех многослойных ИНС. Во многом благодаря ему возобновился интерес к нейронным сетям. Но обсуждать мы его будем в других главах.

Многослойный персептрон по Румельхарту — многослойный персептрон по Розенблатту, у которого обучению подлежат еще и S-A связи, а также само обучение производится по методу обратного распространения ошибки.

Опорная схема

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

Мы разобрались с видами персептронов. Далее в этой главе рассмотрим только однослойный персептрон с одним скрытым слоем.

Говоря про персептрон я буду иметь ввиду именно его.

Какие задачи решает персептрон?

Перед началом практики я хотел бы рассказать подробнее о том, какие задачи персептрон способен решать, а какие нет. Также я приведу несколько удобных аналогий, позволяющих понять, возможно ли использовать персептрон в данной задаче или нет. Это крайне важно, так как персептрон, как простейший вид нейросети, не так уж много и умеет.

Персептроны очень хорошо решают задачи классификации. Что это означает? Если у вас есть группы объектов (например, кошки и собаки), то персептрон после обучения сможет указывать к какой группе относится объект (к кошкам или собакам).

«Очень хорошо» – понятие растяжимое. Насколько хорошо? Розенблатт доказал несколько теорем, суть которых я попытаюсь донести максимально понятным образом.

Объясняю на пальцах. Под полем сенсоров понимается множество всех S-элементов. Под классификацией – придуманные нами классы (те же кошки и собаки). Под «непустым множеством элементарных персептронов, проводящих успешную классификацию» понимается, что найдется хотя бы один перспетрон, справившийся с классификацией объектов.

Рассмотрим на примере.

Я хочу, чтобы персептрон научился различать кошек и собак. Это задача довольно трудная, но мы ее существенно упростим.

У нас будет 3 сенсора: длина лап, окрас и форма морды. Так как S-элементы могут принимать значения 0 или 1, то условимся, что значения 1 будут соответствовать коротким лапам, смешанному окрасу и округлая морда соответственно. Значения 0 будут означать признак собаки на данном S-элементе (длинные лапы, однотонный окрас и вытянутая морда). Вот мы и получили сенсорное поле. Если хотите, его можно представить в виде множества возможных значений 0 и 1 у каждого S-элемента. Например, абсолютная кошка должна вызвать срабатывание всех S-элементов ​ \( \ <1,1,1\>\) ​.

Идеальной же собаке соответствует следующий набор выходов S-элементов: ​ \( \ <0,0,0\>\) ​.

Сами по себе сенсоры не играют роли. Но добавив к набору выходов сенсоров смысл: кошка или собака, мы тем самым задали некоторую классификацию. Математически это означает, что мы задали некоторую функцию, которая принимает набор выходов S-элементов, а ее значением является 0 или 1 (кошка или собака).

Из приведенной выше теоремы следует, что множество персептронов, правильно проводящих нашу классификацию не является пустым. То есть такие персептроны есть!

Но ведь можно выбрать любой набор S-элементов и любую классификацию. И множество «решений» все равно не будет пустым!

Это означает, что теоретически персептроны способны решать любую задачу на классификацию.

Важное замечание!
1. Речь идет об элементарных персептронах.
2. Объекты классификации должны обладать свойством линейной разделимости (подробнее о ней ниже).

Но есть и вторая теорема, доказанная Розенблаттом:

Под произвольным исходным состоянием тут понимается персептрон с произвольными S-A и A-R весами связей. Под решением в теореме понимается персептрон с определенными весами, успешно решающий нашу задачу на классификацию.


Эта теорема не оставляет задачам на классификацию никаких шансов. Теперь нам известно, что мы всегда сможем решить нашу задачу за конечный промежуток времени. Единственный нюанс заключается в том, что никто не говорит о длительности «конечного промежутка времени». Секунда, минута, час, год, 1 000 лет?

Обе теоремы имеют доказательства, но здесь мы их рассматривать не будем.

Метод коррекции ошибок – один из алгоритмов изменения весов. В этой главе мы его также разберем.

Итак, элементарные персептроны гарантировано решают задачи на классификацию линейно разделимых объектов. Может показаться, что это мало. Но это не так. Существует очень много задач на классификацию, а многие можно к ним свести.

Линейная разделимость

Давайте, для понятности, визуализируем классификацию линейно разделимых объектов на примере кошек и собак. Чтобы их различать (классифицировать) введем для простоты всего два параметра: размер и прирученность. По сочетанию размера и прирученности нейронная сеть должна будет принять решение: кошка это или собака. Не может быть одновременно кошка и собака для одинаковых показателей размера и прирученности.

В этом случае потребуется всего два S-элемента, определяющие размер и прирученность. Так как размер животного и степень его прирученности могут быть разными и иметь промежуточные значения, то давайте немного отойдем от принятого определения S-элемента. Представим, что он может выдавать не только 0 (маленький размер, совсем дикий) или 1 (большой, полностью ручной), но и другие значения.

Так как у нас есть два сенсорных элемента, то их значения можно расположить вдоль двух координатных осей. На получившейся координатной плоскости можно размещать точки, каждая из которых характеризует какой-то вид кошки или собаки. Как вы знаете, у каждой точки есть координаты. В нашем случае их две: размер и прирученность. Так вот, задачей персептрона в данном случае (основанного на двух S-элементах) – провести некоторую прямую, которая максимально точно разделит два множества точек (кошек и собак). На рисунке ниже видно 4 этапа обучения сети на все более большой обучающей выборке.

Естественно, что у нас может быть больше признаков, а значит, и больше сенсорных элементов. В случае трех признаков будет три S-элемента, то есть имеем уже трехмерное пространство. В таком случае, между точками, каждая из которых соответствует определенным значениям всех трех S-элементов, проводилась бы плоскость. И так далее. В общем случае для ​ \( n \) ​ S-элементов в ​ \( n \) ​-мерном пространстве строится так называемая гиперплоскость с размерностью ​ \( n-1 \) ​.

Вы заметили, что в картинках выше в качестве разделителя используется прямая? А ведь мы могли бы в качестве разделителя использовать и любую другую кривую. Но прямая – проще. Именно поэтому в этой главе я рассматриваю задачи на классификацию линейно (от слова линия) разделимых объектов. Именно такие задачи способны решать элементарные персептроны.

Конечно, бывают и такие множества объектов, которые невозможно разделить линией (плоскостью/гиперплоскостью). В общем случае, такие множества называют линейно неразделимыми и в этой главе мы не будем их рассматривать. Теоремы о сходимости элементарных пересептронов на них не распространяются.

Задача на классификацию

Можно ли классифицировать логические функции? Да, и к тому же эта задача отлично проиллюстрирует такую классификацию.

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

Что такое логические функции? Это функции от какого-то числа переменных. Причем как сами переменные, так и значения логических функций могут принимать только фиксированные (дискретные) значения: 0 или 1.

Начнем с логического «И». Вы отправили Сашу в магазин за продуктами. Ему надо купить хлеб и квас. Если он ничего не купил, вы не пускаете его домой. Если он купил только хлеб или только квас, вы не пускаете его домой. Другими словами, Саша может войти в дом только когда он купил хлеб И квас. Также работает и логическое «И». У нас есть две бинарные переменные (то есть они могут быть равны только 0 или 1). Значением функции логического «И» будет 1 только тогда, когда значения обеих переменных тоже равны 1. Во всех остальных случаях значение этой логической функции равно 0.

Для того чтобы лучше понимать принцип работы логической функции, часто используют таблицы истинности, где в первых двух столбцах располагают возможные комбинации переменных, а в третьем значение функции в данном случае.

Вот, например, таблица истинности для логического И.

X1 X2 Значение функции
1
1
1 1 1

А есть еще логическое «ИЛИ». Снова посылаем Сашу в магазин за продуктами. Ему надо купить хлеб и квас. Если он ничего не купил, вы не пускаете его домой. Если он купил только хлеб или только квас, или оба продукта – вы пускаете его домой. Также работает и логическое «ИЛИ». Значением функции логического «ИЛИ» будет 0 только тогда, когда значения обеих переменных тоже равны 0. Во всех остальных случаях значение этой логической функции равно 1.

Таблица истинности для логического ИЛИ выглядит следующим образом.

X1 X2 Значение функции
1 1
1 1
1 1 1

Логические функции очень красиво иллюстрируют идею классификации. Любая такая функция принимает на вход два аргумента. По счастливой случайности точки на плоскости задаются двумя числами (x и y)! Но логические функции могут принимать только дискретные аргументы (0 или 1). В итоге получаем, что для изображения любой логической функции на плоскости достаточно 4 точки (с координатами ​ \( (0,0) \) ​ ​ \( (1,0) \) ​ ​ \( (0,1) \) ​ ​ \( (1,1) \) ​). Вот так это выглядит:

Рассмотрим логическую функцию И. Она равна нулю для любого набора входных аргументов, кроме набора ​ \( (1,1) \) ​.

X1 X2 Логическое И
1
1
1 1 1

Налицо задача классификации: у нас есть 4 точки. Мы должны провести прямую так, чтобы по одну сторону у нас оказались точки, для которых значения логического И равно 1, а по другую, для которых это значение равно 0.

В случае с логическим И эту прямую, например, можно провести так, как показано на рисунке ниже. Все точки, находящиеся под этой прямой, приводят к 0 значению этой функции. Единственная точка над этой прямой приводит к значению логического И, равному 1.

Похожим образом ведет себя логическое ИЛИ, имеющее следующую таблицу истинности:

X1 X2 Логическое ИЛИ
1 1
1 1
1 1 1

Для такой функции графическое представление будет выглядеть так:

Нетрудно заметить, что данная картинка представляет собой графическое представление логического И, но наоборот (тоже одна точка, но для которой значение функции равно 0 и уже под прямой).

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

Теперь мы переходим к краеугольному камню нейронных сетей — их обучению. Ведь без этого свойства они не имеют никакого смысла.

Обучение персептронов

Я рассказал практически все, что нужно знать про персептроны. Вы знаете, что они представляют собой и какие задачи способны решать. Настала пора поговорить и об их обучении. Как вы помните, под обучением нейронной сети имеется ввиду процесс корректировки весовых коэффициентов связи таким образом, чтобы в результате при поступлении на вход сети определенного сигнала она выдавала нам правильный ответ.

Упрощаем до предела

Начнем обучение наших нейронных сетей с самого простого случая. Для этого мы сильно упростим и без того простой однослойный персептрон с одним скрытым слоем:
1. Будем считать, что его A-R связи могут принимать только целые значения (…, -2, -1, 0, 1, 2, …).
2. Более того, у каждого А-элемента может быть только один S-элемент.
3. И у нас будет только 1 R-элемент.

На словах такое большое количество упрощений может выглядеть сложно. Поясним сказанное на схеме. Возьмем уже использовавшуюся картинку однослойного персептрона с одним скрытым слоем и преобразуем ее.

Изначально мы имеем следующий персептрон.

Мы должны упростить его. Теперь A-элементы могут быть соединены только с одним S-элементом. Убираем все лишние связи.

На картинке выше 3 R-элемента. Оставляем только один.

S-A веса и пороги A элементов у нас теперь равны +1. Отмечаем это на рисунке.

В итоге получаем следующую картину.

Однако получается, что у нас слой A-элементов не выполняет никакие функции. Он эквивалентен S-слою. Поэтому мы проводим следующее упрощение. Выбрасываем слой сенсоров. Теперь роль сенсоров у нас будут выполнять ассоциативные элементы (или наоборот, без разницы).

Итак, мы только что ну очень упростили однослойный персептрон с одним скрытым слоем.

Вы не поверите! Даже в таком кастрированном виде нейронная сеть будет работать и даже решать задачи на классификацию. И не только…

Сначала попробуем научить такую простую модель (к тому же полностью копирующую модель искусственного нейрона) решать простейшую задачу на классификацию. Например, распознавание цифр.

Практика: распознавание цифр

Картинка, как всем известно, состоит из пикселей. Так вот, очень удобно на каждый пиксель выделять один сенсор (для его распознавания).

Сейчас мы запрограммируем простейшую нейросеть, которая будет распознавать цифры. На самом деле это трудная задача, поэтому мы ее в очередной раз упростим:

  1. Будем распознавать только черно-белые цифры от 0 до 9.
  2. Цифры будут состоять из черных квадратиков в табличке 3×5 квадратов.
  3. Нейросеть будет распознавать только одну цифру.

Вот как выглядят наши цифры.

В нашей сети будет по 1 S-элементу (он же А-элемент) на каждый квадратик из таблички. Поэтому для распознавания цифры нам потребуется 15 сенсоров. Черный цвет квадрата соответствует возбуждению S-элемента (значение передаваемого сигнала равно 1). Белый цвет – выход соответствующего S-элемента равен 0.

Цифры в строковом формате

Чтобы работать с нейросетью, мы должны на ее входы подавать сигналы в виде чисел (0 или 1). Таким образом изображение цифры мы должны перевести в последовательность сигналов в виде чисел. Это легко сделать, если представить цифры в строковом формате.

Каждая цифра представляет собой всего пятнадцать квадратиков, причем только двух возможных цветов. Как и говорилось в предыдущем разделе, за белый квадратик отвечает 0, а черный квадратик – 1. Поэтому наши десять цифр от 0 до 9 в строковом формате будут выглядеть вот так:

Для записи каждой цифры у нас используется по 5 строк с 3 символами в каждой. Теперь уберем все переносы строк, чтобы получить для каждой цифры от 0 до 9 одну длинную строку длиной в 15 символов.

Цифры в таком строковом формате уже можно использовать для работы с нейросетью.

Еще раз поясню, почему мы не используем картинки, а перешли к строчкам символов. Взгляните на картинку ниже.

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

Такой простой пример не стоит таких больших усилий. Поэтому мы пропустим первые два этапа, указанные на картинке, и будем сразу подавать на вход нейросети цифры в строковом формате.

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

Мы хотим создать программу, которая из всех 10 цифр будет распознавать нужную нам цифру. Например, пусть это будет цифра 5 (можно и любую другую). Только и всего.

Нашей обучающей выборкой будут все цифры от 0 до 9. Когда нейросеть обучится безошибочно распознавать нужную нам цифру (5), тогда мы проверим ее «интеллект» уже на тестовой выборке. Она будет уже похитрее: на вход будут подаваться уже искаженные изображения пятерки.

Посмотрим, сможет ли обученная нейросеть с высокой точностью распознавать пятерку?

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

Алгоритм обучения

Наконец-то мы дошли до главного: как обучать сеть. В общих чертах процесс понятен. Мы будем случайным образом выбирать цифру и прогонять ее через сеть, модифицируя ее веса. Но как их модифицировать?

Мы знаем, что важность тем или иным входам (в нашем случае – S-элементам) придают веса, связывающие их с R-элементом. Таким образом, чем сильнее повлиял какой-то вес связи на результат, тем сильнее надо его изменить.

Следовательно, мы должны учесть следующие важные моменты:

  • Если наша нейросеть правильно распознала/отвергла цифру 5, то мы ничего не предпринимаем (все ведь замечательно!).
  • Если нейросеть ошиблась ираспозналаневерную цифру как 5, то мы должны ее наказать – мы уменьшаем веса тех связей, через которые прошел сигнал. Другими словами веса, связанные с возбудившимися входами, уменьшаются.
  • Если нейросеть ошиблась и не распознала цифру 5, то мы должны увеличить все веса, через которые прошел сигнал. Таким образом мы как бы говорим сети, что такие связи, а значит и связанные с ними входы – правильные.

Теперь запишем непосредственно алгоритм обучения, который мы будем реализовывать в программе:

  1. Подать на входы нейросети цифру в строковом формате.
  2. Если цифра распознана/отвергнута верно, то перейти к шагу 1.
  3. Если сеть ошиблась и распознала неверную цифру как 5, то вычесть из всех связей, связанных с возбудившимися S-элементами единицу.
  4. Если сеть ошиблась и отвергла цифру 5, то добавить единицу ко всем связям, связанным с возбудившимися S-элементами.

Почему в алгоритме мы прибавляем или отнимаем именно 1. На самом деле эту величину можно задать любой. Понятно, что эта величина влияет на эффективность обучения. Какой шаг обучения выбрать – это отдельный вопрос, который мы рассмотрим позднее.

Программа

Если вы не знакомы с языком программирования Python и/или не знаете, как приступить к работе, то рекомендую ознакомиться (можно бегло) с самым популярным самоучителем по Python.

Совершенно не обязательно писать нейросети на Python! Искусственные нейросети – математическая модель, и их можно запрограммировать с помощью любого языка. Так что если вам больше по душе Java, C, C#… то можете реализовывать сети на них. Никаких принципиальных различий нет. Алгоритм один и тот же. Реализация на разных языках разная.

Для начала импортируем модуль для работы со случайными числами.

Теперь давайте запишем все цифры от 0 до 9. Просто записывайте цифру в 5 строк по 3 символа, а затем удаляйте переносы строк (выше мы это уже рассматривали).

Функция list(*) позволяет нам создать список (массив), состоящий из отдельных символов, на которые разбивается длинная строка.

Далее, для простоты добавим все эти 10 цифр в список (для быстрого доступа к ним).

Теперь запишем 6 видов искаженной пятерки в строковом формате.

Теперь нам необходимо создать список весов. Помните теоремы об обучении персептронов? Там сказано, что сеть из любого состояния может обучиться правильно отвечать. Так что, чтобы не загадывать, пусть все веса вначале у нас будут равны 0. Так как у нас 15 входов и все они сразу соединены с одним R-элементом, то нам потребуется 15 связей.

Здесь я упростил запись, использовав генератор списков. Вместо этой записи вполне правомерно использовать обычный цикл, повторяющийся 15 раз и присваивающий всем элементам нашего списка весов 0:

Так как мы используем пороговую функцию активации, то нам необходимо установить какое-то число (порог). Если взвешенная сумма будет больше или равна ему, то сеть выдаст 1 (что означает, что она считает предоставленную цифру пятеркой). Порог можно выбрать любой. Пусть будет равен 7.

Теперь создадим простейшую функцию, которая будет считать взвешенную сумму и сравнивать ее с порогом. Фактически эта функция представляет собой единичный шаг работы нашей нейронной сети.

Результатом работы выражения return net >= bias этой функции может быть True (Правда/Да), что означает 1 или False (Ложь/Нет), что означает 0.

Теперь определим еще две вспомогательные функции.

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

Я использовал функцию int(number[i]) для преобразования символа ‘1’ в цифру 1. Если бы я этого не сделал, то возникла бы ошибка здесь if int(number[i]) == 1: , так как Python не умеет сравнивать символы (текст) с цифрами.

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


Теперь начнем обучать нашу нейронную сеть. Делать мы это будем в цикле, который будет повторятся достаточно большое количество раз. Для примера возьмем 10 000 раз. Действия за каждый этап повторения мы описали выше в алгоритме обучения.

Осталось только вывести результаты обучения. Выводить их мы будем следующим образом. Сначала выведем результирующие значения весов. Героев надо знать в лицо. После этого еще раз прогоним сеть по всем цифрам от 0 до 9, но уже без обучения. Просто чтобы удостоверится, что она обучилась. А в конце опробуем сеть на нашей тестовой выборке.

Если у вас отображаются какие-то ошибки или вы просто запутались в структуре, то вот полный код программы:

Готовы? Запускайте! Пробуйте! Должно сработать.

Мои результаты — сеть стала распознавать пятерку во все случаях только
с 3 попытки. Картинка кликабельна.

Не обязательно сеть научится распознавать пятерки из тестовой выборки с первой попытки. Если результат программы вас не устраивает (не вся тестовая выборка успешно прошла проверку), то просто запустите программу снова. Все будет сброшено и начнется с чистого листа.

Но почему сеть не обучается с первого раза?

При любом запуске программы 10 тысяч обучающих цифр генерятся случайным образом. Таким образом при каждом запуске программы процесс обучения сети уникален.

Из-за случайности генерации обучающих цифр они могут подаваться на вход неравномерно, а значит обучение будет идти однобоко. Действительно, если показывать только одну или две цифры, то сеть ничему не научится.

Чтобы сеть гарантированно научилась распознавать нужную нам цифру надо соблюсти два условия:

  1. Добиться равномерности показа всех обучающих цифр.
  2. Увеличить общее количество шагов обучения (50 тысяч или 100 тысяч).

Давайте поближе рассмотрим созданного нами монстра!
Что еще за Скайнет?

Рассмотрим мой результат. Начнем с первой строчки (это веса сети):

[1, 1, 1, 3, 0, -8, 1, 2, 1, -8, 0, 1, 1, 1, 1]

Теперь расположим эти цифры в виде «цифры».

1 1 1
3 0 -8
1 2 1
-8 0 1
1 1 1

Если приглядеться, то можно заметить цифру пять. Важно то, что все квадраты, составляющие силуэт пятерки положительные. Некоторые даже больше 1 (3 и 2). Мы получили как бы слепок весов нашей сети, наложенной на цифру пять.

Давайте предположим, что цифра указывает яркость конкретного квадрата. Получим следующую картинку.

Более темные квадраты уверяют нашу суеверную нейросеть, что предлагаемая цифра несомненно является пятеркой и вносят большой вклад в взвешенную сумму (3 и 2). Соответственно если в предлагаемой сети картинке эти квадраты черные, то взвешенная сумма наверняка будет больше порога. Серые области вносят обычный вклад (по 1) в взвешенную сумму. Красные квадратики вызывают отвращение у сети и их появление на входах приводит аж к отрицательным значениям (-8), что сильно снизит взвешенную сумму и она будет гарантированно ниже порога.

Получается, что сеть сама выделила хорошие/противные области, нужные ей для распознавания. Невероятно, да?

Но это еще не все. Дальше идет 9 строк обучающей выборки.

0 это 5? False
1 это 5? False
2 это 5? False
3 это 5? False
4 это 5? False
6 это 5? False
7 это 5? False
8 это 5? False
9 это 5? False

Все предложенные цифры наша нейросеть смело отвергает, клеймя их False.

Наконец, итоговый и самый желанный результат программы – тестовая выборка. Как вы видите, сеть прекрасно распознала и цифру 5, и шесть ее искаженных вариаций.

Узнал 5? True
Узнал 5 — 1? True
Узнал 5 — 2? True
Узнал 5 — 3? True
Узнал 5 — 4? True
Узнал 5 — 5? True
Узнал 5 — 6? True

Тем самым, даже на предельно упрощенном однослойном персептроне с одним скрытым слоем, который, кстати, представляет собой фактически один искусственный нейрон, мы смогли программно добиться эффекта обобщения. Сеть никогда не видела искаженные пятерки. Но она их узнала.

Напомню, что мы рассматривали очень упрощенный вариант сети, связи и входы которой могли быть только целыми числами. Название алгоритма обучения, который мы использовали: правила Хебба. Всего этих правил два и они соответствуют двум пунктам уже описанного выше алгоритма обучения.

1 Правило. Если сигнал персептрона неверен и равен 0, то необходимо увеличить веса тех входов, на которые была подана единица.

2 Правило. Если сигнал персептрона неверен и равен 1, то необходимо уменьшить веса тех входов, на которые была подана единица.

Правила Хебба часто встречается в литературе, как обучение с коррекцией ошибки.

Дельта-правило

Теперь попробуем обобщить правила Хебба на произвольные (не только 0/1) входы и связи (не только целые числа).

Пусть мы заранее знаем правильный выход нашей сети. Обозначим его за ​ \( d \) ​. Однако в процессе обучения сеть ошибается. Обозначим ответ сети за ​ \( y \) ​. Тогда мы можем получить ошибку/погрешность сети как разницу правильного и реального ответов:

Мы знаем, что решающую роль в преобразовании сигнала играют связи. Значит необходимо каким-то образом их изменять. Классический алгоритм изменения связей: дельта-правило.

\[ w_i(t+1)=w_i(t)+\delta x_i \eta \]

Разберем эту формулу. Сначала в общих чертах.

Для отображения количества шагов обучения сети я использую переменную ​ \( t \) ​. Очевидно, что наша цель – получить из старого значения веса связи ​ \( w_i(t) \) ​ новое значение ​ \( w_i(t+1) \) ​.

Для этого мы, как и в правилах Хебба, должны прибавить какое-то число к весу связи. Как раз эта добавка вычисляется по формуле ​ \( \delta x_i \eta \) ​. Разберем эту формулу.

Переменная ​ \( \delta \) ​ есть ошибка нейросети. Заметим сходство с правилами Хебба. Если нейросеть ответила правильно, то ожидаемый и реальный результаты равны и ​ \( \delta = 0 \) ​, а значит и вся добавка к весу связи равна ​ \( 0 \) ​. Вес не изменился.

В случае, если ​ \( \delta > 0 \) ​, а значит ​ \( d > y \) ​, то значение добавки к весу будет положительное. Вес связи увеличится (1 правило Хебба). Это соответствует случаю, когда сеть получила на вход 5, но не узнала ее.

В случае, если ​ \( \delta ​, а значит ​ \( d ​, то значение добавки к весу будет отрицательное. Вес связи уменьшится (2 правило Хебба). Это соответствует случаю, когда сеть неверно посчитала данное число за 5.

С ​ \( \delta \) ​ разобрались. Теперь перейдем к ​ \( x_i \) ​. Это значение, которое пришло на ​ \( i \) ​-ый вход сети. Опять же, чем более сильный сигнал поступил на вход, тем сильнее изменится вес, с этим входом связанный. Это логично. Ведь если на вход вообще не поступило сигнала (​ \( x_i = 0 \) ​), то и соответствующий вес не должен изменится (добавка будет равна нулю).

А теперь самое интересное: Скорость обучения ​ \( \eta \) ​.

Скорость обучения

Если с первыми двумя членами формулы добавки к весу ​ \( \delta x_i \eta \) ​ все просто и понятно, то постоянный коэффициент ​ \( \eta \) ​, называемый коэффициентом скорости обучения, вызывает вопросы. Зачем он нужен?

Результат сети зависит от ее весов. Но раз зависит результат сети, то от весов зависит и ее ошибка (как разность постоянного «правильного» значения и результата сети). Представим, что погрешность нашей сети ​ \( \delta \) ​ зависит от какого-то веса сети ​ \( w_i \) ​ следующим образом.

Положение кенгуру означает конкретный вес связи. Так в чем же фишка? А фишка в том, что кенгуру надо попасть в низину, так как именно в ней ошибка сети будет минимальна. Однако наш кенгуру может только прыгать. И именно за «длину прыжка» и отвечает коэффициент ​ \( \eta \) ​ в формуле добавки к весу.

Пусть коэффициент ​ \( \eta \) ​ маленький. Тогда наш кенгуру будет маленькими прыжками продвигаться к низине. Это будет очень доооооолго…

Ок, сделаем коэффициент ​ \( \eta \) ​ большим. Ведь большими прыжками мы быстрее доскачем до низины? Нет. При большом значении скорости обучения есть опасность так и не доскакать до самого низа из-за того, что вы постоянно будете прыгать вправо-влево оставаясь на одной и той же высоте.

Поэтому подбирать коэффициент скорости обучения надо с умом. Иногда его представляют в виде некоторой функции, которая постепенно уменьшается. То есть ​ \( \eta \) ​ уменьшается (а значит уменьшается и длина прыжка) по мере приближения к низине.

Вот мы и разобрались в предназначении коэффициента скорости обучения. Мы можем изменять вес связи только скачками. Этот коэффициент определяет величину скачков.

Практика: линейная аппроксимация

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

Пусть у нас имеется какой-то набор точек на плоскости.

X Y
1 2
2 4.2
2.5 5
3.8 7.9
4 9
6 10.2
6.6 13
7.2 15.3
8 17.1
8.5 19.5

Теперь давайте представим эти данные в виде картинки:

Мы видим, что полученные данные подозрительно напоминают прямую линию. Наша задача состоит в том, чтобы как можно более точно провести прямую, которая будет повторять заданный набор точек. В этом и состоит принцип аппроксимации.

Например, у нас нет данных о Y координате точки с X = 3. Задача аппроксимации – с наибольшей вероятностью предсказать, какой будет Y для этой точки.

Вы можете предположить, что для этого можно использовать метод наименьших квадратов. Его действительно используют очень часто. Однако, он не единственный.

Сейчас для нас важно то, что эту задачу мы можем решить и с помощью нейронной сети. Сделать это можно достаточно хитрым образом.

Нам нужна прямая. Из алгебры мы помним, что любая прямая в декартовых координатах задается уравнением:

Коэффициент ​ \( k \) ​ отвечает за крутизну наклона прямой, а ​ \( c \) ​ указывает точку на оси Y, через которую проходит эта прямая.

Почему ​ \( k \) ​ отвечает за крутизну наклона?

Крутизну наклона прямой мы определяем по величине угла ​ \( \phi \) ​ между прямой и осью X. Пусть для простоты наша прямая проходит через начало координат. Возьмем любую точку на этой прямой. Ее координаты равны ​ \( (x_0, y_0) \) ​. Теперь возьмем произвольную точку на прямой. Ее координаты нам неизвестны ​ \( (x,y) \) ​. Наша цель – получить зависимость ​ \( y \) ​ от ​ \( x \) ​.

Можно заметить, что мы имеем два подобных прямоугольных треугольника. Они подобны по двум углам (по углу ​ \( \phi \) ​ и по прямому углу из точки на прямой к оси X).

В подобных треугольниках отношение сходственных сторон равно между собой. Следовательно можно составить следующую пропорцию:

Видим, что отношение ​ \( \frac \) ​ равно тангенсу угла ​ \( \phi \) ​, как отношение противолежащего катета (​ \( y_0 \) ​) к прилежащему (​ \( x_0 \) ​). А чем больше угол ​ \( \phi \) ​, тем больше и его тангенс. Обозначим тангенс за ​ \( k \) ​.

А значит, коэффициент при ​ \( x \) ​ отвечает за крутизну наклона прямой к оси X.

Почему ​ \( c \) ​ отвечает за точку пересечения оси Y и прямой?

Пусть ​ \( x=0 \) ​. В этом случае прямая пересекает ось Y. При ​ \( x=0 \) ​ имеем ​ \( y=0 \) ​. Подставляем ​ \( x=0 \) ​ в общее уравнение прямой:

Получаем, что ​ \( y=c \) ​. Это означает, что прямая пересекает ось Y «на высоте» ​ \( с \) ​.

Мы ищем уравнение прямой, аппроксимирующее наши данные. Значит ​ \( y \) ​ у нас будет выходом сети. Теперь определимся со входами. Совершенно точно, что одним входом будет являться переменная ​ \( x \) ​. Однако в уравнении прямой фигурирует еще одно слагаемое: ​ \( c \) ​. О нем тоже нельзя забывать. ​ \( c \) ​ – постоянная величина. Поэтому мы добавим в нашу сеть второй вход, на который всегда будет подаваться единица. Таким образом произведение этого входа на вес всегда будет равно только этому весу, вне зависимости от входа (он всегда равен 1).

Функции активации у нас не будет. Взвешенная сумма и будет являться выходом нашей сети.

Вот так графически выглядит наш персептрон:

Давайте определим математически, чему равен выход нашей сети. Я уже рассказывал об этом во 2 главе, когда описывал математическую модель искусственного нейрона. Наш персептрон по факту является искусственным нейроном.

Это была запись в общем виде. А для нашего случая имеем:

Ничего эта запись вам не напоминает? Да это же уравнение прямой линии, где ​ \( out=y, \ w_2=k, \ w_1=c \) ​! Мы построили персептрон так, что в процессе обучения его весовые коэффициенты станут коэффициентами прямой, которую мы ищем!

Программа

Для начала вновь импортируем модуль для работы со случайными числами.

Далее мы создаем переменную, являющуюся весом связи при входе x (а по совместительству и коэффициентом крутизны наклона прямой).

Функция uniform(from, to) генерирует случайное вещественное число от from и до to включительно. Заметьте, что мы уже не работаем с целыми числами.

Далее создаем переменную, являющуюся весом связи при всегда единичном входе (а по совместительству отвечающую за свободный член в уравнении прямой).

Его значение опять же выбирается случайным образом.

Задав эти два члена, мы определили прямую. Так как оба члена заданы случайным образом, мы определили случайную прямую. Этим фактом я хочу показать, что изначальное положение прямой абсолютно несущественно. Она может быть какой угодно. Прямо как и в предыдущем примере с цифрами. Там сеть приходила к правильной конфигурации независимо от начальных значений весов.

Далее мы должны вывести в консоль созданные переменные.

Теперь задаем данные о наборе точек.

Здесь я использую не список, а словарь. Это практически тоже самое, что и список, только используются не числовые индексы, а собственноручно заданные имена – ключи. В данном словаре ключи это X, а соответствующие им значения это Y.

Теперь нам необходимо задать коэффициент скорости обучения. Я определил ее экспериментально. Сначала начал с 0.1, но при этом сеть не обучалась. По мере роста шагов ошибка сети только увеличивалась. Этот случай соответствует картинке с кенгуру, делающей слишком большие прыжки.

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

Теперь нужно создать функцию, высчитывающую ответ нашего персептрона:

Как видите, никакой функции активации тут нет. Ответ нашей сети есть взвешенная сумма, где ​ \( k \) ​ – вес связи при x, а ​ \( c \) ​ – вес связи при входе, всегда равном единице.

Теперь надо обучить нашу сеть. Чем больше шагов заложим, тем лучше. Возьмем, например, 100 000 шагов обучения. Хотя, возможно, для получения результата подошло бы и меньшее количество шагов. Тут есть простор для экспериментирования.

На протяжении 100 000 раз мы выбираем из нашего словаря случайный ключ (так как ключ у меня это и есть значение X).


После этого создается переменная true_result , в которой хранится правильный Y для соответствующего X.

Далее, в переменную out мы помещаем ответ нашей сети для данного X.

После этого мы высчитываем ошибку, и, используя дельта-правило, меняем оба веса связи.

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

Привожу полный код программы:

Можно запускать! Корректные результаты должны получиться уже с первого раза. Как понять, что ваши результаты корректные? Значение ​ \( k \) ​ у вас должно быть в районе 2, а значение ​ \( c \) ​ — чем ближе к 0, тем лучше.

Вот, что получилось у меня.

а самом деле я намеренно задал уравнение вида ​ \( y=2x \) ​ и, как видно по результатам, сеть практически полностью повторила его.

Цифры это конечно хорошо, но на графиках выглядит еще лучше.

Здесь синие точки – это набор исходных данных. Коричневая прямая – это случайно полученная в начале программы прямая. Она может проходить как угодно и где угодно.

Красная прямая – результат работы нашего персептрона, заключающийся в том, что мы получили линейную аппроксимацию данного набора точек.

Если вы построите свою готовую прямую по данным, выведенным в консоли, то она должна практически идеально совпасть с моей.

И ваша, и моя прямые, в свою очередь, практически идеально совпадают с первоначальной прямой (​ \( y=2x \) ​), из которой я намеренным искажением получил точки набора.

На данном примере хорошо видно, что иногда персептроны могут выполнять не только задачи на классификацию.

Выводы

Это одна из самых информативных глав в учебнике. Более того, здесь впервые встречаются примеры программирования нейронных сетей, а именно – простейших видов персептронов.

В первой половине главы я разъяснил используемую терминологию. Ввел понятия персептронов и их видов. Помните, что чаще всего под персептронами понимают именно элементарные и однослойные песептроны.

Далее вы узнали, что такое задачи классификации и ознакомились с теоремами о сходимости персептрона. Не обязательно наизусть помнить их формулировки. Достаточно понимать, что они означают.

Затем вы ознакомились с правилами Хебба и создали первую искусственную нейросеть, которая не только умеет отличать цифру 5 от всех остальных, но еще и умудряется распознавать ее в искаженных картинках. Это был пример использования персептрона как классификатора.

Последние разделы главы посвящены дельта-правилу, как обобщению правил Хебба, и созданию персептрона, реализующего линейную аппроксимацию.

Этой главой я лишь приоткрыл достаточно обширную и, безусловно, интересную тему персептронов. Есть еще много вариантов их использования. Все в одной главе охватить невозможно.

В следующей главе речь пойдет про многослойные нейронные сети, для которых придуманы свои алгоритмы обучения. Именно с помощью них можно распознавать лица, предсказывать погоду и делать другие невероятные штуки.

Другие языки программирования

Здесь приведены исходные коды программ для различных языков программирования. (Код для C# и PHP предоставлен пользователем под ником Geograph, код для Java написал poslannik).

Нейросети для чайников. Часть 2 — Перцептрон

В предыдущей статье были рассмотрены самые азы для понимания темы нейронных сетей. Полученная система не являлась полноценной нейронной сетью, а несла просто ознакомительный характер. Принимающими решения механизмами в ней были «черные ящики», не описанные подробно.
Вот о них речь и пойдет в рамках данной статьи. Результатом статьи будет полноценная нейронная сеть из одного перцептрона, умеющая распознавать входные данные и позволяющая себя обучать.

Язык программирования, на этот раз — C#.
Заинтересовавшихся прошу под кат.

Изложение буду вести простым языком, поэтому профи прошу не критиковать за терминологию.

В первой статье, элементом, отвечающим за распознавание конкретной цифры, был некий «нейрон» (таковым, по сути, не совсем являвшийся, но принятый за него для простоты).
Рассмотрим, что же он из себя представляет.

На вход мы снова будем подавать изображение, поэтому входные данные представляют собой двумерный массив. Далее, каждый кусочек входных данных соединяется с нейроном с помощью специальной связи (синапса) — на рисунке красные линии. Но это не простые связи. Каждая из них имеет какую-то значимость для нейрона.
Приведу аналогию с человеком. Мы воспринимаем информацию разными органами чувств — видим, слышим, чуем, осязаем. Но некоторые из этих чувств имеют более высокий приоритет (зрение), а некоторые более низкий (чутье, осязание). Причем для каждой жизненной ситуации приоритет для каждого органа чувств мы задаем основываясь на своем опыте — готовясь съесть незнакомый продукт, мы ставим в максимальный приоритет зрение и обоняние, а вот слух не играет роли. А пытаясь в толпе людей найти своего друга, мы обращаем внимание на информацию, которую дают нам глаза и уши, а остальное отходит на второй план.
Простейшим подобием отдельного органа у нейрона и является синапс. В разных ситуациях разные синапсы будут иметь разную значимость. Эта значимость называется весом связи.

Т.к. подаваемая на вход картинка у нас черно-белая, то на входе аксона может быть только 1 или 0:

А на выходе либо значение веса, либо 0.
Грубо говоря, если на входе что-то есть — ножка начинает «дёргаться», говоря нейрону, что на ней есть информация. От того, как сильно она «дёргается», будет зависеть принимаемое сетью решение.
Количество аксонов соответствует числу элементов входного массива. В данной статье я буду использовать в качестве входной информации изображения размерами 3х5 пикселей. Соответственно, число связей, приходящих в нейрон будет 3 х 5 = 15.

Сигнал, отмасштабированный коэффициентом веса связи, приходит в нейрон, где складывается с остальными сигналами от прочих синапсов.
Получается некоторое число. Это число сравнивается с заранее установленным порогом — если полученное значение выше порога, то считается, что нейрон выдал на выход единицу.
Порог выбирается из следующих соображений: чем он выше, тем больше будет точность работы нейрона, но тем дольше нам придется его обучать.

Перейдем к программной реализации.
Создадим класс нейрона:

Да, я знаю, что процедуры умножения сигнала на вес, суммирования сигналов, сравнения с порогом и выдачи результата можно было объединить в одном месте. Но мне показалось, что будет понятнее, если мы проведем каждую операцию по-отдельности и вызовем их поочередно:

Программа будет открывать файл-картинку такого вида:

Пробегать по всем пикселям и пытаться определить, является ли эта цифра той, которую её научили распознавать.
Т.к. у нас нейрон только один, то и распознавать мы сможем только один символ. Я выбрал цифру 5. Иными словами, программа будет говорить нам — является скормленная ей картинка изображением цифры 5 или нет.

Чтобы программа могла продолжить работу после выключения, я буду сохранять значения весов в текстовый файл.

Далее, необходимо сформировать массив входных данных:

Распознаем символ, вызывая описанные выше методы класса:

Все. Теперь наша программа уже может называться нейронной сетью и что-то определять.
Однако, она совсем глупа и всегда выдает False.
Необходимо обучить её. Обучать будем по простейшему алгоритму.

Если сеть выдает правильный ответ — радуемся и ничего не делаем.
А если ошибается — наказываем её соответствующим образом:

— Если её неправильный ответ False, то прибавляем значения входов к весам каждой ножки (к ножке 1 — значение в точке [0,0] картинки и т.д.):

— Если её неправильный ответ True, то вычитаем значения входов из веса каждой ножки:

Затем сохраняем полученные изменения в массиве весов и продолжаем обучение.
Как я уже сказал, я взял для образца цифру 5:

Кроме того, я приготовил остальные цифры и несколько вариантов самой цифры 5:

Вполне ожидаемо, что самой проблемной будет цифра 6, однако и это мы преодолеем с помощью обучения.
Создаем текстовый файл, заполненный нулями 3х5 — чистая память нашей сети:

Запускаем программу и указываем ей на этот файл.
Загружаем картинку цифры 5:

Естественно, ответ неверный. Нажимаем «Не верно».
Происходит перерасчет весов (можете посмотреть результат в файле):

1 1 1
1 0 0
1 1 1
0 0 1
1 1 1

Теперь программа будет корректно распознавать эту картинку.
Продолжаем скармливать нашей программе картинки и наказывать её за неправильные ответы.
В конечном итоге она будет распознавать все картинки из набора безошибочно.
Вот итоговые значения весов, сохраненные в файл моей полностью настроенной сетью:

1 2 1
1 0 -4
1 2 1
-4 0 1
1 1 0

Вот и шестерка определяется корректно.

Исходные коды программы, исполняемый файл, файлы весов и картинок 3х5 можно взять отсюда.
Если хотите поиграться с другими символами или обучить сеть заново — не забудьте обнулить все цифры в файле w.txt

На этом я заканчиваю статью, дорогие хабражители. Мы научились создавать, настраивать и обучать простейший перцептрон.
Если статья встретит горячие отзывы, в следующий раз попробуем реализовать что-то более сложное и многослойное. Кроме того, остался неосвещенным вопрос оптимального (быстрого) обучения сети.

Обучение персептрона с использованием нормированной функции настройки

Понятие, закономерности функционирования нейронных сетей, Обзор информационных технологий, программных средств для реализации соответствующих алгоритмов. Детальное описание особенностей выполнения демонстрационного примера, составление программного кода.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 09.04.2015

Обучение персептрона с использованием нормированной функции настройки

нейронный программный сеть алгоритм

Дисциплина «Интеллектуальные информационные системы» (ИИС) рассматривает способы построения информационных систем для решения неформализованных задач в различных сферах творческой деятельности человека. Особое внимание уделяется вопросам построения экспертных систем, которые являются наиболее значительным результатом практической реализации теории искусственного интеллекта. Рассматриваются процедуры имитации мыслительной деятельности человека в определенной предметной области, алгоритмы выделения признаков для описания ситуаций в условиях неопределенности. Изучаются математические и алгоритмические основы интеллектуальных информационных систем: модели представления знаний на основе систем продукций, семантических сетей и фреймов; выводы на знаниях; нечеткая информация и выводы; нейронные сети; методы эвристического поиска решений и программирования задач в среде CLIPS, пакете прикладных программ NeurealNetworkToolbox, функционирующего под управлением ядра системы MATLAB.

Целью выполнения курсового проекта является расширение теоретических и закрепление практических знаний, полученных в ходе аудиторных и самостоятельных занятий по дисциплине Интеллектуальные информационные системы. Для достижения поставленной цели необходимо решить следующие задачи:

· изучить специальную литературу;

· изучить встроенные инструментальные средства системы для математических расчетов MATLAB;

· рассмотреть возможности и особенности базового программного обеспечения из состава ППП NeuralNetworkToolbox (NNT) ПС MATLAB 6;

1. Понятие интеллектуальной информационной системы

Интеллектуальная информационная система (ИИС) — это информационная система, которая основана на концепции использования базы знаний для генерации алгоритмов решения экономических задач различных классов в зависимости от конкретных информационных потребностей пользователей.

Для интеллектуальных информационных систем, ориентированных на генерацию алгоритмов решения задач, характерны следующие признаки:

· развитые коммуникативные способности;

· умение решать сложные, плохо формализуемые задачи;

· способность к самообучению.

Коммуникативные способности ИИС характеризуют способ взаимодействия (интерфейса) конечного пользователя с системой, в частности, возможность формулирования произвольного запроса в диалоге с ИИС на языке, максимально приближенном к естественному.

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

1) определение оптимальной последовательности выполняемых операций, которая сокращает цикл изготовления и продажи товаров и услуг, обслуживания клиентов. Следствие оптимизации — повышение оборачиваемости капитала и рост всех экономических показателей фирмы;

2) оптимизация использования ресурсов в различных бизнес-процессах, минимизирующая издержки производства и обращения;

3) построение адаптивных бизнес-процессов, цель которых быстро реагировать на изменения потребностей конечных потребителей продукции, производственных технологий, поведения конкурентов на рынке и, как следствие, повышать качество обслуживания клиентов в условиях динамичности внешней среды;

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

Заметим, информационные системы в сфере фондовых рынков предназначены для повышения прозрачности рынка наиболее добротных ценных бумаг и увеличения оборота средств.

1.1 Понятие нейронных сетей

Под нейронными сетями (НС) понимают параллельные вычислительные структуры которые моделируют биологические процессы обычно ассоциируемые с процессами человеческого мозга. НС обладают способностью приобретать знания о предметной области, обучаясь на примерах.

История НС начинается с работ американских ученых У. Мак-Каллона, В. Питтса (1943 г. модель формального нейрона) и Ф. Розенблатта (1957 г. однослойная НС, названная им персептроном). Персептрон — электронное устройство, моделирующее глаз улитки и его взаимодействия с мозгом.

Искусственный нейрон — это элементарный преобразовательный элемент, имеющий непустое множество входов, на которые поступают сигналы х1, х2, …, хn. Суммирующий блок, блок преобразования сигнала с помощью активационной проекции и один выход Уо. Каждому входу приписан свой «вес» w (соответствующий мере» биологической синоптической связи). Функционирует нейрон в два такта, на первом такте в суммирующем блоке вычисляется величина возбуждения полученного нейроном. Другими словами, нейрон имеет входные сигналы, в биологическом нейроне роль «собирателя» этих сигналов от другий нейронов служит дендрит, и у нейрона есть выходной сигнал, в биологическом нейроне передатчиком сигналов другим нервным клеткам служит аксон. Другими словами, в нейрон от других нейронов приходит какое-то число сигналов, обработав их, нейрон передает выходной сигнал далее, другому нейрону.

Функционирует нейрон в два такта, на первом такте в суммирующем блоке вычисляется величина возбуждения полученного нейроном

На втором такте суммарное возбуждение пропускается через активационную (преобразующую) функцию F в результате чего получается выходной сигнал Yо = F(Y)

Существует 4 вида активационной функции:

1) Линейная функция (гистерезис)

2) Функция единого скачка

3) Сигмоидальная функция активации

1.2 Обзор информационных технологий / программных средств для реализации алгоритмов нейронных сетей

Типы аппаратного обеспечения на основе ИНС

Существует большое количество типов рассматриваемых устройств, однако их можно разделить на три основных класса, которые могут применяться в зависимости от поставленных и выполняемых задач.

Нейрокомпьютеры (Neurocomputer). Представители шестого поколения ПК представляют собой комплексную систему, аппаратные составляющие которой полностью основаны на ИНС. Создание таких систем обосновано при необходимости выполнения обработки информации, требующей высоких вычислительных мощностей/

Разного типа ускорители и другие карты расширения для ПК (PC accelerators). Такие устройства представляют собой стандартные карты расширения для шины, например, ISA или PCI, с тем лишь отличием, что обработку данных осуществляет ИНС. Такие устройства обладают некоторыми преимуществами нейрокомпьютеров, но в более узком или специализированном диапазоне выполняемых задач, а, соответственно, и низком ценовом диапазоне.

Чипы (Chips). Тип аппаратной реализации ИНС, применяемый для построения вышеназванных форм реализации, а также предназначенный для совместного использования с другими стандартными устройствами для расширения свойств последних.


Клеточные библиотеки (Celllibraries). Такой тип предназначен для обеспечения совместной работы специализированного чипа и некоторых дополнительных возможностей и функций, предоставляемых другими устройствами. Широко применяется при построении сложных комплексных систем.

Встроенные микрокомпьютеры (Embeddedmicrocomputers). Такие устройства способны выполнять определенный круг задач с помощью ИНС, но без участия периферийных устройств (клавиатуры, монитора и т.д.).

Некоторые ускорители могут содержать обычные перепрограммируемые процессоры, повышение производительности которых обеспечивается распараллеливанием вычислительных повторяющихся операций с помощью ИНС. Отметим, что далее сконцентрируемся на устройствах, в которых функциональные возможности самой ИНС непосредственно осуществлены в аппаратном обеспечении.

Категории аппаратного обеспечения ИНС

Рассмотрим вопрос, связанный с практическим исполнением и внедрением ИНС в аппаратные средства. В этом случае, опять же, можно выделить три широких класса: цифровое, аналоговое и гибридное исполнения. В рамках этих категорий используется различная архитектура и методы для реализации необходимых функций.

В цифровом исполнении все значения, обрабатываемые нейронной сетью, представлены бинарными словами с характерной длиной слова. К преимуществам цифровой технологии перед аналоговой следует отнести независимость от электромагнитных помех, возможность использования RAM для хранения весовых коэффициентов (в течение неопределенного отрезка времени), хорошо отработанные технологии изготовления, высокая точность в вычислительных операциях, а также легкая интегрируемость в уже существующие системы. Однако в этом случае, как и везде, присутствуют недостатки, среди которых следует отметить более медленные (хотя и более точные) вычисления, а также проблемы, связанные с конвертацией аналогового сигнала.

В случае цифрового исполнения аппаратное обеспечение на основе ИНС может быть реализовано несколькими типами архитектур, наиболее важные из них мы рассмотрим и приведем соответствующие примеры.

Каскадируемая архитектура. Рассматриваемая архитектура практически идентична методам построения обычных цифровых процессоров, другими словами, нейронная сеть любого размера и архитектуры строится посредством стандартных блоков. Реализованными примерами такой архитектуры могут служить чип PhilipsLneuro, MD1220 от MicroDevices, а также Neuralogix NLX-420 NeuralProcessor.

Мультипроцессорные чипы. В этом случае подход состоит в размещении в одном чипе множества простейших процессоров. Такие решения могут быть разделены на две группы, известные как SIMD (SingleInstruction, MultipleData) и так называемые систолические сети. В случае SIMD, все процессоры выполняют одну и ту же инструкцию параллельно с вектором данных. Во втором случае каждый процессор неоднократно исполняет один шаг вычислений перед передачей результата следующему (или нескольким) процессору в сети. Примерами SIMD-архитектуры являются чип Inova N64000, содержащий 64 элемента обработки, чип HNC 100NAP, включающий в себя 4 обрабатывающих элемента, Siemens внедрила в свой мультипроцессор MA 16 микрочипов. Такая архитектура предназначена, главным образом, для исполнения различных действий над матрицами.

Архитектура RBF (RadialBasisFunction). Согласно этой архитектуре, функционирование сети определяется управлением эталонными векторами, определяющими области, на которые влияют данные при обучении. Преимуществом RBF ИНС является их быстрое обучение и относительно простое построение сетей прямого распространения. К коммерческим изделиям относятся чипы IBM ZICS и Nestor Ni1000. Интересным фактом является также и то, что произведенные в США чипы семейства IBM ZICS были разработаны в Европе.

Другие цифровые проекты. Ряд существующих архитектур не подходят ни под одну из вышеназванных категорий. К примеру, разработка фирмы MicroCircuitEngineering MT19003 NISP, по существу, RISC-процессор (Redu-cedInstructionSetComputer, тип архитектуры микропроцессора, ориентированный на быстрое и эффективное выполнение относительно небольшого набора встроенных команд), осуществляющий семь инструкций, оптимизированных для построения многослойных сетей. Еще одним примером, реализующим другой подход, может служить чип HitachiWaferScaleIntegration. Чипы этого семейства предназначены для реализации сетей обратного распространения и сетей Хопфилда.

В Стэнфордском университете (StanfordUniversity) разработан микрочип, который способен стимулировать нейроны посредством химических соединений, а не электрических импульсов.

К преимуществам этой категории аппаратных средств реализации ИНС следует отнести высокие скорости обработки информации и возможности высокой плотности расположения элементов. Однако тут же дают о себе знать и недостатки сложность в получении высокой точности, обусловленная различиями в компонентах из-за системы допусков при производстве, различные характеры тепловых и электромагнитных помех, искажающих полезный сигнал. Еще одной проблемой является сложность в долгосрочном хранении весовых коэффициентов и организации операций аналогового умножения.

В качестве примера можно привести разработку Intel 8017NW ETANN (ElectricallyTrainableAnalogueNeuralNetworks), содержащий 64 нейрона и 10280 весовых коэффициентов. ИНС, реализованная в продукте SynapticsSiliconRetina, обрабатывает изображение, моделируя процессы, происходящие в сетчатке глаза. Подход заключается в создании аналогового исполнения, где ИНС пытается наиболее точно воспроизвести поведение биологических нейронов. Реализованные аналоговые нейросети представляют набор компонентов, размеры которых меньше размеров биологического нейрона, и предполагается, что вышеназванные недостатки компенсируются взаимосвязями между аналоговыми нейронами.

Как понятно из названия, эта категория представляет собой комплекс вышерассмотренных систем. Разработчики таких проектов пытаются получить от таких систем преимущества аналогового и цифрового исполнений. По большей части это достигается путем связи между устройствами и датчиками посредством цифровой составляющей, а обработка полностью или частично реализуется аналоговыми методами.
В качестве примера приведем чип Bellcore CLNN-32, который хранит весовые коэффициенты в цифровой форме, а производит моделирование ИНС, используя аналоговую схему. Существуют проекты, в которых весовые коэффициенты хранятся в конденсаторах, периодически подзаряжающихся от внутренних источников тока. Также примерами гибридных систем могут служить SU3232 Synapse и NU32 Neuron, разработанные в лабораториях NeuralSemiconductor, и RN-100, представленный Ricoh.

Ниже приведен далеко не полный список возможных и перспективных аппаратных реализаций и сфер применения:

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

* Идентификация объектов, сжатие изображения, HDTV, медицинский и биометрический анализ образов, системы обработки теплового изображения, анализ материалов.

* Анализ человеческого характера, идентификация говорящего, распознавание речи, распознавание рукописного текста.

* Информационный поиск, исследовательский анализ данных, проверка качества, изучение функций, автоматический контроль и интеллектуальное управление, экономическое прогнозирование, прогнозирование потребления электричества, автоматическая проверка работоспособности VLSI и WSI.

2. Программная среда MATLAB

Как известно, сложные электрические цепи постоянного тока легко описываются системами линейных уравнений, составленными на основе законов Кирхгофа, — например, методами узловых потенциалов и контурных токов. Для цепей переменного тока необходимо составлять такие уравнения с комплексными элементами. А для моделирования динамических систем и устройств необходимо составлять и решать системы ДУ, чаще всего нелинейных. Матричная система MATLAB — идеальное средство для реализации такого моделирования.

Среда MATLAB, являясь мощной матричной системой, открывает обширные возможности в выполнении численного моделирования как линейных, так и нелинейных систем и устройств, описываемых большими системами уравнений. Такое моделирование предполагает решение системы уравнений состояния достаточно апробированными и хорошо известными численными методами — в том числе на основе рекуррентных и итерационных алгоритмов. Уравнения состояния реальных систем и устройств часто содержат множество нулевых коэффициентов, что порождает разреженные матрицы и массивы. Их аппарат прекрасно представлен в базовой системе MATLAB.

В настоящее время известно множество программных средств моделирования частного характера. Например, для моделирования электронных схем применяются программы схемотехнического моделирования MicroCAP, MicroLOGIC, Pspice, DesignCenter, ElectronicsWorkBench и др. Они обычно содержат обширные библиотеки полупроводниковых и схемных компонентов и представляют результаты в привычном для пользователя виде — например в виде осциллограмм их виртуальных осциллографов или показаний виртуальных вольтметров или амперметров. Однако применение таких систем носит частный и потому довольно ограниченный характер, хотя в своей области многие такие программы являются подлинным шедевром изобретательности их создателей.

Разработчики системы MATLAB+Simulink отказались от конкуренции с разработчиками подобных программ узкого назначения. Они сосредоточили свое внимание на решении куда более важной и сложной задачи — моделирования блочных динамических систем и устройств произвольного назначения. Для этого пришлось с одной стороны существенно расширить библиотеки компонентов таких систем и устройств, а с другой стороны, применить укрупненные модели ряда компонентов, благодаря чему стало возможным моделирование сложных систем и устройств.

2.1 Интерфейс среды MATLAB

Среда MATLAB является интерактивной системой для выполнения инженерных и научных расчетов, ориентированной на работу с массивами данных. Система использует математический сопроцессор и допускает возможность обращения к программам, написанным на языках Fortran, C и C++.

Среда MATLAB имеет собственный язык программирования, напоминающий BASIC, а также располагает большими возможностями для работы с сигналами, для расчета и проектирования систем связи, цифровых и аналоговых фильтров, различных вычислительных систем. Имеются в наличии и средства для спектрального анализа и синтеза, быстрого преобразования Фурье (БПФ), обработки изображений, Wavelet-анализа. Кроме этого, пользователь может ввести в систему любую новую встроенную команду, оператор или функцию.

При помощи командного окна (рис. 7.1) можно осуществлять все вычисления в режиме калькулятора. При этом можно осуществлять присвоения различным переменным значений и далее пользоваться ими в командном окне. Рабочее пространство среды является удобным средством для просмотра числовых массивов в процессе формирования и отладки вычислительных процедур (программ).

Программирование в среде MATLAB осуществляется путем создания М-файлов с расширением.m (рис. 7.2). Недостатком является отсутствие оператора безусловного перехода GO TO, однако это можно полностью возместить путем структурного программирования с обращением к различным функциям и процедурам. Кроме этого, с помощью встроенных инструментальных средств имеется возможность формировать графический пользовательский интерфейс, значительно облегчающий работу с программами, созданными в среде MATLAB, а также их отладку.

Пакет визуального моделирования Simulink (рис. 7.1) является пакетом расширения среды MATLAB и позволяет осуществлять моделирование поведения динамических линейных и нелинейных систем. Пользователь осуществляет графическую сборку любой системы из отдельных блоков, хранящихся в библиотеках Simulink (рис. 7.3). В результате такой сборки образуется модель исследуемой системы (S-модель), которая хранится в файле с расширением .mdl.

2.2 Общие замечания по моделированию систем

Испытание готовых и отлаженных демонстрационных примеров может создать у малоопытного пользователя иллюзию простоты моделирования. На самом деле в большинстве случаев это возможно только при работе достаточно опытного пользователя, реально проработавшего с тем или иным пакетом расширения не один десяток часов и способного анализировать правоту (или неправоту) своих действий [14].

Малоопытный пользователь, скорее всего, при переходе к моделированию своих систем или устройств, столкнется с множеством неожиданных ошибок. Наиболее характерными из них являются:

— неверное задание параметров моделей;

— нестыковка входных, выходных и управляющих параметров блоков;

— несоответствие блоков по типу;

— ошибочные записи математических выражений;

— неверный выбор метода моделирования и т.д.

Никакая, даже самая обширная фирменная документация не способна отразить все нюансы ошибочного применения системы MATLAB с её пакетами расширения. Поэтому ограничимся лишь некоторыми общими рекомендациями.

Довольно часто причиной ошибок является несоответствие типов блоков и их входных и выходных параметров. В таких случаях надо предусматривать переходные элементы. Наглядный пример — переход от тока к напряжению включением резистора 1 Ом в цепь тока.

Особенно часто нестыковка блоков наблюдается при совместном использовании блоков из разных пакетов расширения, например, из пакетов PowerSystem и Simulink. Размерные величины, используемые в пакете PowerSystemBlockset, зачастую недопустимы для блоков Simulink, использующих безразмерные величины (например, при задании функций).

По-видимому, стоит разумно ограничить применение компонентов из различных пакетов расширения. Как показывает практика, каждый из пакетов расширения имеет довольно широкую сферу применения и позволяет решать множество практически полезных задач. Совместное применение нескольких пакетов расширения системы MATLAB+Simulink требует длительной практики работы в этой системе. Наименьший риск натолкнуться на трудности моделирования имеет место при использовании пакетов расширения группы Blockset, отнесенной к сфере прямого применения с расширением Simulink.

Важным обстоятельством для пользователей MATLAB является тот факт, что система тщательно диагностирует подготовленную модель и допускает её исполнение только после устранения всех обнаруженных ошибок. Сообщения об ошибках появляются в специальных окнах системы. Они достаточно подробны и позволяют наметить меры по устранению ошибок.

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

2.3 Детальное описание особенностей выполнения демонстрационного примера

Для загрузки демонстрационного примера «Обучение персептрона с использованием нормированной функции настройки» достаточно ввести в CommandWindow команду demop5. В окне Figures появится результат работы программы — график, который пытается классифицировать линейно неразделимые вектора. График свидетельствует о неудачи классификации.

Как же работает демонстрационный пример «Обучение персептрона с использованием нормированной функции настройки»?

Персептрон обучается для классификации 5 входных векторов с помощью 2 категорий. Несмотря на то, что один входной вектор намного больше, чем другие, обучение сLEARNPN происходит быстро.

Р определяет последовательность входа для 5 векторов, а Т — последовательность цели (категорию вектора). Построим график для этих векторов с помощью функции PLOTPV.

P = [-0.5 -0.5 +0.3 -0.1 -40;…

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

NEWP создает персептрон. Первый аргумент определяет ожидаемые диапазоны из двух входов. Второй аргумент определяет, что есть только один нейрон в слое. LEARNPN менее чувствителен к большим изменениям во входных размерах вектора, чем LEARNP (по умолчанию).

net = newp([-40 1; — 1 50], 1,’hardlim’, ‘learnpn’);

Добавление нейрона инициализирует попытку классификации графика.

Начальные значения равны нулю, так что любой вход даёт тот же результат и классифицирующая линия даже не появляется на графике, но это обучаемо!

linehandle = plotpc (net.IW<1>, net.b<1>);

ADAPT — возвращает новый объект сети, который работает лучше как классификатор, выход сети и ошибка. Этот цикл позволяет сети адаптироваться за 3 прохода, график классифицирует линию, и продолжит, пока ошибка не будет равна 0.

[net, Y, E] = adapt (net, P, T);

linehandle = plotpc (net.IW<1>, net.b<1>, linehandle);

Обучение с LEARNP потребовалось всего 3 прохода, а при решении той же задачи сLEARNPN необходимо 32 прохода. Таким образом, LEARNPN работает гораздо лучше, чем LEARNP когда есть значительные различия во входных размерах вектора.

Теперь SIM может быть использован для классификации любого другого вектора входа. Например, классифицировать входной вектор [0,7; 1,2].

График этой новой точки с оригинальным обучением показывает, как выполняется сеть. Чтобы отличить его от обучающего множества, его цвет красный

circle = findobj (gca, ‘type’, ‘line’);

set (circle, ‘Color’, ‘red’);

Подключим «hold», чтобы предыдущий график не стирался. Добавим набор обучения и классифицирующую линию на график.

plotpc (net.IW<1>, net.b<1>);

Наконец, Увеличиваем интересующую область.

Персептрон правильно классифицирует нашу новую точку (она красная) как категорию «ноль» (представленную в виде круга), и нет «один» (представленную в виде плюса). Персептрон учится правильно в гораздо более короткие сроки, несмотря на выброс (сравните с «выбросом входных векторов»).

2.4 Программный код

P = [-0.5 -0.5 +0.3 -0.1 -40;…%определяет последовательность входа для 5 векторов

T = [1 1 0 0 1];% определяет последовательность цели (категорию вектора)

plotpv (P, T);% графическое представление входных целевых векторов

net = newp([-40 1; — 1 50], 1,’hardlim’, ‘learnpn’);

linehandle = plotpc (net.IW<1>, net.b<1>);

net.adaptParam.passes = 3;% разрешает адаптацию сети

[net, Y, E] = adapt (net, P, T);

linehandle = plotpc (net.IW<1>, net.b<1>, linehandle);

circle = findobj (gca, ‘type’, ‘line’);

set (circle, ‘Color’, ‘red’);

plotpc (net.IW<1>, net.b<1>);%изображение линии классификации в векторном пространстве персептрона

axis([-2 2 -2 2]);% устанавливает масштаб по осям x, y для активного графического окна.

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

Для достижения поставленной цели были решены следующие задачи:

· самостоятельно изучена специальная литература;

· изучены встроенные инструментальные средства системы для математических расчетов MATLAB;

· рассмотрены возможности и особенности базового программного обеспечения из состава ППП NeuralNetworkToolbox (NNT) ПС MATLAB 6;

1. Мартынов Н.Н. Введение в MATLAB 6.х. — М.:Кудиц-образ, 2012. — 347 с.

2. Минский, М., Пейперт, С. Персептроны. — М.: Мир, 2009. — 261 с.

3. Семенов Н.А. Интеллектуальные информационные системы: Учебное пособие. 1-е изд. Тверь: ТГТУ, 2004. 100 с.

4. Цисарь И.Ф. MATLABSIMULINK — лаборатория экономиста. — М.:Анкил, 2001. — 102 с.

5. Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6. — М.: Диалог-МИФИ, 2002. — 489 с.

6. Галушкин А.И. Теория нейронных сетей. — М.: Журн. «Радиотехника», 2000. — 415 с.

7. Каллан Р. Основные концепции нейронных сетей. — М. И др.: Вильямс, 2001. — 287 с.


8. Круглов В.В. Искусственные нейронные сети: Теория и практика. — М.: Горячая линия-Телеком, 2002. — 381 с.

Подобные документы

Понятия интеллектуальной информационной системы. Нейронные сети и информационные программные средства для реализации их алгоритмов. Моделирование систем в среде MATLAB. Особенности выполнения демонстрационного примера «Обучение персептрона с Learnpn».

курсовая работа [572,8 K], добавлен 20.02.2013

Обзор программных продуктов для анализа изображений: ABBYY FineReader и OCR CuneiForm. Понятие и виды нейронных сетей. Алгоритм обучения персептрона. Результаты исследований и описание интерфейса программы. Расчет себестоимости программного обеспечения.

дипломная работа [590,7 K], добавлен 17.08.2011

Диагностический анализ изучения алгоритмов обучения нейронных сетей «с учителем». Сбор входных и выходных переменных для наблюдений и понятие пре/пост процессирования. Подготовка и обобщение многослойного персептрона, модель обратного распространения.

курсовая работа [249,3 K], добавлен 22.06.2011

Понятие искусственного нейрона и искусственных нейронных сетей. Сущность процесса обучения нейронной сети и аппроксимации функции. Смысл алгоритма обучения с учителем. Построение и обучение нейронной сети для аппроксимации функции в среде Matlab.

лабораторная работа [1,1 M], добавлен 05.10.2010

Анализ нейронных сетей и выбор их разновидностей. Модель многослойного персептрона с обучением по методу обратного распространения ошибки. Проектирование библиотеки классов для реализации нейросети и тестовой программы, описание тестирующей программы.

курсовая работа [515,4 K], добавлен 19.06.2010

Исследование эффективности применения нейронных сетей в рамках отношений между людьми. Принцип работы с нейросимулятором. Составление обучающей выборки и проектирование персептронов. Анализ выбора супружеской пары с использованием нейросетевых технологий.

презентация [150,8 K], добавлен 19.08.2013

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

курсовая работа [974,0 K], добавлен 21.12.2020

Принципы организации и функционирования биологических нейронных сетей. Система соединенных и взаимодействующих между собой простых процессоров. Нейронные сети Маккалока и Питтса. Оценка качества кластеризации. Обучение многослойного персептрона.

курсовая работа [1,1 M], добавлен 06.12.2010

Рост активности в области теории и технической реализации искусственных нейронных сетей. Основные архитектуры нейронных сетей, их общие и функциональные свойства и наиболее распространенные алгоритмы обучения. Решение проблемы мертвых нейронов.

реферат [347,6 K], добавлен 17.12.2011

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

курсовая работа [1,3 M], добавлен 26.03.2020

Нейрокомпьютерная техника алгоритм обучения персептрона

Способность искусственных нейронных сетей обучаться является их наиболее интригующим свойством. Подобно биологическим системам, которые они моделируют, эти нейронные сети сами моделируют себя в результате попыток достичь лучшей модели поведения.

Используя критерий линейной разделимости, можно решить, способна ли однослойная нейронная сеть реализовывать требуемую функцию. Даже в том случае, когда ответ положительный, это принесет мало пользы, если у нас нет способа найти нужные значения для весов и порогов. Чтобы сеть представляла практическую ценность, нужен систематический метод (алгоритм) для вычисления этих значений. Розенблатт [4] сделал это в своем алгоритме обучения персептрона вместе с доказательством того, что персептрон может быть обучен всему, что он может реализовывать.

Обучение может быть с учителем или без него. Для обучения с учителем нужен «внешний» учитель, который оценивал бы поведение системы и управлял ее последующими модификациями. При обучении без учителя сеть путем самоорганизации делает требуемые изменения. Обучение персептрона является обучением с учителем.

Алгоритм обучения персептрона может быть реализован на цифровом компьютере или другом электронном устройстве, и сеть становится в определенном смысле самоподстраивающейся. По этой причине процедуру подстройки весов обычно называют «обучением» и говорят, что сеть «обучается». Доказательство Розенблатта стало основной вехой и дало мощный импульс исследованиям в этой области. Сегодня в той или иной форме элементы алгоритма обучения персептрона встречаются во многих сетевых парадигмах. Персептрон обучают, подавая множество образов по одному на его вход и подстраивая веса до тех пор, пока для всех образов не будет достигнут требуемый выход. Допустим, что входные образы нанесены на демонстрационные карты. Каждая карта разбита на квадраты и от каждого квадрата на персептрон подается вход. Если в квадрате имеется линия, то от него подается единица, в противном случае — ноль. Множество квадратов на карте задает, таким образом, множество нулей и единиц, которое и подается на входы персептрона. Цель состоит в том, чтобы научить персептрон включать индикатор при подаче на него множества входов, задающих нечетное число, и не включать в случае четного.

Рисунок 2.7 — Персептронная система распознавания изображений

На рисунке 2.7 показана такая персептронная конфигурация. Допустим, что вектор Х является образом распознаваемой демонстрационной карты. Каждая компонента (квадрат) Х — (x1, x2, …, xn) — умножается на соответствующую компоненту вектора весов W — (w1, w2, . wn). Эти произведения суммируются. Если сумма превышает порог И, то выход нейрона Y равен единице (индикатор зажигается), в противном случае он — ноль. Эта операция компактно записывается в векторной форме как Y = XW, а после нее следует пороговая операция. Для обучения сети образ Х подается на вход и вычисляется выход Y. Если Y правилен, то ничего не меняется. Однако если выход неправилен, то веса, присоединенные к входам, усиливающим ошибочный результат, модифицируются, чтобы уменьшить ошибку. Чтобы увидеть, как это осуществляется, допустим, что демонстрационная карта с цифрой 3 подана на вход и выход Y равен 1 (показывая нечетность). Так как это правильный ответ, то веса не изменяются. Если, однако, на вход подается карта с номером 4 и выход Y равен единице (нечетный), то веса, присоединенные к единичным входам, должны быть уменьшены, так как они стремятся дать неверный результат. Аналогично, если карта с номером 3 дает нулевой выход, то веса, присоединенные к единичным входам, должны быть увеличены, чтобы скорректировать ошибку.

Этот метод обучения может быть подытожен следующим образом:

1. Подать входной образ и вычислить Y.

2а.Если выход правильный, то перейти на шаг 1;

б.Если выход неправильный и равен нулю, то добавить все входы к соответствующим им весам; или

в.Если выход неправильный и равен единице, то вычесть каждый вход из соответствующего ему веса.

3. Перейти на шаг 1.

За конечное число шагов сеть научится разделять карты на четные и нечетные при условии, что множество цифр линейно разделимо. Это значит, что для всех нечетных карт выход будет больше порога, а для всех четных — меньше. Отметим, что это обучение глобально, т. е. сеть обучается на всем множестве карт. Возникает вопрос о том, как это множество должно предъявляться, чтобы минимизировать время обучения. Должны ли элементы множества предъявляться — последовательно друг за другом или карты следует выбирать случайно? Несложная теория служит здесь путеводителем.

Важное обобщение алгоритма обучения персептрона, называемое дельта-правилом, переносит этот метод на непрерывные входы и выходы. Чтобы понять, как оно было получено, шаг 2 алгоритма обучения персептрона может быть сформулирован в обобщенной форме с помощью введения величины д, которая равна разности между требуемым или целевым выходом T и реальным выходом Y

Случай, когда д=0, соответствует шагу 2а, когда выход правилен и в сети ничего не изменяется. Шаг 2б соответствует случаю д > 0, а шаг 2в случаю д 0, значение выхода меньше требуемого) проводит к усилению связи;

— обучение каждого нейрона происходит независимо от обучения остальных нейронов, что соответствует важному с биологической точки зрения, принципу локальности обучения.

Данный метод обучения был назван Ф.Розенблаттом «методом коррекции с обратной передачей сигнала ошибки». Позднее более широко стало известно название » — правило». Представленный алгоритм относится к широкому классу алгоритмов обучения с учителем, поскольку известны как входные вектора, так и требуемые значения выходных векторов (имеется учитель, способный оценить правильность ответа ученика).

Доказанная Розенблаттом теорема о сходимости обучения по — правилу говорит о том, что персептрон способен обучится любому обучающему набору, который он способен представить.

Каждый нейрон персептрона является формальным пороговым элементом, принимающим единичные значения в случае, если суммарный взвешенный вход больше некоторого порогового значения:

Таким образом, при заданных значениях весов и порогов, нейрон имеет определенное значение выходной активности для каждого возможного вектора входов. Множество входных векторов, при которых нейрон активен (y=1), отделено от множества векторов, на которых нейрон пассивен (y=0) гиперплоскостью.

Следовательно, нейрон способен отделить (иметь различный выход) только такие два множества векторов входов, для которых имеется гиперплоскость, отсекающая одно множество от другого. Такие множества называют линейно разделимыми. Проиллюстрируем это понятие на примере.

Пусть имеется нейрон, для которого входной вектор содержит только две нулевые компоненты , определяющие плоскость. На данной плоскости возможные значения векторов отвечают вершинам единичного квадрата. В каждой вершине определено требуемое значение активности нейрона 0 (на рисунке 2.8 — белая точка) или 1 (черная точка). Требуется определить, существует ли такое такой набор весов и порогов нейрона, при котором этот нейрон сможет отделить точки разного цвета.

На рисунке 2.8 представлена одна из ситуаций, когда этого сделать нельзя вследствие линейной неразделимости множеств белых и черных точек.

Рисунке 2.8 — Белые точки не могут быть отделены одной прямой от черных

Требуемая активность нейрона для этого рисунка определяется таблицей, в которой не трудно узнать задание логической функции «исключающее или».

Алгоритм обучения персептрона

Для обучения персептронов может быть применено несколько правил. Специально для обучения персептрона предложено правило обучения Ф. Розенблатта [1, 4].

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

1. Выход нейрона равен целевому значению (то есть тому значению, которое должно быть). Тогда ошибка равна и вектор весов не должен изменяться.

2. Целевое значение , а выход нейрона . Ошибка равна . В этом случае на выходе адаптивного сумматора формируется отрицательная величина , где – вектор весов нейрона, – вектор входа. Выход адаптивного сумматора необходимо скорректировать. Добавим к вектору весов транспонированный вектор входа . Тогда выход адаптивного сумматора изменится на положительную величину : . После нескольких таких шагов выход адаптивного сумматора станет неотрицательным и вектор входа будет классифицироваться правильно. Значения весов при этом изменятся.

3. Целевое значение , а выход нейрона . Ошибка равна . Выход адаптивного сумматора неотрицательный, а должен быть отрицательным. Вычтем из вектора весов транспонированный вектор входа. Тогда выход адаптивного сумматора изменится на отрицательную величину: . После нескольких циклов обучения выход адаптивного сумматора станет отрицательным и вектор входа будет классифицироваться правильно.

Суммируя рассмотренные ситуации, можно сказать, что вектор весов должен корректироваться на величину

где – ошибка выхода.

Рассматривая смещение как вес для единичного входа, получим

Тогда по правилу Розенблатта для i‑го нейрона вектор‑строка весов корректируется по формуле

где – вектор‑строка весов i‑го нейрона на k‑ом цикле обучения; – ошибка нейрона, равная 0, 1 или –1; – транспонированный вектор входов нейрона.

Известно [3], что персептрон, обучаемый по такому алгоритму, независимо от начального состояния весов и последовательности появления примеров всегда придет к достижению решения за конечное число итераций.

В NNT системы MATLAB разделяют понятия обучения и адаптации. В процессе обучения при неизменных весах на вход сети подаются все обучающие примеры и вычисляется усредненная по всем весам ошибка сети. Величина ошибки используется для корректировки весов. Затем снова повторяется цикл обучения, пока ошибка не станет малой. Процедура предъявления сети всего набора обучающих дан­ных называется эпохой (epoch). Такой режим обучения в литературе часто называют пакетным. В процессе адаптации (последовательного режима обучения) в каждом про­ходе (passes) на вход подается один вектор, вычисляется ошибка и корректируются веса.

Известно [1], что последовательный режим обучения персептрона сходится за конечное число циклов для любой задачи классификации с линейно разделяемыми входными векторами. В случае пакетного режима обучения такая сходимость не гарантирована, поэтому для обучения персептрона применяют последовательный режим обучения.

1.3. Создание персептрона[1]

Для создания персептрона используется функция net = perceptron, где net—имя сети. Эта функция создает персептрон с функцией активации hardlim и использует функцию обучения learnp, реализующую описанный в подразделе 1.2 алгоритм обучения. Можно создать персептрон с функцией активации hardlims и функцией обучения learnpn, отличающейся от learnpтем, что входной вектор нормируется делением на евклидову норму (см. систему помощи MATLAB).

Параметры персептрона можно увидеть, задав команду

>> net

В объекте netможно увидеть параметры персептрона, например, веса входов:

Neural Network Weight

delays: 0 % задержка

initFcn: ‘initzero’% начальные значения весов

learn: true % индикатор настройки – веса настраиваются

learnFcn: ‘learnp’ % функция настройки

learnParam: (none) % параметры настройки отсутствуют

size: [0 0] % размер матрицы весов

weightFcn: ‘dotprod’%функция взвешивания весов – скалярное

weightParam: (none) % данные пользователя

userdata: (your custom info)

Русские комментарии добавлены для пояснения. Обратите внимание на нулевой размер матрицы весов.

Информацию о смещениях можно увидеть следующим образом:

Neural Network Bias

userdata: (your custom info)

Графическое изображение структуры можно просмотреть с помощью функции view(net) — рис. 1.5. На рис. 1.5 показаны нулевые массивы.

Рис. 1.5. Структура сети

Как мы убедились, функция perceptron создает объект с нулевыми массивами. Функция обучения создаст необходимые массивы, но рекомендуется предварительно провести конфигурирование сети с помощью функции net = configure(net,P,T), где PRxQ матрица из Q входных векторов R, TSxQ матрица из Q целевых векторов.

Для дальнейшего моделирования работы персептрона создадим персептрон с одним нейроном с двумя входами. Зададим входной вектор

>> P=[1; 1];

Пусть для этого входного вектора целевое значение равно единице

>> T=1;

Построим сконфигурированную сеть

>> net1 = configure(net,P,T);

Просмотрим структуру сконфигурированной сети (рис. 1.6)

>> view(net1)

Рис. 1.6. Структура сконфигурированной сети

Теперь на структуре сети отображены реальные размеры массивов.

Илон Маск рекомендует:  AnsiUpperCase - Функция Delphi
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL