Поговорим немного о растущей нейронной сети SOINN

в 18:11, , рубрики: ESOINN, SOINN, Алгоритмы, искусственный интеллект, метки: , ,

Предыдущий пост

Еще в 2006 году был предложен метод постепенного (возрастающего) обучения, названый самоорганизующейся возрастающей нейронной сетью (SOINN), для того, чтобы попытаться осуществить неконтролируемое обучение (самообучение без учителя). SOINN хорошо справляется с обработкой нестационарных данных в режиме онлайн, сообщает о числе определенных кластеров и представляет топологическую структуру входных данных с учетом вероятности плотности вероятности распределения. Hasagawa, предложивший вариант сети SOINN, сравнивал результаты работы своей сети с GNG сетью (расширяющегося нейронного газа) и результат сети SOINN получался лучше чем у GNG.

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

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

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

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

Если некий узел i имеет соседние узлы, тогда порог подобия Ti вычисляется используя максимальное расстояние между этим узлом i и его соседними узлами.
Ti = макс ||Вес_входа – Вес_соседа ||
Т.е Ti (порог подобия) – это дистанция до самого удаленного соседа узла i

Если узел i соседних узлов не имеет, тогда порог подобия Ti вычисляется как дистанция между вектором i и самым близким к нему вектором имеющимся в сети.
Ti = мин || Вес_входа – Вес_узла_сети ||

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

Если входной вектор определен как принадлежащий к одному кластеру как у победителя или второго победителя, и если нет связей соединяющих победителя и второго победителя, тогда соединим победителя и второго победителя с помощью связи и установим возраст этой связи равной нулю; дальше увеличим возраст всех связей соединенных с победителем на 1.
Потом обновим вес вектора победителя и его узлов соседей. Мы используем узел i с входными данными чтобы найти узел победитель и в переменной узла — Количество_побед –показываем сколько раз узел i был победителем.

Изменим вес победителя по формуле:
Вес_победителя = (1/Количество_побед_победителя) * (Вес_входного_вектора – Вес_победителя)

Изменим веса всех соседей победителя по формуле:
Вес_соседа_победителя = (1 / (100*Количество_побед_победителя)) * (Вес_входного_вектора – Вес_соседа_победителя)

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

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

Сеть SOINN с двумя слоями имеет следующие недостатки:
Трудно выбрать, когда остановить обучение первого слоя и начать обучение второго слоя;

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

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

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

После истечения таймера Время_обучения, ESOINN отделяет узлы на различные подклассы и удаляет связи, которые лежат в перекрытых областях. ESOINN не использует вставку в пределах класса.

Удаление второго слоя делает ESOINN более подходящей для постоянного (возрастающего) онлайн обучения, чем двуслойная SOINN. Это также убирает трудность выбора того, когда нужно заканчивать обучение первого слоя и начинать обучение второго слоя. Отказ от вставки в пределах класса удаляет из сети пять параметров, которые были необходимы для осуществления такой вставки, упрощается понимание алгоритма работы сети.

Блок_схема работы сети ESOINN

Блок-схема сети ESOINN

Журнал на английском языке с описанием ESOINN размер 1,8 мб. (Читать онлайн)

На Github есть пример кода SOINN на С++ (Ссылка)

Автор: zkolenko

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js