Читать книгу Активные данные. Философское программирование - Сергей Федорович Толкачев - Страница 4

НЕ ДОГМЫ
От слов к делу

Оглавление

В самом начале была Буква,

затем появилось Слово,

и уже потом Дело.


Формальные грамматики

Мы живем в мире машин, которые постоянно что-то делают: перевозят, разогревают, фрезеруют – или, если сформулировать более точно, выполняют определенные действия, которые можно измерить и описать в физических терминах: работа, мощность, КПД, энергия и пр. Здесь разносторонний программист обязательно должен добавить: «Класс машин, помимо энергетических, должен включать подкласс информационных машин, которые тоже умеют кое-что делать». Эх, как было бы удобно всё формализовать в виде классов, методов и отношений, если бы объектно-ориентированный подход приняли в качестве основы для рассуждений все остальные непрограммисты! Мечты…


Из повседневного опыта известно, что слова могут быть декларативными или императивными, и они могут определять или инициировать действия. Например, набор слов: «Чтобы разогреть воду, включи плиту» будет понятен любому современному человеку, и даже компьютеру, хотя несколько столетий назад, эта фраза вызвала бы недоумение – ведь в то время для того, чтобы разогреть воду, нужно было разжечь огонь. Естественно, что один и тот же результат может быть получен в итоге различных последовательностей действий. А слова, как виртуальный мостик, связывают исполнительные механизмы, способные к конкретным действиям, с одной стороны, с процедурами или знаниями, задающими эти последовательности, с другой. Но и суть программирования заключается в формулировании чего бы то ни было – словами! Будь то математическая формула или экономическая модель, программист обязан передать их описание компьютеру при помощи комбинации слов. Желательно только не забывать при этом, о чем на основании своего опыта предупреждают известные мастера слов – математики: «Слова – орудия опасные» (Герман Вейль).


Мы употребляем подобные слова повсеместно и никаких сомнений не возникает, пока мы не зададимся вопросом, а что, собственно, есть действие, и чем знание отличается от данных и информации? Рассуждая над смыслом слов, нужно быть готовым к тому, что, как бы глубоко и формально мы не старались уточнить их определения, всё равно, согласно К. Гёделю и В. Гейзенбергу, они будут недостаточно точными, неполными или противоречивыми. Общепринятый подход к получению более «точных определений» основан на использовании более строгих математических формализаций. Мы же, напротив, будем рассчитывать на неформальное и интуитивное понимание, основанное на «глубоком многослойном обучении». Сравнительно недавно появилась новая теория – «Intelligent Learning» и один из её авторов, Владимир Вапник, высказал предположение, что если фактические знания передаются в сочетании с ассоциативно связанными «посторонними» идеями, то обучение происходит более эффективно, модификация знаний о предметной области не разрушает модель, а адаптация к новому происходит быстрее и легче.


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


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


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


А «Может ли машина мыслить?» – с этого вопроса начинается, одна из самых популярных в истории вычислительной техники, статья А. Тьюринга «Вычислительные машины и разум». Этот вопрос вызвал бесконечное количество дискуссий и безусловно до сих пор, он является одним из самых интересных теоретических вызовов для многих программистов, и не только. Но если сформулировать его несколько иначе – «Как машина может помочь человеку мыслить?», то из области сложных формальных проблем, с которыми столкнулся Тьюринг и его последователи, мы переходим к инженерным системам и техническим определениям, где результат должен быть конкретен и может быть измерен понятным способом, например, как КПД физической машины, заменяющей ручной труд человека.


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


