вторник, 26 января 2010 г.

09.01.2003 - 09.01.2003 Page 16

Андрей Finder Плахов 9 января, 14:46
На этом форуме также постоянно всплывают следы "объектно-ориентированного " подхода. Особенно среди участников - профессиональных программистов. Задаются вопросы вида "что такое _существительное_ "? Где _существительное_ - это, например, "элементарная мысль " (свежий пример).
Кому как, а мне лично так и представляется

class CThought
{
...
};

class CArtificialIntelligence
{
public:
CThought* GenerateThought();
...
};

и т.п.

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

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 14:52
Я считаю, что уместнее говорить об АИ не в терминах объектов ( "из чего состоит "), а в терминах алгоритмов ( "что делает ").

Еще точнее, пожалуй, будет говорить не об алгоритмах, а о генерации алгоритмов.

--------------------------------------------------------------------------------
Mad Pilot 9 января, 14:53
Похоже на бодягу с XML:

Им можно описать любые данные,
но чтобы описать надо построить описание!
Здесь тоже самое, пытаются подменить задачу инструментом.

Вообще похоже что все попытки создания чего-либо "искуственно интелектуального " уткнутся в занменитую теорему Поста.

--------------------------------------------------------------------------------
Mad Pilot 9 января, 14:54
2 Андрей Finder Плахов
>Еще точнее, пожалуй, будет говорить не об алгоритмах, а о генерации алгоритмов.

Ура! Уже уткнулись ;)))

--------------------------------------------------------------------------------
Mad Pilot 9 января, 14:56
Проблема генерации алгоритмов - алгоритмически не разрешима ;)))

Можно идти искать другой подход.......

--------------------------------------------------------------------------------
Иван FXS 9 января, 15:00
Mad Pilot 9 января, 14:53
... все попытки создания чего-либо "искуственно интелектуального " уткнутся в занменитую теорему Поста.
Ура! Уже уткнулись ;)))
" " " " " " " " " " " " " " " " " " " " " " " " " " " " "
Озвучьте, плз, эту прекрасную теорему.
Желательно - вместе с ее СМЫСЛОМ!
НП, Иван FXS

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 15:01
Поскольку то, как и по каким правилам АИ действует, должно меняться во времени (в этом его смысл), функции, которыми оперирует АИ, стОит выделить в отдельное понятие (а не объекты). И описывать АИ на языке, работающем с функциями и _функторами_, то есть объектами и операциями, создающими и изменяющими функции.

Что я понимаю под функтором, можно объяснить на паре простых примеров.

--------------------------------------------------------------------------------
Mad Pilot 9 января, 15:02
смысл: см выше

озвучить:
Берем любой учебник дискретной математики
и ищем раздел конечных автоматов
Там эта теорема одна из первых.

--------------------------------------------------------------------------------
Mad Pilot 9 января, 15:06
>Что я понимаю под функтором, можно объяснить на паре простых примеров

С нетерпением ждем-с.......

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 15:07
>Mad Pilot 9
>января, 14:56
>Проблема генерации алгоритмов -
>алгоритмически не разрешима ;)))

>Можно идти искать другой подход.......

Mad Pilot, не надо бурно кричать "ура! "
Во-первых, NP-проблема (единственная практически значимая задача генерации алгоритмов) еще не решена ни отрицательно, ни положительно.

Во-вторых, речь, естественно, не о том, чтобы генерировать ЛЮБОЙ алгоритм. Речь пока о том, что вести разговор надо об операциях над алгоритмами и функциями, а не над объектами.

--------------------------------------------------------------------------------
Иван FXS 9 января, 15:08
Вопрос.
Вот ежели я хочу тему обсудить: работа со ЗНАНИЯМИ распеределенными (накопленными) в Интернете ...
- заводить новую тему или здесь, в качестве "раздела " темы ИИ ее гнать?
НП, Иван FXS

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 15:11
>Mad Pilot
>Берем любой учебник дискретной математики
>и ищем раздел конечных автоматов...

Хе, напугал ежа ... гм. Речь в той теореме идет о невозможности создания автомата, за конечное время определяющего верность любого другого алгоритма. Доказательство ее до невозможности казуистично и просто. То есть для любого сколь угодно крутого автомата искусственно конструируется некий входной алгоритм, на котором данный автомат "ляжет ".
Ну и что? В реальности ему просто никто не даст такой вход. Только и всего.

--------------------------------------------------------------------------------
Mad Pilot 9 января, 15:12
2 Андрей Finder Плахов

Очень интересно посмотреть на "операции над алгоритмами ".
Желательно на примерах.
Как для детей и пилотов.
(Если конечно есть на что посмотреть)

