17 июня 2007 г.

Школьные мифы о нервной системе

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


Нервная ткань не восстанавливается. Конечно факт, что нервные клетки не делятся. Но на самом деле нервая ткань чрезвычайно пластична. Ее развитие происходит на протяжении всей жизни человека. Каждый нейрон растет при этом создавая новые соединения, часть дендритов наоборот отсоединяется от созданных ранее синаптических соединений. Процесс роста нервной клетки чрезвычайно похож на процесс развития тканей в эмбрионе (об этом можно детально почитать у Прибрама).


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


Воспоминания сохраняются локально в виде "следов памяти". Данное утверждение перекликается с предыдущим, хотя у локальных энграмм (локальных следов памяти) до сих пор много приверженцев. Еще в 60-х годах прошлого века было проведено множество экспериментов, которые показали что в процессе сохранения памяти задействовано: рост нейронов, выработка специфических макромолекул, видоизменение РНК, изменение олигодендроглии (ткани окружающие нервную ткань). Очевидно что память очень сложный процесс и сводить его к изменениям потенциалов в височных долях мозга никак нельзя (а именно здесь ищут локальные энграммы). Действительно мозг изменяется при получении новой информации, но это происходит со всем мозгом и всегда.


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


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


Дальше...

12 июня 2007 г.

WTL. Первые шаги.

WTL (Windows Template Library) - тонкая обертка для управления визуальными контролами в виде отдельных классов, а также набор дополнительных классов тем или иным способом связанных с GUI. Данная библиотека является надстройкой над ATL. Удобна в использовании для пользователей MFC, так как имеет сходный интерфейс взаимодействия, но намного эффективней в плане быстройдействия. Также рекомендуется тем, кто только собирается осваивать Visual C++ (не .NET естественно или как это по ихнему - unmanaged) и желает получить быстродействующее и компактное windows-приложение.


Немного истории. Все началось с ATL (Active Template Library). Несмотря на название, ничего "активного" в этой библиотеке не было. Просто мода была такая все называть Active (период увлечения ActiveX), так же как в 1999 было модна приставка 2000 и так же как сейчас модна приставка .NET. Так вот, ATL вызвала ажиотаж среди разработчиков. Но вскоре они охладели, так как поняли, что обертки для всех контролов приходиться писать самим. В качестве набора таких оберток и был создан WTL. Но, к сожалению, Microsoft не очень жаловала этот проект, даже документация написана не была. Далее WTL развивался силами энтузиастов (вероятно действующими и прошлыми работниками Microsoft, а может и не только). После выпуска WTL 7.1 библиотека становиться очень популярной, каковой и остается по сей час.


Как установить. Для начала скачайте саму библиотеки с сайта Microsoft или с wtl.sourceforge.net. Далее распакуйте содержимое архиве в любой каталог по вашему усмотрению. Там находим каталог AppWiz и запускаем один из файлов setup70.js, setup71.js или setup80.js, в зависимости от того какая студия у вас установлена. Кстати для корректного использования WTL необходима ATL, в связи с чем использование WTL с ExpressEdition не возможно.
Еще рекомендую установить WTL Helper. Скачать можно здесь. По этой же ссылке можно почитать об том инструменте можно почитать детальней. Если в двух словах, то это надстройка для студии позволяющая быстрее работать с message handlers.
Далее вам лишь надо будет добавлять в include path путь к WTL для своих проектов.


Насколько он эффективен? Для того чтобы не быть голословным просто приведу пример. Вот приложение созданное при помощи визарда:

А теперь внимание. Занимает это приложение - 77 824 байт! Меня, после использования C++Builder, это сильно впечатлило :)

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


