Archive for Апрель, 2009

№93 NL UI: Выбор координат нейронов для карты нейронов

Четверг, Апрель 23rd, 2009

Нейронная карта/поле нейронов полезна для удобства отладки, для придания большей образности процессу разработки, для подготовки пояснительных схем. Как нейроны располагаются на этом поле? Доступно и ручное перетаскивание нейронов, чего достаточно для построения обучающих схем. В этой заметке рассматривается автоматическое расположение.
При создании окна карты, в ИНС уже может присутствовать большое количество нейронов. Например, ИНС может быть загружена из файла, либо это могут быть предварительно созданные сенсорные и эффекторные нейроны. Либо окно с картой нейронов может быть создано после некоторого времени работы ИНС.
По умолчанию, уже существующие нейроны располагаются квадратом, по порядку перечисления, который совпадает с порядком их создания.
Как располагать новые нейроны? Сколько их будет создано в процессе работы ИНС – окну заранее не известно. Желательно располагать нейроны так, чтобы обе координаты задействовались в примерно равной степени. Принята следующая схема: новые нейроны располагаются вправо от последних добавленных; при достижении некоторой внутренней границы происходит «перевод строки». После перевода «курсора» для вставки следующего нейрона, длина строки будет на единицу больше. Поэтому рост ИНС в карте будет напоминать треугольник (или трапецию – в зависимости от начальных условий). Со временем нижнее основание будет расти все больше. При этом, верхняя правая часть окна не используется, она остается пустой. Потери свободного пространства при таком способе расположения – около 50%.
Благодаря использованию Qt, карта поддерживает масштабирование.


Рис. 93-1 Автоматическое трапециевидное расширение ИНС при добавлении новых нейронов

На рис. 93-1 показана тестовая ИНС, у которой квадратом были расположены нейроны, существовавшие на момент инициализации карты. Остальные нейроны были добавлены позже.
За один такт работы ИНС может быть создано несколько нейронов. Особенно, если ИНС работает на основе кластеров. Неплохо было бы расположить их не по прямой линии, а как-то более компактно. Так и сделано: если в ИНС появляются новые нейроны, то карта группирует нейроны по циклу создания, и каждую такую группу размещает отдельно, в виде прямоугольника. Размещение начинается с той же позиции, где должен был расположиться один новый нейрон. Величина сторон прямоугольника выбирается на основе квадратного корня от числа нейронов в размещаемой группе. После размещения группы, текущий курсор смещается примерно так, как обрабатывается курсор в случае одного нейрона. Пример этого типа размещения показан на рис. 93-2. Для примера использую старые снимки экрана, так как сейчас этот режим нигде не задействован.


Рис. 93-2 Автоматическое размещение нейронов, сгруппированных по циклу создания, прямоугольниками

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


Рис. 93-3 Нечетное количество нейронов при прямоугольном размещении помогает визуально определять кластеры

Но хочется получить более точный контроль над размещением нейронов в кластере. Например, хочется, чтобы нейроны, работающие с признаками, размещались внизу кластера, а нейроны выхода – вверху. Решение-заплатка – подбирать очередность создания нейронов разных типов в кластере так, чтобы получить необходимое расположение.
При росте количества нейронов в кластере это решение становится совсем некрасивым. Кластеров может быть несколько типов – например, кластеры памяти, а также отдельные нейроны цепочек нечеткого распознавания. Поэтому сейчас в НЛ используется следующее решение. ИНС может переопределить метод для возврата объекта-«расположителя»:

  1. //У объекта-«расположителя» длинное название. Ранее, карты нейронов
  2. //располагали нейроны на основе целочисленных индексов стандартной сетки. Потом было
  3. //принято решение перейти к расположению на основе индексов с числами с плавающей точкой.
  4. //Поэтому и название содержит FloatIndexPlacer.
  5. //(NeuroItem – имя класса нейрона в двухмерной карте)
  6. virtual NeuroItemsFloatIndexPlacerAbstract* getNeuroItemsFloatIndexPlacer()=0;