Знаменитый вопрос Тьюринга можно рассматривать как продолжение его другой, не менее знаменитой, концепции универсальной вычислительной машины, которую он предложил в 1936 году. Для математиков машина Тьюринга, это несомненно прорыв, поскольку, согласно А. Черчу, Тьюринг – первый, кто ввел физическое действие в математическое понятие вычисления. В математике, с момента её возникновения, существует разрыв между «строго формальной» абстрактной теорией, и интерпретатором этой теории, которым всегда выступает другой математик. И каким бы строгим не было доказательство, в конце концов, проверяет его человек. У математиков нет компилятора, который является обыденным инструментом для программистов, а Тьюринг, если уж совсем упрощенно, предложил и обосновал возможность такого математического компилятора, по крайней мере, для вычислительных задач. Впрочем, при всей важности машины Тьюринга для фундаментальных исследований, программируют на ней лишь редкие математики и студенты курса «Теоретическое программирование», и вряд ли на всей Земле можно найти программиста, который использует её для решения своих практических задач.


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


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


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


Теория управления физическими машинами традиционно относилась к разделам математики и механики, вплоть до появления в 1948 году книги Н. Винера «Кибернетика, или управление и связь в животном и машине», которая внесла некоторый сумбур в эту область знаний. Новая наука предполагает, что существуют общие законы управления, которые можно описать в виде формальных математических уравнений, позволяющих рассчитать значения параметров воздействия на механические, биологические, социальные или экономические объекты, для достижения определённых целей. Так же, как и классическая механика Ньютона, которая решает множество задач известного типа, так и кибернетика с успехом применяется в широком спектре разнообразных систем. Но всякая «правильная» теория должна иметь область ограничения, и при достижении определенного уровня сложности, нужны новые теории и новые методы решения, и как никому другому, это хорошо известно всем прикладным программистам.


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


«Ученые изучают то, что уже есть, инженеры создают то, чего никогда не было». В этой цитате, авторство которой Интернет приписывает А. Эйнштейну, очень доходчиво показано различие между теоретическими исследованиями ученых и практической деятельностью инженеров. Ученым требуется время для наблюдений и размышлений. Научная деятельность, со времен Аристотеля – это процесс получения знаний, состоящий из определенной последовательности шагов. С момента появления гипотезы, её проверки и публикации, до подтверждения теории научным сообществом, может пройти много времени, однако от этого зависит и качество науки и, соответственно, образования. В классических науках, времени всегда хватало – история механики насчитывает более двух тысяч лет, пятьсот лет развивается теория электричества, а вот в программировании глубокие изменения происходят в такие короткие промежутки, что наука просто не успевает за темпами развития компьютерных технологий. Наверное, поэтому и возник разрыв между теоретическими исследованиями в области программирования и полноценным профессиональным обучением, позволяющим инженерам рационально применять научные результаты в практике.


Современное программирование появилось в середине 50-х годов, как система из трех взаимодополняющих элементов – программист, программа и компьютер. Компьютеры тогда были, пусть и внушительных размеров, но всё же понятные вычислительные машины с известной логикой и состояниями. Практически все программисты имели либо математическое, либо специальное инженерное образование. Системные программисты разрабатывали операционные системы, компиляторы и специальные утилиты для ЭВМ, а программисты-математики создавали прикладные программы, которые представляли собой реализации различных алгоритмов решения численных задач. Такая модель программирования напоминала геоцентрическую систему Птолемея и многие надеялись, что рано или поздно, будет создана универсальная теория языков и верификации программ, что сделает их похожими на «вечные» математические конструкции.

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


Программа = Алгоритм + Структуры Данных


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


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


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


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


В 1968 году вышел первый том монографии Д. Кнута «Искусство программирования». В то время, количество программистов в мире исчислялось десятками тысяч, а профессионалом мог считаться лишь тот, кто сумел бы решить большинство из приведенных в этой книге упражнений. На обучение этому у среднего студента уходило несколько лет, и трудно было представить тогда программиста без специального инженерного или математического образования. В 2020 году программированием занималось уже более двадцати миллионов человек, и эта профессия превратилась в одну из самых массовых и доступных. Многие из современных программистов ничего не слышали о книге Д. Кнута, что, впрочем, не мешает им создавать полезные прикладные решения. Изменилась природа приложений, и соответственно появились новые технологии и инструменты. Если первоначально программирование было предназначено для автоматизации работы вычислительных машин и реализации алгоритмов специально подготовленными профессионалами, то сегодня, это в первую очередь инструмент для накопления и передачи знаний, а основы программирования и информатики включены школьную программу для начальных классов.


