Отлаживать выделение условных рефлексов лучше с объективным контролем. Создадим искусственный мир, в котором будет жить ИНС. В этом мире можно проводить некоторые действия и получать отдачу с учетом того, правильные ли были действия. Начинать можно с самых простых условий: есть всего 2 действия, с названиями «1» и «2». Мир посылает разные комбинации признаков, в ответ можно делать действия 1 или 2, в случае правильного ответа мир посылает подкрепление — символ "+". Например, мир послал А, а ИНС в ответ сделала действие 2, то мир пошлет ей +. После признака Б надо делать 1, тогда тоже будет +. Мир может посылать «мусорные» признаки T1...TN, которые ни на что не влияют, а заставляют ИНС отделять важное от неважного.

Внешний интерфейс


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


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

С усложнением алгоритмов ИНС можно усложнять и миры.


Так как в этом мире ИНС воспринимает не буквы напрямую, а нейроны, на которые пришла активация от неизвестной ей строки, то она не сможет понять, что «на букву T — значит мусорное», ей придется запоминать последствия срабатывания нейронов.

Сенсорные нейроны/кластеры


… можно создавать такими способами:
1) если пришла новая сенсорная строка, неизвестная для ИНС, то тут же создать для неё сенсорный нейрон/кластер. В дальнейшем ИНС будет его анализировать как еще один признак, количество которых ей безразлично.
2) для некоторых системных нейронов (типа позитивных эмоций) придется заранее запросить и создать их, чтобы алгоритмы знали, где брать данные.
3) если сенсорные нейроны создавать «по требованию», может выйти неудобная ситуация, когда сенсорные нейроны идут вперемешку с обычными. В этом случае может быть удобно заранее создать все сенсорные нейроны. Например, если известно, что ИНС будет работать с обычными текстами, то можно заранее запросить весь алфавит.

Прогнозирование


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

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


ИНС прогнозирует каждый вариант действия и выбирает тот, который даст лучший результат. Этот способ годится как для примитивных миров с небольшим количеством действий (для отладки других алгоритмов), так и для более сложных ИНС, когда ИНС будет сама сужать круг действий до некоторого небольшого списка, уместного в данной ситуации, и выбирать уже между ними.
В самом примитивном случае алгоритм устроен так: после очередного шага распознавания, зайти в цикл по возможным действиям, выбрать очередное действие, «уйти в виртуальность»; активировать выбранное действие и запомнить его, словно это происходит в реальности. Посмотреть, какие цепочки были распознаны — если выделенные цепочки нашли закономерности, то они сработают. Сделать так несколько шагов, чтобы активация прошла до своих последствий — позитивных или негативных эмоций. Запомнить сумму эмоций за все время прогнозирования. Если эмоция только одна — позитивная — то это просто, иначе придется анализировать вектор разных эмоций и выбирать, что лучше — немного негатива и сколько там позитива или еще что.
Более реалистичные алгоритмы можно получить, если ИНС будет проводить прогнозирование параллельно с остальным мышлением, без необходимости полностью «уходить в виртуальность». К этим алгоритмам лучше вернутся позже.

Восстановление контекста


После того, как действие с наилучшей характеристикой найдено, система «выходит из виртуальности», и делает его в реальности. Что важно — после возврата из фантазий нужно восстановить состояния нейронов, как будто система не была только что в мечтах, а продолжает воспринимать происходившее только что. Это важно, потому что иначе система не сможет распознать сложные признаки (Hierarchical Temporal Memory).
1) первый метод — влоб, на С++ — запомнить активации всех нейронов, провести прогнозирование, восстановить активации.
2) «нейронный подход»: притормозить текущие активации, вернутся по цепочке памяти назад на несколько шагов, и последовательно вспомнить их. То есть, так как все события гиппокамп заносит в единую цепочку, то надо пройтись от последней точки запоминания гиппокампа назад, и запустить 1ВЦ по аналогии с тем, что рассматривался в прошлой статье.
3) «математический подход»: в ИНС из конца цикла не нужно будет восстанавливать контекст, так как информация хранится другим способом, и контекст не теряется.

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

Виртуальное время


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

class NeuroTime {
	public:
		typedef quint32 Iter;
		typedef quint16 Cycle;
	protected:
		BrainState* _state;
		Iter _iter;//in world ticks
		Cycle _cycle;//вызовы ф-й и создание/удаление кл/св в пределах текущей итерации - мира или сна, безразлично.
		Cycle _nnChanges;//создание/удаление кл/св в пределах текущей итерации
...


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

Продолжение — HTM и текст

Комментарии (0)