Нейроны в конкурентном слое распределяются, чтобы распознать часто представленные входные векторы.
Архитектура конкурентоспособной сети показана ниже.
‖ dist
‖ поле на этом рисунке принимает входной вектор p и вход веса IW1,1, и создает вектор, имеющий S1 элементов. Элементами являются отрицательные расстояния между входным вектором и векторами i IW1,1 формируется из строк входа веса.
Вычислите вход сети n1 конкурентного слоя путем нахождения отрицательного расстояния между входным вектором p и векторами веса и добавления смещений b. Если все смещения равны нулю, максимальный вход сети, который может иметь нейрон, равен 0. Это происходит, когда входной вектор p равен этому вектору веса нейрона.
Конкурентная передаточная функция принимает вектор сетевого входа для слоя и возвращает выходы нейронов 0 для всех нейронов, кроме победителя, нейрона, связанного с наиболее положительным элементом сети входа n1. Выход победителя равен 1. Если все смещения 0, то нейрон, чей вектор веса ближе всего к входному вектору, имеет наименьший отрицательный чистый вход и, следовательно, выигрывает конкуренцию, чтобы вывести 1.
Причины использования смещений с конкурирующими слоями приведены в Правиле Bias Learncon (learncon).
Можно создать конкурентоспособную нейронную сеть с функцией competlayer
. Простой пример показывает, как это работает.
Предположим, что вы хотите разделить следующие четыре двухэлементных вектора на два класса.
p = [.1 .8 .1 .9; .2 .9 .1 .8]
p = 0.1000 0.8000 0.1000 0.9000 0.2000 0.9000 0.1000 0.8000
Существует два вектора около источника и два вектора около (1,1).
Во-первых, создайте конкурентный слой с двумя нейронами.:
net = competlayer(2);
Теперь у вас есть сеть, но вам нужно обучить ее выполнять классификационную работу.
При первом обучении сети ее веса будут инициализированы в центры входных областей значений с функцией midpoint
. Можно проверить, видят ли эти начальные значения, используя количество нейронов и входные данные:
wts = midpoint(2,p)
wts = 0.5000 0.5000 0.5000 0.5000
Эти веса действительно являются значениями в середине области значений (0-1) входов.
Начальные смещения вычисляются initcon
, что дает
biases = initcon(2)
biases = 5.4366 5.4366
Напомним, что каждый нейрон конкурирует, чтобы ответить на входной вектор p. Если смещения все 0, нейрон, чей вектор веса ближе всего к p, получает наивысший чистый вход и, следовательно, выигрывает конкуренцию, и выводит 1. Все другие нейроны выводят 0. Вы хотите настроить нейрон выигрыша так, чтобы переместить его ближе к входу. Правило обучения для этого обсуждается в следующем разделе.
Веса выигрышного нейрона (строки входа матрицы веса) корректируются правилом обучения Кохонена. Предположим, что i -й нейрон побеждает, элементы i-й строки входа веса корректируются как показано ниже.
Правило Кохонена позволяет весам нейрона изучать вектор входа, и из-за этого оно полезно в приложениях распознавания.
Таким образом, нейрон, чей вектор веса был ближе всего к вектору входа, обновляется, чтобы быть еще ближе. Результатом является то, что выигрышный нейрон с большей вероятностью выиграет конкурс в следующий раз, когда будет представлен подобный вектор, и с меньшей вероятностью выиграет, когда будет представлен очень другой вектор входа. Поскольку представлены все больше и больше входы, каждый нейрон в слое, ближайшем к группе входа векторов, вскоре корректирует свой вектор веса к этим входам векторам. В конечном счете, если нейронов достаточно, каждый кластер аналогичных входных векторов будет иметь нейрон, который выводит 1, когда вектор в кластере представлен, и выводит 0 в любое другое время. Таким образом, конкурентная сеть учится классифицировать входные векторы, которые она видит.
Функция learnk
используется для выполнения правила обучения Kohonen в этом тулбоксе.
Одним из ограничений конкурентоспособных сетей является то, что некоторые нейроны не всегда могут быть распределены. Другими словами, некоторые векторы веса нейронов могут начинаться далеко от любых входных векторов и никогда не выигрывать конкуренцию, независимо от того, как долго продолжается обучение. Результатом является то, что их веса не получают учиться и они никогда не выигрывают. Эти несчастные нейроны, называемые мертвыми нейронами, никогда не выполняют полезную функцию.
Чтобы остановить это, используйте смещения, чтобы дать нейронам, которые только выигрывают конкуренцию редко (если когда-либо) преимущество перед нейронами, которые часто выигрывают. Положительное смещение, добавленное к отрицательной дистанции, делает удаленный нейрон более вероятным к победе.
Для выполнения этой работы сохраняется среднее значение выходов нейронов. Это эквивалентно процентам раз каждый выход равен 1. Это среднее значение используется для обновления смещений функцией обучения learncon
так, что смещения часто активных нейронов становятся меньше, а смещения нечасто активных нейронов становятся больше.
Когда смещения нечасто активных нейронов увеличиваются, входное пространство, на которое эти нейроны реагируют, увеличивается. Когда это входное пространство увеличивается, нечасто активный нейрон реагирует и движется к большему количеству входных векторов. В конечном счете нейрон реагирует на то же количество векторов, что и другие нейроны.
Это имеет два хороших эффекта. Во-первых, если нейрон никогда не выигрывает конкуренцию, потому что его веса далеки от любого из входных векторов, его смещение в конечном счете становится достаточно большим, чтобы он мог победить. Когда это происходит, он движется к некоторой группе входа векторов. Как только веса нейрона переместились в группу входа векторов, и нейрон выигрывает последовательно, его смещение уменьшится до 0. Таким образом решается проблема мертвых нейронов.
Второе преимущество смещений заключается в том, что они заставляют каждый нейрон классифицировать примерно одинаковый процент входа векторов. Таким образом, если область входного пространства связана с большим количеством входа векторов, чем другая область, то более плотно заполненная область привлечет больше нейронов и будет классифицирована на меньшие подсекции.
Скорости обучения для learncon
обычно задают порядок величины или больше, чем для learnk
чтобы убедиться, что среднее выполнение точно.
Теперь обучите сеть на 500 эпох. Вы можете использовать или train
или adapt
.
net.trainParam.epochs = 500; net = train(net,p);
Обратите внимание, что train
для конкурентоспособных сетей используется функция обучения trainru
. Это можно проверить, выполнив следующий код после создания сети.
net.trainFcn
ans = trainru
Для каждой эпохи все обучающие векторы (или последовательности) представляются один раз в разном случайном порядке с сетью и значениями веса и смещения, обновленными после каждой отдельной презентации.
Затем поставьте исходные векторы как вход в сеть, промоделируйте сеть и, наконец, преобразуйте ее выходные векторы в индексы классов.
a = sim(net,p); ac = vec2ind(a)
ac = 1 2 1 2
Вы видите, что сеть обучена классифицировать входные векторы в две группы, те, что близки к источнику, класс 1 и те, что близки (1,1), класс 2.
Возможно, было бы интересно взглянуть на окончательные веса и предубеждения.
net.IW{1,1}
ans = 0.1000 0.1500 0.8500 0.8500
net.b{1}
ans = 5.4367 5.4365
(Вы можете получить различные ответы при запуске этой задачи, потому что случайный seed используется для выбора порядка векторов, представленных сети для обучения.) Обратите внимание, что первый вектор (сформированный из первой строки матрицы веса) находится рядом с входными векторами, близкими к источнику, в то время как вектор, сформированный из второй строки матрицы веса, близок к входным векторам около (1,1). Таким образом, сеть была обучена - просто путем воздействия на нее входов - чтобы классифицировать их.
Во время обучения каждый нейрон в слое, ближайшем к группе входа векторов, корректирует свой вектор веса к этим входам векторам. В конечном счете, если нейронов достаточно, каждый кластер аналогичных входных векторов имеет нейрон, который выводит 1, когда вектор в кластере представлен, и выводит 0 в любое другое время. Таким образом, конкурентная сеть учится классифицировать вход.
Конкурентные слои можно понять лучше, когда их векторы веса и входные векторы показаны графически. Схема ниже показывает 48 двухэлементных входных векторов, представленных +
маркеры.
Входные векторы выше, по-видимому, попадают в кластеры. Можно использовать конкурентоспособную сеть из восьми нейронов, чтобы классифицировать векторы в такие кластеры.
Попробуйте Конкурентное Обучение, чтобы увидеть динамический пример конкурентного обучения.