За эти годы в мире информатики было решено множество проблем. Но чем шире горизонт – тем больше открывается неизвестного, и вместе с этим появляются новые задачи, среди которых, в первую очередь нужно выделить обработку знаний. До сих пор, основным объектом программирования являлись данные. Знания – это значительно более сложная система, в которой данные соединяются с процедурами, а обмен знаниями, это контекстно-зависимый процесс. В процессе обмена могут участвовать группы, где каждый участник имеет своё уникальное состояние.


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


Один из концептуальных способов описания поведения и построения моделей самых разнообразных сложных систем, носит название «Метод чёрного ящика». В классическом чёрном ящике важно только то, что входит и выходит. Именно это мы и будем рассматривать как данные. Входные и выходные данные – это поток сигналов, который из всего огромного разнообразия сигналов внешнего мира, с одной стороны выделяет и воспринимает, а с другой, генерирует и возвращает обратно, конкретная система. Если же мы приоткроем чёрный ящик и заглянем внутрь, то у нас появляются некоторые знания, с помощью которых можно определить, какой компонент воспринимает сигналы на входе, а какой отвечает за их генерацию на выходе, в теперь уже сером ящике. И наконец у программистов, вход и выход связаны программой, где каждый шаг понятен и определен. При таком подходе у нас появляются количественные характеристики входных и выходных компонент, такие как пропускная способность, формат сигнала, объемы памяти и др. Только не нужно забывать, что декомпозируя ящик, можно этот же подход применить на любом уровне и для любого функционального блока внутри. Так, например, минимальным компонентом в компьютере можно считать ячейку памяти, а в биологической системе – отдельную клетку, хотя всегда можно продолжить декомпозицию, как клетки, так и ячейки памяти.


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


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


Биохимики – люди в меру циничные, поскольку знают, что человеческие чувства – это производные химических процессов, которые в норме инициируются нервной системой. Для того, чтобы то или иное чувство возникло, нужно заставить эту систему работать, и хотя человек может и обмануть самого себя, испытав иллюзию чувств при помощи искусственных наркотических субстанций, но ничего нового при этом у него не возникнет. «Получается, что когда мы узнаём нечто, у нас возникает биохимическое Чувство Нового? И пока наш мозг способен выделять нетрины, мы способны удивляться и учиться?» – спросит романтичный программист. Вполне возможно, что чувство нового, это одно из основополагающих и мотивирующих в индивидуальном развитии думающего существа. И живое существо активно живет и развивается лишь до тех пор, пока его мозг способен воспринимать и устанавливать новые связи между нейронами. А в понимании того, как и почему нетрины притягивают аксоны, и лежит ключ к созданию систем по обработке знаний.


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


клетка → системы клеток → нейроны → головной мозг


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


компьютер → интернет → искусственный интеллект →???


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


Точно также и компьютеры были созданы для того, чтобы строго исполнять последовательности инструкций. Идеи и цели, которые находились в голове у программиста при создании программы, не доступны центральному процессору, который должен получить команду и выполнить ее, в соответствии с правилами, которые заложил в него конструктор, и которые ожидает от него программист. Многие поколения классических компьютеров были построены на основе принципов, заложенных в архитектуре фон Неймана. В процессе работы над ней, фон Нейман соединил доступные для него знания физиологии нервной деятельности, с математическими формализациями и инженерными решениями. Структура его вычислительной машины состоит из трех блоков: вход, обработка и выход, по аналогии с тремя типами нейронов: сенсорные, ассоциативные и моторные. Однако если сравнить современные модели нейрона и рибосомы, то окажется, что его архитектура значительно ближе к рибосоме чем к нейрону!


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


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