Недостатки. Было бы несправедливо не упомянуть о недостатках WTL. Главным недостатком является отсутствии документации - приходиться разбираться в коде. Из этого вытекает много других недостатков (частое неиспользование имеющихся возможностей, неэффективное использование и т.д.). Второй важный недостаток является спорным, так как многие считают это преимуществом, но я отнесу это к недостаткам - небольшая коллекция базовых классов. Хотя в большинстве случаев имеющихся классов более чем достаточно, а если нет, то всегда есть интернет. Большие запасы готовых классов на основе WTL можно найти на codeproject.com.


Продолжение будет (если сообщество заинтересуется темой). Далее можно рассмотреть базовые возможности WTL, специфику переопределения обработчиков в WTL, "трюки" в использовании или еще что-нибудь.

Дальше...

8 июня 2007 г.

Специфика первичной обработки информации человеком

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


Мне всегда казалось, что для человека важнее изменения внешней среды чем текущее состояние, что мы обрабатываем изменения, а не конкретные значения.
Самый элементарный пример нам знаком с детства. Положите себе на руку небольшой предмет (скажем, монетку) - вы сразу ощутите его на руке. А теперь посидите так продолжительное время. Теперь предмет уже и не мешает. А если снять? Моментально ощущается изменение.
Еще один пример. Мешает ли вам звук вашего системника (гудение, жужжание или рев - это уже кому как повезло)? Большинство ответит, что не мешает. А вот когда вы выключаете компьютер вы моментально ощущаете "звенящую тишину". Кстати, само словосочетание "звенящая тишина" означает лишь исчезновение звука, а не постоянное отсутствие.
О таком свойстве звука есть замечательный факт. В Нью-Йорке на третьей авеню проходила надземная железная дорога, которая естественно была не тихим явлением. Потом эту дорогу снесли. после этого люди жившие в домах вдоль железной дороги просыпались и звонили в полицию, чтобы сообщить что происходит нечто странное. Что именно странного происходит они объяснить не могли. Самое любопытное, что звонки совершались именно в тот момент когда мимо должен был проехать поезд по расписанию.
Таких примеров уйма и все с ними сталкивались и называется это адаптацией. Но остается главный сложный момент - зрение. Ведь когда мы долго смотрим на неподвижный предмет у нас не темнеет в глазах :) Мы продолжаем видеть тот же предмет, хотя картинка не изменяется.
Оказывается причина в постоянном движении глаз. Глаза колеблются даже тогда, когда мы фиксируем точку. Именно это движение препятствует тому, что определенный сенсор будет получать одинаковую информацию. Лучшей иллюстрацией этого факта является опыт описанный Прибрамом.
На белой части глазного яблока, не обладающей чувствительностью, укрепляют зеркало. Изображение проецируется на зеркало, отражается через призму на гладкую поверхность экрана, на которую смотрит наблюдатель. Призма корректирует отклонения рассматриваемого объекта , соответствующие отклонениям глазного яблока. Благодаря этому, изображение всегда падает на одно и то же место сетчатки и образ стабилизируется.
Схема эксперимента
Самое поразительное, что глаз настолько адаптируется что изображение всего через несколько секунд полностью пропадает.


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

Дальше...

5 июня 2007 г.

Возможно ли создание искусственного интеллекта?

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


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


Далее приведу различные подходы к возможности создания искусственного интеллекта, попутно комментируя в таком стиле.




  1. Механистический (оптимистический) или викторианский. Любая система может быть создана, различаются лишь степени сложности систем. Я бы так категорически не утверждал. Хоть мне всегда нравился оптимизм той эпохи.

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

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

  4. Статистический. Если человечество будет очень долго биться над этой проблемой даже случайно перебирая варианты, то рано или поздно найдет решение. Уж слишком долго можно "трясти мешочек с костями" :)

  5. Метод черного ящика. Всегда можно набросать элементов имитирующих различные функции мозга, а потом эволюционным способом устроить естественный отбор. В результате длительных (что важно управляемых, а не статистических) утрясаний получим необходимое. А что внутри ящика никого не волнует. По этому пути пошли нейронные сети. У этого подхода есть позитивные стороны: есть элементы основанные на реальных элементах действующего разума, также можно получит результат до полного понимания мозга. Но, к сожалению, оказывается что действуя подобным образом никак нельзя точно повторить оригинал (мы не знаем всех механизмов взаимодействия элементов) и уж тем более нельзя создать разум отличный от природного.

  6. Биологический/химический. Существует теоретическая возможность создания точной копии (скажем поатомной копии) человека. Выходит что вместе с этим мы создадим и интеллект. Боюсь что такая копия мыслить не будет, впрочем как и жить тоже. Наверняка волновые процессы в организме человека не менее важны, чем те что описываются классической биологией.

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


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

