Закон нейрокода
Четверг, Сентябрь 2nd, 2010(По аналогии с законом Мура)
Каждые полтора года, скорость написания нейрокода нейрокодом увеличивается вдвое. Закон наблюдается с 2003го года. Ускорение было с связи:
* с лучшим изучением С++
* углублением опыта в MFC – основной библиотеке GUI под виндовс со времен 90х годов
* (трехкратное ускорение) переходом с MFC на Qt и повышением опыта в Qt – лучшей библиотеке GUI для виндовс 2000х годов
* постоянным развитием интерфейса Нейролаборатории, из-за чего отладка нейросетей постоянно ускорялась
* развитием архитектуры Нейролаборатории: переходу к шаблонным классам, использования метаданных о полях нейронов и связей, указателей на функции обработки нейронов и т. д.
* развитием теории ИНС: универсализация нейронных цепочек, переход к раздельно тактируемым нейроконтурам, усовершенствование архитектуры и более четкая специализация нейронов в нейрокластерах
* постоянное повышение уровня абстракции
* метанейросети: я начал добавлять в Нейролабораторию то поведение, которое наблюдаю у себя.
Подробнее о последнем. В этой статье затронут первый аспект – тестирование.
Началось все с системы тестирования. Бывало, что после минимальных изменений в коде ИНС, она начинала работать совсем не так. Ошибка оставалась незамеченной, а потом вылазила после долгой отладки. Скажем, в некоторых условиях нужная связь между нейронами не прорастала. Беглый взгляд на нейросеть давал результат «вроде все как раньше». Для более быстрого обнаружения таких неполадок и нужна была система тестирования. Первая система тестирования была основана на таблицах данных о нейронах. В каждом нейроне проверялась информация: идентификатор (такой нейрон должен существовать, по нему в происходит сверка остальных полей), идентификатор кластера, тип нейрона, порог и количество связей. Вначале, такие таблицы я прописывал в коде на С++. (Скопировать таблицу нейронов в Excel, выделить нужную колонку данных, вставить ее в Visual Studio, вызвать макрос «дописать в конец каждой строки некоторую строку» – типа запятых для разделения разных полей). Выходило что-то типа
-
namespace B2Test
-
{
-
NeuronTestData g_arrTestData[]={
-
NeuronTestData(102, 809, BrainB2::NTypeIn, 1, 1),
-
NeuronTestData(103, 817, BrainB2::NTypeIn, 1, 1),
-
NeuronTestData(104, 825, BrainB2::NTypeIn, 1, 1),
-
NeuronTestData(105, 833, BrainB2::NTypeIn, 1, 1),
-
NeuronTestData(106, 841, BrainB2::NTypeIn, 1, 1),
-
NeuronTestData(107, 849, BrainB2::NTypeIn, 1, 1),
-
NeuronTestData(108, 857, BrainB2::NTypeIn, 1, 0),
-
NeuronTestData(109, 865, BrainB2::NTypeIn, 1, 1),
-
NeuronTestData(110, 873, BrainB2::NTypeIn, 1, 0),
-
NeuronTestData(111, 881, BrainB2::NTypeIn, 2, 2),
-
NeuronTestData(112, 889, BrainB2::NTypeIn, 1, 1),
-
NeuronTestData(113, 897, BrainB2::NTypeIn, 1, 1),
-
NeuronTestData(114, 905, BrainB2::NTypeIn, 1, 0),
-
…
После того, как таких таблиц стало несколько, повторять такие операции стало утомительно, и я написал код для формирования таких таблиц по выделенным нейронам. Но пару раз возникла проблема – смена идентификаторов все рушила. Например, в нейросети добавилась одна буква к сенсорам, и тест больше не проходится. Конечно, можно было перегенерировать таблицу заново – благо, это уже происходило быстрее. Но захотелось сделать еще более универсальную систему. Которая сама бы анализировала семантику нейросети, смотрела на существование нужных связей с нужными адресатами у каждого нейрона, а не только общее количество связей у каждого нейрона. Задача формулировалась так: проверять, содержит ли некоторая нейросеть подсеть с заданными характеристиками. Или по другому – найти некоторый подграф. Идентификаторы нейронов при этом могли быть любыми.
Сначала пришлось написать обслуживающий код. Выбор данных для тестирования берется в зависимости от того, какие данные поступали на вход нейросети. А именно, какая конкретно строка текста будет скормлена ИНС. И естественно, учитывается еще и тип ИНС – потому что в Нейролаборатории их несколько. (Именно этот момент и запечатлен тут – применяется еще тестирование по таблицам «NL UI: тестирование ИНС» ( http://neurocod.net/blog/tag/2010/06/nl-ui-тестирование-инс )). Как получить подсеть нейросети для формирования теста? Большая часть уже была готова, включая интерфейс: см. «Понимание структуры ИНС-2» ( http://neurocod.net/blog/tag/2010/01/понимание-структуры-инс-2 )

Выделенную подсеть можно использовать для создания тестирующей
Код сериализации такой вспомогательной нейросети тоже был готов (тестовая нейросеть имеет один и тот же тип независимо от того, ИНС какого типа она тестирует) – потому что код сериализации нейросетей универсальный, на основе шаблонов. Осталось подумать, как находить произвольный подграф в заново отработавшей исходной нейросети, которую надо протестировать. Задача ресурсоемкая и не простая для реализации. Легче всего с сенсорами: сначала получить сенсорные нейроны, узнать их идентификатора, прописать это соответствие, и затем искать оставшиеся. Но тут подумал: я ведь легко справляюсь с подобной задачей поиска подсети? Да. Почему? Нужно перенести эти эвристики и в Нейролабораторию. Полезли мысли типа таких:
* очередность (порядок) идентификаторов в тестирующей и тестируемой ИНС должны совпадать.
* (я не прокручиваю таблицу далеко) проверять не все нейроны, а только с идентификаторами в небольшой «округе» от исходного идентификатора – например, +-100 нейронов. Это даст защиту от незначительных изменений нейросети. Для каждого теста должны быть настройки гибкости: величина окрестности для поиска нейронов от первоначального идентификатора. Для начала можно реализовать единственный вариант: окрестность 0 – то есть, брать те же идентификаторы, что и раньше, и проверять связи. Было сделано.
* относительное расстояние между идентификаторами может отличаться на некоторую небольшую дельту от того, которое было в исходной ИНС. А если относительное расстояние не меняется… были нейроны 3, 5, 10, а стали 13, 15, 20… Эврика! Для многих случаев подойдет и такой простой способ поиска соответствия нейронов в тестируемой и тестирующей НС: перебирать только самый первый нейрон в подграфе, а остальные брать от него на прежнем смещении. И каждую полученную комбинацию проверять. Было сделано. Старую схему, которая ищет только идентификаторы с точным совпадением, решил не удалять. Старый режим проверки принят по умолчанию для вновь создаваемых тестов. Он удобен для проверок после рефакторинга – точно так ли ведет себя ИНС. Если же разработчик хочет ослабить ограничение поиска, то меняет в таблице значение всего одного поля, и поиск будет вестись уже более широко. Такое ослабление нужно санкционировать.
Грядущая Раса: Hypocrisy – A Coming Race
Audio clip: Adobe Flash Player (version 9 or above) is required to play this audio clip. Download the latest version here. You also need to have JavaScript enabled in your browser.
Why all this searching?
The answer’s always been near
It is our destiny
Away from a screeching people
Waiting to destroy ourselves
They can’t interfere with history
Nuclear creation
For eternity they can’t be strained
All I wish they would land here!
But It’s too late now
Time is dying a soldier
With all them to around decay
In the other dimension
Time will no longer exist
No one never grow old
Something mankind will never resist
The destroying of soldiers