--------------------------------------------------------------------------------
Иван FXS 9 января, 15:13
>Проблема генерации алгоритмов -
>алгоритмически не разрешима ;)))
" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
Сорри, а в чем "проблема " с генерацией алгоритмов-то? ;-)
И что такое алгоритмическая разрешимость/неразрешимость??
На пальцах - для чайников - плз!
НП, Иван FXS

--------------------------------------------------------------------------------
Mad Pilot 9 января, 15:17
на пальцах: алгоритмическая неразрешимость задачи - это когда в общем случае невозможно написать программу решаюшую данную задачу.

2 Андрей Finder Плахов
"функтор " - это очередной бесмысленный термин вроде "эволючионного фронта " или "вечного счастья "?
Если нет - можно взглянуть на пример али реализацию?

--------------------------------------------------------------------------------
Иван FXS 9 января, 15:17
"Сорри, а в чем "проблема " с генерацией алгоритмов-то? " - вопрос снят.
-----------------------
"Операции над алгоритмами ". Что он имел в виду, - Андрей сам скажет.
Я могу сказать, что основа ГП (Генетического Программирования) - операция ПОРАЖДЕНИЯ алгоритмов ИЗ (=на основе) имеющихся уже алгоритмов ...
НП, Иван FXS

--------------------------------------------------------------------------------
Михаил Зельдич 9 января, 15:18
Все проблемы здесь от непонимания.

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

Будет весьма интересно если кто либо
найдет свойства систем обладающих
интеллектом выходящие за рамки этих
определений.

В этих определениях содержится и
програма исследований ведущая к
цели.

Что касается Исскуственного Интеллекта
то его не может существовать.
Исскуственной может быть система,
Интеллект он либо есть либо нет.

Михаил

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 15:23
Михаил, удачи. Я знаю примерно 5-7 "гениев ", считающих, что нашли гениальную идею создания ИИ. Удачи им и Вам.

--------------------------------------------------------------------------------
Mad Pilot 9 января, 15:25
2 Иван FXS
в ГП Алгоритмы не порождаются.
Порождаются цепочки символов.
Получаемые из других цепочек по заранее заданным правилам.
Так что даже на примитивный ИИ не тянет.
Можно рассматривать ГП как разновидность (не самую эффективную) переборных алгоритмов.

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 15:26
>функтор " - это очередной бесмысленный
>термин вроде "эволючионного фронта "
>или "вечного счастья "?

Функтор это, по определению, отображение из некоторого множества в некоторое множество функций. Иначе говоря, функтор - это функция, результат которой также является функцией. Слова "функция " и "функтор " здесь понимаются в математическом смысле, а не в программистском, т.е. объекты, называемые термином "функтор " в С++ являются в этом смысле функциями.

--------------------------------------------------------------------------------
Mad Pilot 9 января, 15:30
Мда.....
нет оказывается в природеникаких "функторов " и "эволюционных фронтов ".
Нет и дельных мыслей в размягченных мозгах здешних кулибиных.......

всем пока.

--------------------------------------------------------------------------------
Иван FXS 9 января, 15:47
Да и самой "природы ", как оказывается, - нет, дружище Пилот! ;-)))

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 15:51
Пример функтора:
Функтор "граиентный спуск ". Принимает функцию (зависящую от вектора дополнительных параметров). Возвращает функцию, у которой эти параметры поправлены согласно правилу градиентного спуска.

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

Functor Grad; // где-то определен...