Определение этого класса содержит единственную функцию:

  1. virtual void placeByNeuron(IN bioId id, OUT QList<QPair<bioId, QPointF> > & listPlacedNeurons)=0;

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

  1. //QNLBrain – родительский класс для любой ИНС в Нейролаборатории
  2. //в нем есть следующая функция, которая применяется только для краткости кода:
  3. void QNLBrain::placeNeuron(CommonNeuron* pn, qreal x, qreal y, OUT QList<QPair<bioId, QPointF> > & listPlacedNeurons)
  4. {
  5.         listPlacedNeurons.push_back( QPair<bioId, QPointF>(pn->id(), QPointF(x, y)));
  6. }
  7.  
  8. //пример расположения нейронов кластера на карте:
  9. void BrainB1::placeByNeuron(IN bioId id, OUT QList<QPair<bioId, QPointF> > & listPlacedNeurons)
  10. {
  11.         neuron* pn = GetNeuronById(id);
  12.         ASSERT(pn);
  13.         //получить кластер по нейрону. В ИНС Б1 все нейроны принадлежат кластерам
  14.         TCC* tcc = getTcc(pn);
  15.         ASSERT(tcc);
  16.         placeNeuron(tcc->down   , 0.0, 0.0, listPlacedNeurons);
  17.         placeNeuron(tcc->ninPrev, 0.0, 1.0, listPlacedNeurons);
  18.         placeNeuron(tcc->help   , 0.5, 1.7, listPlacedNeurons);
  19.         placeNeuron(tcc->nout   , 1.0, 0.0, listPlacedNeurons);
  20.         placeNeuron(tcc->nin    , 1.0, 1.0, listPlacedNeurons);
  21. }

Результат будет выглядеть так:


Рис. 93-4 Результат выполнения приведенного кода

Забегая вперед, вот как выглядит схема кластера ИНС Б2:


Рис. 93-5 Схема кластера ИНС Б2 в двухмерной карте нейронов

В ИНС Б2, нейроны цепочки нечеткого распознавания располагаются отдельно от основных кластеров: нейроны SL0 чуть ниже, посередине кластера, а SL1 – на одну позицию выше:


Рис. 93-6 Пример расположения нескольких видов нейронных цепочек на карте

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

Обновление: код уже переписан. В первой версии статьи, до переписывания, было следующее:
Подытоживая, можно добавить, что на текущий момент, код по выбору координат и смещений в самой карте – один из самых некрасивых во всей Нейролаборатории. В нем остались пережитки нескольких старых архитектурных решений, принятых в мою бытность начинающим разработчиком: работа с целочисленными индексами (можно оставить только плавающие), возможность устанавливать ограничения на рост (что было нужно при упаковке нейронов в другие контейнеры, но более правильное решение – разрешить рост контейнеров), возможность обмена осей x и y (правильно делать на основе прокси-объекта с тем же интерфейсом, а не на основе вездесущих проверок с перестановками, которые могут невзначай поменять оси лишний раз). Если выпадут пару свободных месяцев – может, исправлю. А сейчас, с учетом приоритетности, устраивает и текущий результат.

Цитата с ВиМ

Вторник, Апрель 21st, 2009

Цитата n-bitva с http://www.warandpeace.ru/ru/commentaries/view/34761/ : (далее…)

№92 Мозгокод на С++ в Нейролаборатории