Первое поколение искусственных нейронных моделей, основанное на работе МакКалока и Питтса «A logical calculus of the ideas immanent in nervous activity», было построено исходя из предположения, что нервная активность биологических систем подчиняется закону – «всё или ничего», и как следствие этого, «…нервную деятельность, нейронные события и отношения между ними можно рассматривать с помощью логики высказываний». Искусственный нейрон, построенный по этой схеме, содержит два основных блока – сумматор и функциональный преобразователь, а сама сеть, состоящая из таких нейронов, предполагается неизменной во времени.


Ограничения архитектуры фон Неймана стали заметны, практически сразу же после появления построенных на её основе промышленных версий компьютеров и языков программирования. Джон Бэкус, был один из первых, кто проанализировав узкие места машин Тьюринга и фон Неймана, предложил принципиально новую модель – функциональное программирование, или, если применить более современную терминологию – распределенную систему функциональных объектов с динамическими связями. И хотя в его работе используется сложный математико-логический способ анализа проблемы и описания решения, если настойчивый программист с базовым математическим образованием уделит немного времени чтобы разобраться в сути его небольшой статьи: «Can programming be liberated from the von Neumann style?», то для него станет понятной связь между моделью λ-исчислений и биологическими нейронами.


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

– как и всякая клетка, нейрон может размножаться;

– нейрон способен инициировать соединения с другими нейронами;

– нейрон может принимать или отказываться (attraction, repulsion) от приглашений на соединение, поступающие от других клеток;

– внутри нейрона есть механизм, который реагирует на изменение электро-магнитного и биохимического состояния внешней для него среды и, соответственно, у него есть генератор ответных электрических или химических сигналов;

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


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


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


Когда-то Аристотель в своих рассуждениях о природе знаний, выделил два типа поведения: подчиненное и рассудительное. Подчиненное поведение – это исполнение инструкций без необходимости или возможности понимать цель. А рассудительное – способность определить пользу действия и разработать инструкцию для исполнителя. Человек, способный понять – способен сформулировать цель и определить способ достижения. Так же и программист создает последовательности инструкций для исполнения компьютером аналогично тому, как менеджер или технолог создают процедуры для исполнителей в офисе или на производстве. В биологических системах, для того чтобы понять, используются динамические многослойные нейронные сети, способные генерировать новые ассоциации. Создание новых ассоциативных связей – это то, что отличает высшую нервную деятельность от любых, сколь угодно сложных, исполнительных механизмов или систем интерпретации программ. Нервная система червяка-нематоды принципиально отличаются от человека не только количеством нейронов, но и тем, что наш мозг постоянно создаёт новые связи, а у червяка, после этапа формирования, они остаются одними и теми же на протяжении всего периода его существования. И наверное поэтому люди все разные, а червяки – одинаковые.


Какой бы сложной не была программа, до тех пор, пока исполнительный механизм будет следовать ее логике, этот механизм не создает новых знаний. И в этом отличие машин Тьюринга или фон Неймана от динамических нейронных моделей. Машины такого типа не могут работать без загруженных в них программ, а наш головной мозг работает без центрального процессора и без внешнего программиста. Теперь на вопрос: «Может ли машина мыслить?» рассудительный программист мог бы ответить так: «Одна машина мыслить не может точно, а вот множество взаимосвязанных машин с определенными новыми свойствами, похоже, что да. И кто знает, возможно, что Интернет – это прототип нового поколения умных машин?».


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


Хотя алфавиты, с которыми работают компьютеры, меняются часто, неизменной остается двоичная система, на базе которой строятся более мощные структуры – машинные слова, шестнадцатеричные символы, юникод, и т. п. А вот базовая спецификация языка, на котором записаны коды биологических программ не меняется на протяжении миллиарда лет! И более того, это язык, в основании которого лежит очень простой алфавит. Можно сказать, что геном человека – это программа, написанная всего четырьмя буквами. Если бы нам удалось построить аналогичную основу систем программирования, то продолжительность жизни программ увеличилась бы существенно, и это то направление, в котором работают конструкторы виртуальных машин.


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


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

Активные данные. Философское программирование

Подняться наверх