Function Func =
Neur( Sum( x[i]* param1[i] )
where param[i] = random(0.1,0.9);
do
{
error = 0;
foreach ( X, Y in entry )
{
Func = Grad( Func, Func(X) - Y );
error += Norm( Func(X) - Y );
}
}
while error < 0.1 * size(entry)

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

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 15:52
>Нет и дельных мыслей в размягченных >мозгах здешних кулибиных.......

Mad Pilot, так писать некрасиво. Кто, извините, Вы такой, чтобы оценивать состяние чужих мозгов? Гений? Или психиатр?

--------------------------------------------------------------------------------
Иван FXS 9 января, 15:55
Mad Pilot 9 января, 15:25
в ГП Алгоритмы не порождаются.
" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
Тезис в чем: не порождаются или не алгоритмы?
Любая программа - это разве не "цепочки символов "??
"Цепочка символов " - не висящая на шее у папуаса, а - ИСПОЛНЯЕМА некоей МАШИНОЙ (=процессором), это и есть алгоритм.
НП, Иван FXS

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 15:57
Я понял, что "псевдокод " не везде ясен. Например, использованная переменая Neur означает функцию одной переменной, гм... как бы ее нарисовать-то...

короче, функция нелинейности нейрона, у нее еще график такой, на график арктангенса похож...

--------------------------------------------------------------------------------
Mad Pilot 9 января, 16:03
короче возвращаем набор параметров нейросети натасканной на определенную задачу?
такая проблема не интересна ибо давно решена. (тождественно равна задаче обучения нейросети).

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 16:06
В языке, построенном на функциях, должны быть допустимы подобные преобразования над функциями:

Function A = ...;
Function B = ...;
Function C = A + 2*B;
Function D = A(B);
и т.п.

--------------------------------------------------------------------------------
Mad Pilot 9 января, 16:06
Как насчет экспертной системы ведущей диалог на естественном языке,
и уточняющей задачу?

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 16:09
Мad Pilot, ты ведь, кажется, уже уходил?

такая проблема не интересна ибо давно решена

Это - ПРИМЕР. Его смысл состоит в том, чтобы продемонстрировать, что на языке, говорящем понятиями функций и функторов, СУЩЕСТВУЮЩИЕ алгоритмы записываются. Ты ожидал, тебе поведают откровение и сразу же предоставят, скажем, работающий парсер русского языка?

--------------------------------------------------------------------------------
Mad Pilot 9 января, 16:09
можно узнать результат операции преобразования c = a+2*b

если
а - алгоритм сортировки,
b - печатает "Hello word " 10 раз?

что делает c?

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 16:10
У блин, не то хотел сказать.

Это - ПРИМЕР. Его смысл состоит в том, чтобы продемонстрировать, что на языке, оперирующем понятиями функций и функторов, УЖЕ СУЩЕСТВУЮЩИЕ алгоритмы записываются гораздо ПРОЩЕ и КОРОЧЕ.

--------------------------------------------------------------------------------
Иван FXS 9 января, 16:10
Андрей Finder Плахов 9 января, 15:51
Func = Grad( Func, Func(X) - Y );
" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
Хммммммммм! Странно Вы это написали!
Разве не:
X_next = Grad( Func, X_current, X_previous );
???

--------------------------------------------------------------------------------
Mad Pilot 9 января, 16:13
эту задачу ( с сетью) можно решить на ЛЮБОМ языке.
Хоть на асемблере ЕС ЭВМ.

ничего нового сей пример в себе не несет.

про парсер:
парсеров - хоть залейся.
нет теории СМЫСЛА.

--------------------------------------------------------------------------------
Mad Pilot 9 января, 16:15
>гораздо ПРОЩЕ и КОРОЧЕ

какое отношение проще и короче имеет к ИИ?

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 16:15
Mad Pilot,
Во-первых, "функции " - это не функции С. Это функции в математическом смысле. Они не оперируют с глобальной средой, т.е. не имеют выхода в stdout. Грубо говоря, все их входы - const. Все, что делает функция, это генерирует свой выход. Поэтому нельзя говорить о b, которая "печатает "Hello word " 10 раз ".

Во-вторых, то, что ты пишешь, не скомпилируется. По той же причине, по которой не скомпилируется вот это:

int a[10];
char *b = "Hello world "
c = a+2*b

Естественно, не все операции допустимы. И естественно, не все функции имеют один и тот же тип.

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 16:18
Иван FXS
Хммммммммм! Странно Вы это написали!
Разве не:
X_next = Grad( Func, X_current, X_previous );
???

Нет, в этом все и дело. Меняется именно _функция_. Вот в этом и состоит отличие. И Х - не вектор доп. параметров, а вектор входа. Меняется именно Func, а вектор своих параметров она содержит в себе.

--------------------------------------------------------------------------------
Иван FXS 9 января, 16:19
Андрей Finder Плахов 9 января, 15:51
Func = Grad( Func, Func(X) - Y );
" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
А если у Вас вектор текущих значений находится ВНУТРИ переменной типа Func, то:
Func_next = Grad( Func_current, Func_previous );
где тройка Func_next, Func_current, Func_previous - отличается только параметрами (но не "функциональной " части!)

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 16:25
Mad Pilot
>какое отношение проще и короче имеет к ИИ?

Пилот, какое отношение языки программирования и методологии программирования вообще имеют к ИИ? Если никакого, давайте писать ИИ на ассемблере.
А если принять, что все же какое-то имеют, то я говорю о том, что методологию, кажущуюся мне правильной для разработки именно ИИ, существующие языки программирования не поддерживают.

Еще, я сейчас уйду из форума часа на три. Mad pilot, постарайтесь понять: мы здесь не говорим о глупостях. Стараемся, по крайней мере. Я (и многие другие) стараемся делать содержательные посты, не "о гениальных идеях в общих словах ". Не пытайтесь с наскоку "выставить всех дураками ". Это не так просто и вам особенно не пригодится. Не надо "воевать ".

--------------------------------------------------------------------------------
Mad Pilot 9 января, 16:25
Ага.....
перегрузка операторов.....

плавали, знаем.
По полезности стоит в одном ряду с подсветкой экрана.

пусть b - возвращает 3.14.
что от этого изменится?

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 16:28
По смыслу град.спуска, он принимает функцию, у которой выход - N чисел, и N чисел, означающих ошибки выхода. То есть в записи, как вы пишете,
Func_next = Grad( Func_current, Func_current(X) - Y );
Func_current - это функция, а вот
(Func_current(X) - Y) - это вектор ошибки.

Все, я пошел. Скоро буду.

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 16:34
Mad Pilot
перегрузка операторов.....
плавали, знаем.
По полезности стоит в одном ряду с подсветкой экрана.

Cлушайте, о чем с Вами вообще можно говорить? У Вас опыт в программировании какой? У меня пока такое ощущение, что полугодовой курс, 2 года самостоятельного изучения, и теория, взятая из книжки "С за два часа ".

Вы знаете, что такое smart pointers, vector, list, итераторы? Понимаете методологию обобщенного программирования? Перегрузка операторов, поверьте, не только затем нужна, чтобы вектора на плоскости складывать.

И попробуйте на досуге реализовать функтор Grad средствами перегрузки операторов. Пожелаем удачи.

--------------------------------------------------------------------------------
Иван FXS 9 января, 16:35
Андрей Finder Плахов 9 января, 16:18
Х - не вектор доп. параметров, а вектор входа. Меняется именно Func, а вектор своих параметров она содержит в себе.
" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
Понял Вас. Понял также, что Вы выбраль не самый лучший (слишком сложный!) пример, чтобы проиллюстрировать свою мысль!
----------
Однако, - произнесу еще раз слово "ГП ".
Проект (=программа), который "пасет " ( "растит ") стадо (=ансамбль) алгоритмов: берет их "в работу " (по одному или парами, или еще какими-то группами), что-то в них меняет (то ли параметры оптимизирует, то ли сами алгоритмы СКРЕЩИВАЕТ), получает в результате НОВЫЙ алгоритм и возвращает (=добавляет) его в "выпасаемое " стадо ...
- это проект есть чистейшее воплощение идеологии ГП (Генетического Программирования).
НП, Иван FXS
PS. Понятно, что если мы "добавляем в стадо ", то рано или поздно мы должны будем и "забивать " самых "паршивых овец ", - если только у нас не неограниченые ресурсы ...

--------------------------------------------------------------------------------
ZeNoN 9 января, 17:02
Относительно функторов...
Это значит, что возникает необходимость модифицировать код функций, которые сами внутри не предусматривают такую модификацию. Чего существующие языки действительно не позволяют.

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 18:45
2Иван FXS

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

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

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 18:45
2ZeNoN
>Это значит, что возникает необходимость модифицировать код функций, которые сами внутри не предусматривают такую модификацию

It depends. В принципе, функции и функторы можно понимать (эмулировать) для начала как узкую, но полезную разновидность "функторов " С++, т.е. объектов, ведущих себя подобно функциям. Просто шаблоны в С++ оказываются недостаточно гибкими и слишком громоздкими для выражения обобщенных операций над функциями. Кроме того, даже если не эмулировать функции объектами,
некоторые функторы (генетические crossingover и мутация, градиентный спуск) будут уметь работать только с функциями, зависящими от вектора доп.параметров, и на самом-то деле менять только его.

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

--------------------------------------------------------------------------------
smollett 9 января, 19:11
>Это значит, что возникает необходимость модифицировать код функций, которые сами внутри не предусматривают такую модификацию. Чего существующие языки действительно не позволяют.

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

--------------------------------------------------------------------------------
smollett 9 января, 19:28
>В принципе, функции и функторы можно понимать (эмулировать) для начала как узкую, но полезную разновидность "функторов " С++, т.е. объектов, ведущих себя подобно функциям.

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

--------------------------------------------------------------------------------
Андрей Finder Плахов 9 января, 19:31
2smollett

>кажись я говорил об этом когда лисп
>обсуждали.

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

--------------------------------------------------------------------------------
ZeNoN 9 января, 19:32
2 smollett

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

Но что дальше? Нет хорошего способа сделать функцию на C++, которой можно было бы сказать: "а ну-ка вот тебе другая функция, замени в ней циклы 'for' на while с итераторами ". Такая функция должна будет содержать в себе фактически AI программиста, анализирующий код и проверяющий, где и какой итератор нужен. Сама традиционная структура языков программирования к этому не приспособлена.

Комментариев нет:

Отправить комментарий