Правило обучения слоя Кохонена, называемое также правилом Кохонена, заключается в том, чтобы настроить нужным образом элементы матрицы весов. Предположим, что нейрон
Правило Кохонена представляет собой рекуррентное соотношение, которое обеспечивает коррекцию строки
Настройка параметров сети по правилу Кохонена реализована в виде М-функции learnk.
3.1.4 Правило настройки смещений
Одно из ограничений всякого конкурирующего слоя состоит в том, что некоторые нейроны оказываются незадействованными. Это проявляется в том, что нейроны, имеющие начальные весовые векторы, значительно удаленные от векторов входа, никогда не выигрывают конкуренции, независимо от того как долго продолжается обучение. В результате оказывается, что такие векторы не используются при обучении и соответствующие нейроны никогда не оказываются победителями. Такие нейроны-неудачники называются "мертвыми" нейронами, поскольку они не выполняют никакой полезной функции. Чтобы исключить такую ситуацию и сделать нейроны чувствительными к поступающим на вход векторам, используются смещения, которые позволяют нейрону стать конкурентным с нейронами-победителями. Этому способствует положительное смещение, которое добавляется к отрицательному расстоянию удаленного нейрона.
Соответствующее правило настройки, учитывающее нечувствительность мертвых нейронов, реализовано в виде М-функции learncon и заключается в следующем - в начале процедуры настройки всем нейронам конкурирующего слоя присваивается одинаковый параметр активности:
где
где
Нетрудно убедиться, что для всех нейронов, кроме нейрона-победителя, приращения отрицательны. Поскольку параметры активности связаны со смещениями соотношением (в обозначениях системы MATLAB):
то из этого следует, что смещение для нейрона-победителя уменьшится, а смещения для остальных нейронов немного увеличатся.
М-функция learnсon использует следующую формулу для расчета приращений вектора смещений:
Параметр скорости настройки
3.1.5 Обучение сети
Реализуем 10 циклов обучения. Для этого можно использовать функции train или adapt:
net.trainParam.epochs = 10
net = train(net,p)
net.adaptParam.passes = 10
[net,y,e] = adapt(net,mat2cell(p)).
Заметим, что для сетей с конкурирующим слоем по умолчанию используется обучающая функция trainwbl, которая на каждом цикле обучения случайно выбирает входной вектор и предъявляет его сети; после этого производится коррекция весов и смещений.
Выполним моделирование сети после обучения:
а = sim(net,p)
ас = vec2ind(a)
ас = 2 1 2 1.
Видим, что сеть обучена классификации векторов входа на 2 кластера: первый расположен в окрестности вектора (0,0), второй - в окрестности вектора (1,1). Результирующие веса и смещения равны:
wtsl = net.IW{l,l}
b1 = net.b{l}
wts1 =
0.58383 0.58307
0.41712 0.42789
b1=
5.4152
5.4581.
Заметим, что первая строка весовой матрицы действительно близка к вектору (1,1), в то время как вторая строка близка к началу координат. Таким образом, сформированная сеть обучена классификации входов. В процессе обучения каждый нейрон в слое, весовой вектор которого близок к группе векторов входа, становится определяющим для этой группы векторов. В конечном счете, если имеется достаточное число нейронов, каждая группа векторов входа будет иметь нейрон, который выводит 1, когда представлен вектор этой группы, и 0 в противном случае, или, иными словами, формируется кластер. Таким образом, слой Кохонена действительно решает задачу кластеризации векторов входа.
3.1.6 Моделирование кластеризации данных
Функционирование слоя Кохонена можно пояснить более наглядно, используя графику системы MATLAB. Рассмотрим 48 случайных векторов на плоскости, формирующих 8 кластеров, группирующихся около своих центров. На графике, приведенном на рисунке 3.3, показано 48 двухэлементных векторов входа.
Сформируем координаты случайных точек и построим план их расположения на плоскости:
с = 8
n = 6 % Число кластеров, векторов в кластере
d = 0.5 % Среднеквадратичное отклонение от центра кластера
х = [-10 10;-5 5] % Диапазон входных значений
[r,q] = size(x); minv = min(x1)1; maxv = mах(х1)1
v = rand(r, e).С{maxv - minv) *ones(l,c) + xninv*ones (l,c) )t = c*n % Число точек
v= [v v v v v]; v=v+randn{r,t)*d % Координаты точек
Р = v
plot(P(l,:), P(2,:),'+k') % (рисунок 3.3)
title('Векторы входа'), xlabel('Р(1,:)'), ylabel('P(2,:)').
Векторы входа, показанные на рисунке 3.3, относятся к различным классам.
Рисунок 3.3 – Двухэлементные векторы входа
Применим конкурирующую сеть из восьми нейронов для того, чтобы распределить их по классам:
net = newc([-2 12;-1 6], 8 ,0.1)
w0 =net.IW{l}
b0 = net.b{l}
c0 = exp(l)./b0.
Начальные значения весов, смещений и параметров активности нейронов представлены ниже:
w0 =b0 =с0 =
0.50.2521.7460.125
0.50.2521,7460.125
0.50.2521.7460.125
0-50.2521.7460.125
0.50.2521.7460.125
0.50.2521.7460.125
0.50.2521.7460.125
0.50.2521.7460.125.
После обучения в течение 500 циклов получим:
net.trainParam.epochs = 500
net = train(net,P)
w = net.IW{l} bn = net.b{l}
cn = exp(1)./bn
wn=bn=cn=
6.2184 2.423922.1370,123
1.3277 0.9470121.7180.125
0.31139 0.4093521.1920.128
3.543 4.584521.4720.127
3.4617 2.8S9621.9570.124
4 3171 1.427821.1850.128
6.7065 0.4369623.0060.118
0.97S17 0.1724221.420.127.
Как следует из приведенных таблиц, центры кластеризации распределились по восьми областям, показанным на рисунке 3.4, а; смещения отклонились в обе стороны от исходного значения 21.746 также, как и параметры активности нейронов, показанные на рисунке 3.4, б.
Рисунок 3.4 – Полученные центры кластеризации
Рассмотренная самонастраивающаяся сеть Кохонена является типичным примером сети, которая реализует процедуру обучения без учителя.
3.2 Карта Кохонена в MATLABNNT
Самоорганизующаяся сеть в виде карты Кохонена предназначена для решения задач кластеризации входных векторов. В отличие от слоя Коконена карта Кохонена поддерживает такое топологическое свойство, когда близким кластерам входных векторов соответствуют близко расположенные нейроны.