Дальше...

4 июня 2007 г.

C++ и GUI

Очень часто, сравнивая языки программирования в целях последующего выбора, программисты сравнивают не столько возможности самого языка сколько возможности библиотек и утилит. Часто выбор падает не на C++ именно из-за GUI. А зря :)
Тем кто в процессе выбора и не знает какие существую GUI-шные библиотеки для C++ и посвящается этот пост. Оговорю лишь, что этот список ограничивается лишь теми библиотеками с которыми я стыкался лично.

VCL (visual component library). Самая противоречивая библиотека. С одной стороны она была революционной, но с другой стороны она написана на Object Pascal и компилируется лишь при помощи Borland C++Builder . Сейчас добавились еще минусы: не поддерживает windows стилей, слегка устаревшая концепция. Неоспоримым же плюсом этой библиотеки есть возможность Delphi-разработчиков совершенно безболезненно переходить на C++.
Вспомнил я об этой библиотеке по той причине, что ходят слухи об ее полной переработке в новом продукте Turbo C++ 2006. В этом продукте заявляется поддержка нативного Windows GUI, чего раньше и близко не было. Хотя пока что эту информацию проверить у меня возможности не было.

MFC (microsoft foundation class library). Это тоже "монстр" из прошлого. Очень многофункциональная и очень медленная и очень неудобная библиотека, как мне кажется. Вообщем-то, в лучших традициях microsoft :). Тем не менее, до сих пор часто используемая. Если вы уже к ней привыкли, то мое описание вам ни к чему, а если вы ее еще не использовали, то лучше обратить свой взор на другие библиотеки.

WTL (windows template library). Эта библиотека была заброшена microsoft, но подхвачена активистами. И именно это спасло библиотеку от чрезмерностей. Вышла эта библиотека необычайно легкой и удобной. По своей сути, это объектно-ориентированная прослойка над Windows API в вопросах касающихся GUI. Конечно же тут у вас не будет никаких возможностей потягать новый компонент по форме. Но и чрезмерных сложностей не возникает если не боитесь писать код руками, хотя в противном случае C++ не для вас.
Что-то я отвлекся от описания самой библиотеки. Думаю в ее честь стоит сделать серию отдельных постов.

wxWidgets. Эта библиотека просто мечта разработчика кросс-платформенных приложений. На самом деле кросс-платформенная библиотека, которая использует нативные вызовы операционной системы (это вам не корявый swing). Есть даже утилита для визуального редактирования окон. Конечно же это не панацея: местами встречаются недоработки; некоторых контролов не хватает, например выбор даты. Но радует тот факт, что библиотека очень бурно развивается. Почитать, посмотреть и скачать можно здесь: http://www.wxwidgets.org


QT. Лучший на данный момент пакет разработки кросс-платформенного GUI под С++. Подчеркиваю, что это не просто библиотека, а целый пакет, который включает собственно библиотеку и широкий набор инструментов. Но к сожалению, и стоит это удовольствие немало - до $6600. Для тех кому цена не проблема, это лучший выбор. Сайт разработчиков: http://trolltech.com
Дальше...

1 июня 2007 г.

Знакомство

Меня зовут Виталий Бондарь. И в этом блоге я планирую писать на профессиональные темы. Т.е. на темы полезные в первую очередь программистам.


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


Приятного чтения.

Дальше...