Понедельник, Апрель 20th, 2009
«№40 О реализации нейронов в НЛ 3.0» ( http://neurocod.net/blog/2009/2008/08/№40-о-реализации-нейронов-в-нл-30 )
«№82 Сокращенная запись алгоритмов ИНС с применением контуров и виртуальных связей. “Мозгокод”.» ( http://neurocod.net/blog/2009/2009/02/№82-сокращенная-запись-алгоритмов-инс )

При моих ресурсах, создавать транслятор с Мозгокода на какой-нибудь другой язык нецелесообразно. Особенно, когда С++ позволяет настолько легко приближаться к Мозгокоду в форме записи.
В шаблонный класс NLBrain добавлен шаблонный класс «_НейронныйКонтур» (_NeuroCircuit). Этот шаблонный класс принимает шаблонный параметр – тип списка нейронов, с которыми он будет работать. Напомню, что каждый нейрон содержится в двух списках – списка всех нейронов ИНС и списка нейронов того же числового типа. От этого класса наследуются класс NeuroCircuit (без знака подчеркивания), который работает с нейронами некоторого типа («настоящий» контур), а также класс AllNeuronsCircuit, который работает со всеми нейронами ИНС. Несмотря на то, что он не является «настоящим» контуром, при помощи него удобно записывать команды для исполнения всей ИНС, да еще в том же коротком стиле, что и для обычных контуров.

Чтобы код был понятнее, (несмотря на небольшое увеличение набираемого текста) используются не операторы С++, а обычные функции. Например, функции по простому обмену полей, без вычисления угасания сигналов:

  1. template<typename NeuroLinkedListType>
  2. class _NeuroCircuit: public INeuroCircuit
  3. {
  4. public:
  5.     //SwapC == Swap Cycles
  6.     void SwapC()
  7.     {
  8.             UINT64 ret = 0;
  9.             NeuroLinkedListType::iterator iter(m_listByType);
  10.             for(;iter;iter++)
  11.             {
  12.                     neuron* pn = iter;
  13.                     pn->setCurActivation(pn->nextActivation());
  14.             }
  15.             logSwapC(count());
  16.     }
  17.     void SwapC(signal_t nextAct)
  18.     {
  19.             NeuroLinkedListType::iterator iter(m_listByType);
  20.             for(;iter;iter++)
  21.             {
  22.                     neuron* pn = iter;
  23.                     pn->setCurActivation(pn->nextActivation());
  24.                     pn->setNextActivation(nextAct);
  25.             }
  26.             logSwapC(count(), nextAct);
  27.     }

Каждый контур типа NeuroCircuit ассоциируется с некоторым числовым типом нейрона, и принимает строковое описание этого типа. Именно по этой информации происходит поиск символьного описания типа нейрона в большинстве случаев. Логично, что для создания нейрона этого типа можно также использовать объект «нейронный контур» – так не нужно заботиться о числовых типах.
имяКонтура.CreateNeuronMinimal()
«Минимальное» создание нейрона означает и напоминает, что не производится наполнение полей, специфических для данной ИНС.
Самые важные функции – это шаблонные функции, позволяющие выполнять операции над нейронами контура одной строкой:

  1. typedef bool (_neuron::*NeuronCondition)()const;
  2. typedef void (_neuron::*NeuronAction)();
  3. typedef void (*StaticNeuronAction)(neuron*);
  4. //для каждого нейрона данного контура, если выполняется условие allowCondition,
  5. //выполнить действие action
  6. template<NeuronCondition allowCondition, NeuronAction action>
  7.                 UINT64 forallNN(NeuroThread *thread);
  8. template<NeuronCondition allowCondition, StaticNeuronAction action>
  9.                 UINT64 forallNS(NeuroThread *thread);//S == Static action
  10. //для всех нейронов данного контура, если выполняется условие allowConditionForA,
  11. //получить по внутрикластерной виртуальной связи соответствующий нейрон контура other,
  12. //и для него вполнить действие actionForB
  13. template<NeuronCondition allowConditionForA, StaticNeuronAction actionForB, typename NeuroCircuit2>
  14.                 UINT64 VLinkNS(NeuroCircuit2 & other, NeuroThread *thread);
  15. // И еще несколько функций, в том числе – перегруженых
  16.  

У функций применяются суффиксы, описывающие типы шаблонных параметров. Например, S означает статическую функцию действия с нейроном (обычно – статическая функция соответствующей ИНС), а N – метод самого нейрона. Суффиксы введены, так как перегрузка шаблонных функций мне не удалась (а может, она и невозможна по стандарту С++ – не стал разбираться). Когда стоял выбор, передавать адреса функций для исполнения в качестве обычных или шаблонных параметров, я выбрал последнее, в надежде на то, что компилятору будет легче оптимизировать код. Правда, надежда не подтвердилась – в релиз-версии, вместо подстановки тел функций действий, компилятор, как показывал дизассемблер, создавал вызовы тех функций, которые были шаблонными параметрами. Но это пока не страшно. При необходимости, всегда можно будет перейти на макросы.
Также, почти каждая функция в классе _NeuroCircuit создает текстовое описание производимого действия, которое параметризируется именем контура. После создания описания, функция вызывает другую стандартную функцию, для облегчения отадки ИНС. Эта функция проверяет, не сделать ли паузу в исполнении. Так можно производить пошаговое исполнение ИНС без применения обычного отладчика среды разработки (типа Visual Studio). Небольшой шаг на пути к цели – сделать Нейронную Лабораторию интегрированной средой разработки ИНС. Во время паузы, текстовое описание шага выводится в строку состояния. Также, каждое такое описание заносится в список истории исполнения нейронных контуров, дополнительно параметризируясь количеством нейронов, которые приняли участие в исполнении. Для функций, принимающих условие разрешения для выполнения действия, число будет равно числу нейронов, для которых условие выполнилось. Вся эта информация доступна в окне «История нейроконтуров». Для хранения одинаковых строк история нейроконтуров использует пул строк.


Рис. 92-1 Окно истории срабатывания нейронных контуров. Видно переход от запоминания ко сну - не только по описаниям состояния, но и по смене последовательности срабатывания контуров.

«История нейроконтуров» напоминает электроэнцефалограмму. Если добавить визуализацию количества нейронов, которые были активны за каждый вызов функции нейроконтура, это была бы почти электроэнцефалограмма.
Пример того, как легко программировать с объектами нейроконтуров – функция стандартного ассоциативного спуска на признаки, и приведения сигналов назад «наверх», чтобы получить все похожие кластеры (эта функция используется во время различных фаз сна):

  1. void BrainB2::DownAndUp(NeuroThread*thread)
  2. {
  3.         nDown.SwapC(0);
  4.         nDown.forallNS< &neuron::isActive, &SendSignalsStandard>(thread);
  5.  
  6.         nIn.SwapC(0);
  7.         nIn.VLinkNN< &neuron::isActive, &neuron::activateNext>(nOut, thread);
  8.  
  9.         nOut.SwapC(0);
  10.         nOut.forallNS< &neuron::isActive, &SendSignalsStandard>(thread);
  11. }

Через объект «нейронный поток исполения» сейчас производится остановка исполнения ИНС для отладки в НЛ, а в будущем также будет происходить синхронизация различных потоков.

№91 Нечеткое распознавание и поиск в ИНС Б2

Понедельник, Апрель 20th, 2009

Близкая по теме заметка – «№42 Методы привнесения нечеткости в нисходящие и восходящие нейронные цепочки» ( http://neurocod.net/blog/2009/2008/08/№42-методы-привнесения-нечеткости-в-ни ).
Задача: добавить в распознающие цепочки возможность распознавания последовательности сигналов при следующих условиях.
1) Распознавание при активности только некоторых признаков в кластере
2) Распознавание при перепутанном порядке активации кластеров в цепочке
3) Распознавание при пропуске некоторых промежуточных необходимых кластеров на расстоянии до десятков итераций после активации первого кластера.

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

Зачем нужно настолько нечеткое распознавание, удовлетворяющее всем трем условиям? Нужно, например, при мышлении с неполной информацией, когда нужно домыслить, угадать контекст. Распознавание цепочек с перепутанным порядком активации признаков в первой стадии выделения закономрностей позволяет провести нахождение закономерности, которая будет проецировать один порядок активации на другой (см. «№36 Преобразование линейных запросов» ( http://neurocod.net/blog/2009/2008/08/№36-преобразование-линейных-запросов )), что можно использовать, например, при обработке речи.
С пропусками/разрывами можно работать путем распространения сигнала по той же цепочке памяти – сигнала, подпорогового для нормального режима распознавания. Но с перестановкой последовательности активации признаков это уже не выйдет. Нужно либо распространение в обратном направлении, либо что-то еще.
Пояснение к рисункам в этой заметке. Для простоты, не показаны признаки, распознаваемые цепочкой памяти. (Они по введенным стандартам должны изображаться ниже цепочки). Сама цепочка показана состоящей из кластеров, представленных одним квазинейроном каждый.
Введем еще один контур. Нейроны этого контура будут принимать сигналы с нейронов распознавания цепочки, причем без различия порядка. Классический гностический нейрон. Поэтому расположим нейроны этого контура выше цепочки памяти.


Рис. 91-1 Первая попытка реализации нечеткого распознавания

Рассмотрим пока первые четыре кластера цепочки памяти. Требование распознавания при активности только некоторых признаков в кластере решается тем, что нейроны распознавания кластера шлют сигналы на нейрон нечеткого распознавания при любой активации, большей нуля. В естественных НС за такое поведение кластера мог бы отвечать отдельный нейрон с низким порогом, либо на основе посылки низкочастотных сигналов обычными распознающими нейронами. Но в случае ИНС, легче просто добавить одну строку кода по изменению условия посылки сигнала. (Связка «Мозгокод+С++» будет описываться позже).
Требование распознавания при перепутанном порядке активации признаков выполняется очевидно.
Рассмотрим третье требование – «распознавание при пропуске некоторых промежуточных необходимых признаков». Для этого, активация на нейроне нечеткого распознавания, недостаточная до преодоления порога, должна угасать не сразу, а в течении количества итераций, достаточного для проявления запаздывающих признаков на следующих кластерах.
Такие нейроны нечеткого распознавания располагаются по всей цепочке. Проблема возникает (на рисунке обозначено знаком вопроса), если признаки активируются в соседних областях, обрабатываемыми соседними нейронами нечеткого распознавания. Прямолинейное решение этой проблемы – нагромоздить нейронов нечеткого распознавания так, как показано на рисунке 91-2.


Рис. 91-2 Прямолинейная попытка сделать условия нечеткого распознавания одинаковыми по всей длине цепочки памяти

Но при увеличении длинны распознавания, например, с 4 до 20 итераций, это приведет к чрезмерному расходу ресурсов – по 20 связей к нейронам нечеткого распознавания на почти каждый кластер. (Меньше, если длинны цепочки будет недостаточно). Конечно, для коротких гностических цепочек типа распознавания слов в буквенных ИНС это не очень критично. А вот для длинной цепочки памяти с запоминаниями за весь день – решение очень затратное.
Рассмотрим оптимизацию, которая заключается в введении еще одного контура.


Рис. 91-3 Оптимизация нечеткого распознавания – двухуровневое распознавание

Нейроны цепочки памяти шлют сигналы к нейронам контура нечеткого распознавания первого уровня (на рисунке 91-3 обозначены как SL0, от Search Line Level 0). Пусть М – длина участка, который обслуживается одним нейроном контура SL0. Эти участки не перекрываются. Длинна участка также будет равняться и максимальному количеству связей, которые приходят к каждому нейрону контура SL0. За счет отсутствия перекрытия достигается экономия необходимого количества нейронов SL0 и экономия количества связей к ним. Количество связей, ведущих к нейронам SL0, будет меньше M только для тех нейронов SL0, которые обслуживают конец такой цепочки памяти, которая содержит количество кластеров, не кратное числу M. Пока будем рассматривать только усредненный случай для длинных цепочек, не обращая внимания на обрывы в конце.
Нейроны SL0 в свою очередь соединены с нейронами контура SL1. На SL1 и осуществляется пересечение областей, за которые отвечают нейроны SL0. Максимальное количество нейронов SL0, обслуживаемое каждым нейроном SL1, назовем N. На рисунке показана ИНС с M=3, N=2. Максимально возможная длина интервала разрыва при еще успешном распознавании признаков на концах разрыва равна (M*N-2). Двойка отнимается, чтобы получить длину интервала именно разрыва, это первый и последний признаки. Если говорить не про длину разрыва, а про длину цепочки с признаками, содержащей разрыв, то будет как раз M*N. Расстояние Dmax=M*N будет получено для максимально благоприятной ситуации, когда признаки находятся в противоположных концах областей, обслуживаемых соседними SL0. Максимально неблагоприятная ситуация возникает, когда активные признаки появляются как раз вокруг промежуточной вставной области SL0. Тогда признаки не будут распознаны. Итого, величина максимального возможного интервала с признаками, содержащего внутри разрыв, составляет Dmax=M*N, а величина минимально гарантированного распознавания Dmin=M+1.


Рис. 91-4 Минимально гарантированная длина нечеткого распознавания при N=2

При увеличении M и при N=2, ИНС становится плохо детерминированной. Минимально гарантированная величина интервала распознавания будет отличаться от максимально возможной почти в 2 раза. В зависимости от того, как повезет, когда встретиться признак, ИНС будет или не будет распознавать признаки и выделять закономерности с длинной, большей Dmin. Чтобы повысить детерминированность и уменьшить влияние случайных факторов, можно увеличить N. При N>2, правильные формулы выглядят так: Dmin =(M*(N-1)+1), Dmax=M*N. При увеличении N с 2 до 3 и при увеличении M, отличие между Dmin и Dmax стремится к сокращению с 50% до 33%. В ИНС Б2 применяется N=3.


Рис. 91-5 Минимально гарантированная длина нечеткого распознавания при N>2

Потерянная запись

Понедельник, Апрель 20th, 2009

Запылилась в черновиках, только сейчас вспомнил: «Разговор с Юрием Бужаки» ( http://neurocod.net/blog/2009/2009/02/разговор-с-юрием-бужаки )

FACETS

Понедельник, Апрель 20th, 2009

Цитата из «Возвращение АВМ (АВМ – Аналоговая Вычислительная Машина)» ( http://ko-online.com.ua/node/42013 ):

Теперь наконец можно сказать, и о каких именно масштабах идет речь. Микросхемы, моделирующие нейронные сети, на самом деле не новинка и не экзотика. Но «size is matter», и одно дело – чип с десятком искусственных нейронов, и совсем другое – текущая разработка FACETS, аппаратный фрагмент нейросети, содержащей 200 тыс. (!) нейронов и 50 млн (!) синапсов-коммутаторов, позволяющих динамически изменять структуру сети. И это не фантастика – это техника сегодняшнего дня. Да, на фоне масштабов человеческого мозга эти цифры кажутся скромными (10–20 млрд против 200 тыс.), но… Скачок на четыре порядка всего за четыре года (от пары десятков нейронов до 200 тыс.) – очень впечатляющий показатель. И если результаты этого этапа проекта FACETS окажутся удовлетворительными, вполне возможно, что мы застанем появление совершенно иных машин. Биологический уровень сложности и электронное быстродействие не могут не привести к проявлению каких-то дополнительных, синергетических эффектов, о которых еще слишком рано говорить. Эти эффекты тем более возможны, если учесть порядки цифр – аналогово-цифровые нейронные сети FACETS «скорострельнее» своих биологических прототипов в сто тысяч, а классических сугубо цифровых искусственных нейронных сетей – в десятки миллионов раз.

На самом деле масштаб нейровычислителей современного поколения уже никак нельзя назвать игрушечным. Особенно если учесть факты, что современные теории строения мозга выделяют в его коре весьма специфические структуры, содержащие порядка сотен сильносвязанных между собой однотипных нейронов (так называемые модули коры), объединения сотен таких структур (гипермодули) и что удаленные на расстояние свыше долей миллиметра (от двух десятых до пяти десятых) нейроны практически не способны получать одни и те же возбуждающие сигналы. Иными словами, нынешний нейровычислитель проекта FACETS в каком-то смысле эквивалентен (не будем вдаваться в сложности понятия «эквивалентость») биологическому гипермодулю коры головного мозга. Это уже очень далеко от первых простейших программных моделей примитивных нейронов.

Можно проследить некоторые аналогии: так, в терминологии статьи, модули – это тутешние кластеры (или колонки), гипермодули – это цепочки памяти. Конечно, биологические цепочки памяти могут иметь очень круто отличающуюся архитектуру, от того, что будет описано в следующих сообщениях на этом сайте…

http://nauka21vek.ru/archives/3142 :

«На самом деле наш процессор воспроизводит структуру мозга условно, но благодаря физическим особенностям работы он значительно более быстр и более масштабируем. Процессор способен работать в 100 000 раз быстрее мозга, мы можем симулировать суточную мозговую активность за одну секунду», — говорит исследователь.

Прошло всего 6 минут – а система в мыслях прожила год )). Десять лет в час.

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

Блоги и боты мирового господства

Понедельник, Апрель 20th, 2009

Посмотрите на картинку ниже. Это – карта посещаемости за первые часы после публикации блога. (Текущая карта посещаемости – http://neurocod.net/blog/карта-посетителей/ )


Если смотреть в статистику запросов (я использую плагин StatPress), то на текущий момент, почти каждого посетителя из Евразии я идентифицировал по никам – это люди. Кроме Москвы – там приходил и Яндекс. Все отметки, что вы видите на карте США – это боты. Нужно учитывать, что по логам, почти все они начали приходить сразу после развертывания wordpress, до публикации ссылки на этот блог в ЖЖ – wordpress сам регистрируется где-то. Вот значения приходящих от ботов заголовков user-agent:

  • YandexBlog/0.99.101 (compatible; DOS3.30; Mozilla/5.0; B; robot) 0 readers
  • Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
  • Snapbot/1.0 (Snap Shots, +http://www.snap.com)
  • BlogSearch/2 +http://www.icerocket.com/
  • HTMLParser/1.6
  • SurveyBot/2.3 (Whois Source)
  • Rome Client (http://tinyurl.com/64t5n) Ver: 0.9
  • TechrigyBot – www.techrigy.com support@techrigy.com
  • PEAR HTTP_Request class ( http://pear.php.net/ )
  • BlogShares.com Spiders (Zipping Along V1.54)
  • Jakarta Commons-HttpClient/3.0
  • BlogPulseLive (support@blogpulse.com)
  • Java/1.6.0_11
  • Microsoft-WebDAV-MiniRedir/5.1.2600
  • и еще куча без идентификаторов.

Молодцы! Хорошо работают! Сразу видно, кто хочет контролировать всю Землю, но пока еще не очень получается.
(Конечно, контроль за блогосферой во многом непрямой – см. мои комментарии на счет США и «Большой Волны» к сообщению «№55 После попадания технологии ИИ в цепкие руки» ( http://neurocod.net/blog/2009/2008/12/№55-после-попадания-технологии-ии-в-цеп )). А вот еще цитата с «Под «облаками»» ( http://ko-online.com.ua/node/41850 )

Инфраструктурные изменения

В недалеком будущем ЦОД из десятков тысяч серверов придут на смену центры из миллионов устройств. Наиболее радикальное отличие современных ЦОД от вычислительных центров прошлых лет состоит в использовании транспортировочных контейнеров.
Быстрыми темпами происходит наращивание игроками рынка сloud computing своих вычислительных ресурсов. Эти действия ведут к тому, что главными потребителями серверов выступают интернет-гиганты. Уже сейчас, по сведениям главы подразделения Microsoft Research Рика Рашида (Rick Rashid), около 20% серверов приобретается группой компаний, среди которых Microsoft, Google, Yahoo и Amazon.com. Любопытно, что указанные предприятия облюбовали тихую сельскую местность поблизости от р. Колумбия на северо-западе США – здесь у них сосредоточены наибольшие в мире вычислительные мощности. Причиной выбора данного участка стали низкие цены на землю, развитая оптоволоконная инфраструктура, обилие водных ресурсов и, что самое главное, сравнительно дешевая электроэнергия. Например, ЦОД корпорации Microsoft в г. Куинси (штат Вашингтон) занимает 43,6 тыс. м², т. е. площадь, равную десяти полям для американского футбола. Количество серверов не называется, зато известно, что здесь применяются охладительные трубы протяженностью 4,8 км, 965 км электропроводки, 92,9 тыс. м² стен из сухой каменной кладки и 1,5 т батарей для резервного питания. Сооружение потребляет 48 МВт – такой мощности достаточно для обеспечения 40 тыс. домохозяйств. Этот ЦОД используется в том числе и для нужд начальной версии Windows Azure, впрочем, Microsoft уже приступила к строительству дополнительных мощностей в Чикаго, Сан-Антонио и Дублине. Каждый из проектов оценивается приблизительно в 500 млн долл. Есть данные, что компания рассматривает возможность размещения одной из площадок на территории Сибири.

Пасхальное ))

Понедельник, Апрель 20th, 2009

Про Пасху чуть не забыл!
(Я понимаю, что классический сатанизм (не по Ла-Вею) – производная от христианства (не путать с нашим родным Православием), еще одна сионистская зараза на экспорт (христианство – ранняя версия оранжевых революций). Но сатанисты мне симпатичны по духу. А что это зараза – ну так я итак уже эмоционально-, ментально- и событийно зараженный по самое небалуй. Так что вполне осознанно наслаждаюсь и проникаюсь, хахаха! )) ).

Deicide – Fuck You God
embedded by Embedded Video

Download Video

I forsee at my end to be banished,
By your god for my life and branding
Never around, in the greatness of sorrow,
Screw your god and his UN writ moral.
Stifle god, and the idols of hatred,
Out of my heart, I have always been free,
One with no need all alone and satanic.
Wretched and Vile, fuck your god, de face him.
Who could believe in a lord that’s demanding?
Hard to believe when we die we vanish,
In his deny and for all his creation,
Fuck your god and his righteous hatred.
You and your son, you are nothing but absence,
Something not there that controls this planet,
Only deceit do I see in your hallow
If you believe you will dwell in failure.
Fuck Your God, Holy mother for the whore she is,
Fuck your God, bible thumper preaching threats from hymn,
Fuck your god, his revival and the holy Ghost,
Fuck your god; only tell us what we need to know,
Fuck your god, pointing fingers and then do as me,
Fuck your god, you are nothing and you’ll never be,
Fuck your god; it is Satan who in trusts my soul,
Fuck your god, where the Christians are I will not go.
Fuck your god!!!!!

Fuck his, commandments, and prophet’s left stranded to die,
Not in my heart or my soul as I go through this life,
Good book of bullshit lay dirty with vengeance and lies,
Go fuck your Jesus and get- the- fuck out my sight.

Unity over flowing with anger,
It is our time to remove the savior,
Christians are weak and the bible is beaten,
Homage to god, in this world not needed.
Fuck your god an his annals of plager,
Falling apart and exposing the light,
I will not live by the words of their Jesus,
He did not die to protect or save me.
There is just blood in his book of deceiving,
Riddles and crap to his divine healing,
Fail is your faith and you blame it on Satan,
Christians can’t see that their preys are wasted.
Not a slave to religion unrendered,
Falsified god and his Christ redempters.
Never to be in the presence of grandeur,
I am for me and forever after.

Fuck Your God, Holy mother for the whore she is,
Fuck your God, bible thumper preaching threats from hymn,
Fuck your god, his revival and the holy Ghost,
Fuck your god; only tell us what we need to know,
Fuck your god, pointing fingers and then do as me,
Fuck your god, you are nothing and you’ll never be,
Fuck your god; it is Satan who in trusts my soul,
Fuck your god, where the Christians are I will not go.
Fuck your god!!!!! Fuck you!!!!
(далее…)

Формат гиперссылок внутри блога

Воскресенье, Апрель 19th, 2009

Используется сокращение вида [neurolnk title=»необязательное описание» href=»url абсолютный или относительный»]. Преимущества перед обычными гиперссылками:

  • в исходном тексте можно сохранять относительные пути, что поможет при переносе блога на другой домен. Относительный путь остается и в url гиперссылки, так сайт будет нормально работать и при оффлайновом просмотре
  • вместе с описанием гиперссылки, в результирующий вывод подается и ее обработанный абсолютный путь, с декодированным (без процентов) адресом; адрес легче читать, кроме того, это полезно при утрате форматирования (например, при печати на бумагу или посылке по icq)
  • в коде url прописывается только один раз, в то время как в результирующем html появляется два раза, также унифицируется формат – к описанию добавляются кавычки, а гиперссылка с текстом в виде url заключается в скобки
  • Описание (title) гиперссылки внутри разметки позволяет восстановить смысл и ее адрес (при переносе – новый адрес) при невозможности применения форматирования wordpress

Исходный текст плагина:

  1. <?php
  2. /**
  3.  * @package neurocod
  4.  * @author neurocod
  5.  * @version 0.1
  6.  */
  7. /*
  8. Plugin Name: neuroLnk
  9. Plugin URI: http://neurocod.net/blog/
  10. Description: Inserts formatted localized link via shortcode &#91;neurolnk title="optional title" href="url absolute or relative"&#93;
  11. Author: neurocod
  12. Version: 0.1
  13. Author URI: http://neurocod.net/blog/
  14. */
  15.  
  16. //this function is from http://www.web-max.ca/PHP/misc_24.php
  17. function InternetCombineUrl($absolute, $relative) {
  18.         $p = parse_url($relative);
  19.         if($p["scheme"])return $relative;
  20.        
  21.         extract(parse_url($absolute));
  22.        
  23.         $path = dirname($path);
  24.  
  25.         if($relative{0} == ‘/’) {
  26.                 $cparts = array_filter(explode("/", $relative));
  27.         }
  28.         else {
  29.                 $aparts = array_filter(explode("/", $path));
  30.                 $rparts = array_filter(explode("/", $relative));
  31.                 $cparts = array_merge($aparts, $rparts);
  32.                 foreach($cparts as $i => $part) {
  33.                         if($part == ‘.’) {
  34.                                 $cparts[$i] = null;
  35.                         }
  36.                         if($part == ‘..’) {
  37.                                 $cparts[$i1] = null;
  38.                                 $cparts[$i] = null;
  39.                         }
  40.                 }
  41.                 $cparts = array_filter($cparts);
  42.         }
  43.         $path = implode("/", $cparts);
  44.         $url = "";
  45.         if($scheme) {
  46.                 $url = "$scheme://";
  47.         }
  48.         if($user) {
  49.                 $url .= "$user";
  50.                 if($pass) {
  51.                         $url .= ":$pass";
  52.                 }
  53.                 $url .= "@";
  54.         }
  55.         if($host) {
  56.                 $url .= "$host/";
  57.         }
  58.         $url .= $path;
  59.         return $url;
  60. }
  61.  
  62. function neurolnk_shortcode_func($atts) {
  63.         extract(shortcode_atts(array(
  64.                 ‘title’ => »,
  65.                 ‘href’ => ‘http://’,
  66.         ), $atts));
  67.  
  68.         $title = $atts["title"];
  69.         $href = $atts["href"];
  70.         $curUrl = "http://".$_SERVER[‘SERVER_NAME’].$_SERVER[‘REQUEST_URI’];
  71.         $hrefTitle = InternetCombineUrl($curUrl, $href);
  72.         if(""!=$title){
  73.                 $str = "&#171;$title&#187; ( ";
  74.         }
  75.         $str .= "<a href=\"$href\" title=\"$title\" rel=\"bookmark\">".urldecode($hrefTitle)."</a>";
  76.         if(""!=$title){
  77.                 $str .= " )";
  78.         }
  79.         return $str;
  80. }
  81. add_shortcode(‘neurolnk’, ‘neurolnk_shortcode_func’);
  82. ?>

Размещение картинок в этом блоге

Вторник, Апрель 14th, 2009

Размещение картинок в этом блоге предпочтительно производить при помощи shortcode «neuroimg». Код соответствующего плагина для wordpress представлен ниже. Изображения, размещенные при помощи этого сокращения, не будут вылазить за пределы экрана, и будут находиться внутри ссылки на само изображение для полноэкранного просмотра.

  1. <?php
  2. /**
  3.  * @package neurocod
  4.  * @author neurocod
  5.  * @version 0.1
  6.  */
  7. /*
  8. Plugin Name: neuroImg
  9. Plugin URI: http://neurocod.net/#
  10. Description: Adds shortcode &#91;neuroimg src="image source" desc="optional description"&#93; and converts it into image with style "max-width:100%", placed into hyperlink to itself, and adds description
  11. Author: neurocod
  12. Version: 0.1
  13. Author URI: http://neurocod.net/me
  14. */
  15. function neuroimg_shortcode_func($atts) {
  16.         extract(shortcode_atts(array(
  17.                 ‘src’ => »,
  18.                 ‘desc’ => »,
  19.         ), $atts));
  20.  
  21.         $src = $atts["src"];
  22.         $desc = $atts["desc"];
  23.         //if(!isset($desc))
  24.         //      $desc = $src;
  25.         $ret = <<< EOR
  26. <p style="text-align:center"><a href="$src"><img style="max-width:100%" title="$desc" src="$src"/></a><br/><i>$desc</i></p>
  27. EOR;
  28.         return $ret;
  29. }
  30. add_shortcode(‘neuroimg’, ‘neuroimg_shortcode_func’);
  31. ?>
  32.