Что сдерживает генетическое программирование?

Я достаточно успешно проделал большую работу с генетическими алгоритмами и до сих пор игнорировал генетическое программирование. Насколько мне известно, большинство программ по-прежнему пишут программисты, и мне любопытно узнать, что сдерживает генетическое программирование?

Вот некоторые возможные объяснения, о которых я подумал:

  1. Пространство поиска слишком велико, чтобы найти полезные программы среди шума.
  2. Большинство реальных приложений не могут предоставить достаточно данных для оценки пригодности такого пространства.
  3. Трудно свести эффективность многих реальных приложений к единственному показателю пригодности. Другими словами, написание подходящей фитнес-функции, вероятно, потребует того же объема работы, что и написание реальной программы.

Любые идеи?


person zenna    schedule 07.12.2010    source источник
comment
Этот ответ нужно было задать на бирже стека искусственного интеллекта, но, к сожалению, 9-10 лет назад ее не существовало.   -  person nbro    schedule 27.11.2020


Ответы (14)


Это то, что я рассматривал в своем собственном исследовании, и я бы сказал, что есть много причин:

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

  2. Особое внимание уделяется использованию LISP, потому что он может создавать красивые древовидные структуры, которыми легко манипулировать, а императивные программы, к сожалению, игнорировались, поскольку они требуют решения некоторых сложных задач. Чтобы GP серьезно воспринимался программистами, он должен создавать императивные программы.

  3. Реальные программы содержат конструкции циклов, но циклы трудно реализовать в GP без всевозможных уродливых ограничений, предотвращающих бесконечное зацикливание.

  4. Генетическое программирование плохо масштабируется. Это нормально для небольших проблем с небольшим доступным языком, но, как вы говорите в своем первом пункте, пространство поиска очень быстро становится слишком большим.

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

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

person Tom Castle    schedule 07.12.2010
comment
+1 за пункт №1. По моему опыту, большинство программистов создают приложения для ввода/вывода данных/вычисления, в которых вся логика относительно проста. Я не думаю, что основные узкие места в разработке программного обеспечения (по крайней мере, в разработке программного обеспечения для бизнеса) как-то связаны с поиском более эффективных алгоритмов для конкретных задач. - person John Bledsoe; 08.12.2010

Самое сложное в генетическом программировании — написать хорошую функцию подсчета очков:

  • Функция оценки должна правильно оценить, обладает ли алгоритм желаемыми свойствами. Это сложнее, чем кажется — гораздо сложнее, чем написать набор тестов. Алгоритм может адаптироваться к любой особенности вашей функции оценки и оптимизировать ее. Пытаетесь развить strcmp? Вместо этого ваш алгоритм может обнаружить математический шаблон для длин ваших тестовых случаев «пройдено / не пройдено».

  • Функция подсчета очков должна быть способна оценить, частично ли работает тестируемый алгоритм. Генетическое программирование основано на «восхождении в гору». Крошечная полезная мутация должна вызвать крошечное постепенное улучшение оценки. Если ваша функция подсчета очков может выводить только истину/ложь, значит, вы ищете случайным образом, а не генетически.

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

Изменить, чтобы процитировать:

Грэм-Роу, Дункан. «Радио возникает из электронного супа». New Scientist, том 175, № 2358, стр. 19 (31 августа 2002 г.). Доступно в Интернете по адресу http://www.newscientist.com/news/news.jsp?id=ns99992732

Однако теперь ссылка кажется неработающей.

Новая ссылка: http://www.newscientist.com/article/dn2732-radio-emerges-from-the-electronic-soup.html

person Ben Jackson    schedule 07.12.2010
comment
Проголосовал за, потому что это просто хороший пример применения ГА к практической проблеме. Это указывает путь к использованию GA во многих областях. - person ; 28.12.2012

Я знаю, что опаздываю на эту вечеринку, но я просто хотел бы сделать пару замечаний. Мне посчастливилось работать с Джоном Коза над его книгой «Генетическое программирование 4».

Тип программирования, которым большинство из нас занимается изо дня в день — подключение событий графического интерфейса, отправка пикселей, создание базы данных и т. д. и т. д. — это, безусловно, не тот тип программ, которые стремится создать GP.

Что Джон Коза делает со своим кластером из сотни машин (если я правильно помню!), так это ищет решения интересных проблем (думаю, NP-сложно). Это печально, но большинство проблем, над которыми мы, программисты, работаем изо дня в день, не очень интересны или сложны, в основном просто раздражают и отнимают много времени.

То, что Бен Джексон сказал о генно-инженерном электронном генераторе, ближе всего к тому, что на самом деле делают доктор Коза и его команда. В серии книг GP было много примеров схем.

То, что Том Касл сказал здесь об императивных программах, не совсем верно. Ярким примером этого от Джона и компании является прогон конструкции антенны. Это в значительной степени программа для трехмерного рисования с такими командами, как язык рисования LOGO, который проектирует антенну. Он имеет команды типа moveto, lineto для помещения и извлечения матриц из стека. Пакет GP, который я только что рассмотрел на прошлой неделе, jgap, имеет прямую поддержку: нетерминал типа контейнера, который может содержать пустые операторы возврата, а затем имеет оператор возврата в конце. Я считаю, что у него даже есть что-то вроде локальных переменных, хотя я не присматривался слишком внимательно.

Первоначальный дизайн LISP, вокруг которого работает ранний GP, время от времени доставляет неудобства, и это, безусловно, правда. Я думаю, что это что-то вроде обряда посвящения, когда меня раздражает перевод вывода GP в более удобный код.

TL;DR: GP на самом деле не система автоматического программирования. Это автоматизированная система изобретения.

person fletch    schedule 29.01.2013
comment
Угадайте, что стоголовый Беовульф был первоначальным небольшим прототипом, основанным на DEC-Alpha. Основная часть его исследовательских задач была разработана на гораздо более крупной игрушке, ~ 1000 двухпроцессорных бездисковых машин, иерархически связанных в кластер GNU/Beowulf. В любом случае, должно быть, это было прекрасное время для работы с J.R.Koza, круто, что вы нашли время, чтобы упомянуть здесь этот кусочек вашего личного опыта. Спасибо @fletch - person user3666197; 04.09.2017

Я бы сказал 1. и 3.

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

Что касается пункта 1, я бы сказал, что пространство поиска имеет бесконечное число измерений.

person Andre Holzner    schedule 07.12.2010
comment
Хорошие моменты, хотя я думаю, что он имеет бесконечное количество измерений, только если вы считаете, что ваша программа потенциально бесконечно длинна. Если рассматривать программу как двоичную строку из 100 бит, то существует 2^100 программ, и можно сказать, что существует 100 измерений. Конечно, мы, вероятно, не знаем, насколько большой будет программа. - person zenna; 07.12.2010

Три вещи:

  1. Как говорит Андре, написать фитнес-функцию очень сложно. этого достаточно. Это окончательная версия Test Driven Development. Вам придется написать модульные тесты, которые обеспечивают 100% охват еще не написанной программы. Но даже в этом случае 100% покрытия вряд ли будет достаточно. Когда мы решим проблему формального определения точного поведения всех аспектов сложной системы, а затем проверки того, что данная программа удовлетворяет этой спецификации, у нас может появиться шанс.
  2. Генетическое программирование не является детерминированным и лучше подходит для создания приблизительных, а не точных решений.
  3. Генетическое программирование, применяемое к любой проблеме разумной сложности, требует феноменально больших вычислительных затрат. Еще в 1999 году Genetic Programming Inc. использовала кластер из 1000 узлов для своей работы в поле.
person Dan Dyer    schedule 07.12.2010

GP не может быстро решить новые проблемы, о которых не знает человек, создающий фитнес-функцию. Таким образом, в настоящее время его можно использовать только для решения проблем, которые мы уже знаем, как решить, но не идеальны для полного решения из-за ограниченного пространства поиска. Например, Коммивояжер. Что можно быстрее решить с помощью ГА.

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

Генетическое программирование, как и настоящая генетика, подвержено той же модели роста, что и все системы роста платформы. Это означает, что GP будет прогрессировать до точки, когда основные утилиты, включенные в нее, попадут на платформу, она выровняется, а затем потребуется ДОЛГОЕ время, прежде чем она наткнется на новую парадигму, чтобы построить новую платформу.

Это проэволюционное видео иллюстрирует эти модели роста платформы. http://www.youtube.com/watch?v=mcAq9bmCeR0 в то время как для разработки новой руки, и как только это происходит, новая рука становится новой вещью и быстро переходит к оптимальному примеру большего количества рук. (Я должен упомянуть, что это видео, скорее всего, использует GA, а не GP, но генетика есть генетика)

Это примерно та же логика, что и в теории сингулярности, кстати.

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

person DampeS8N    schedule 08.12.2010

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

Давайте предположим, что у вас бесконечная вычислительная мощность, если не учитывать размер пространства поиска, проблемы с медлительностью и другие «скорости». Теперь у вас есть только две проблемы: - Будет ли останавливаться сгенерированная программа? - Как убедиться, что сгенерированная программа ведет себя так, как я хочу?

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

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

Еще один шаг вперед — использование автоматических доказательств. Автоматическое доказательство правильности алгоритмов на самом деле тесно связано с математическим автоматическим доказательством теорем. Вы описываете свою программу с помощью аксиоматизированной системы и пытаетесь автоматически доказать правильность своего утверждения. Здесь вы снова сталкиваетесь с сильными теоретическими барьерами, которыми являются теоремы Гёделя о неполноте . Эти теоремы среди прочего утверждают, что даже для очень простых аксиоматизированных систем, способных выполнять арифметические действия с натуральными числами, не существует алгоритма (называемого эффективной процедурой), способного доказать все теоремы, касающиеся этих натуральных чисел. Конкретно это означает, что даже для простых программ вы не сможете доказать ее правильность.

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

person Julien    schedule 17.02.2013
comment
За этот ответ регулярно голосуют, не стесняйтесь добавлять конструктивный комментарий! - person Julien; 23.11.2015
comment
Проблема остановки является теоретической. Программа, которая не останавливается в течение практического тайм-аута (решение остановки :P), вряд ли принесет большую пользу. Огромное количество программного обеспечения, используемого сегодня, далеко не соответствует действительности ни по каким меркам. Если GP сможет разработать программное обеспечение дешевле, чем люди, и достичь того же или лучшего качества, то оно может получить более широкое распространение. Чисто теоретический подход к правильности и эволюции в настоящее время слишком сложен, как это наблюдается во многих областях ИИ. Подход больших данных к машинному обучению в сочетании с перспективой разработки программного обеспечения может оживить эту область. - person Brendan Cody-Kenny; 11.05.2016
comment
Это старо, но я думаю, что основная проблема с вашим ответом заключается в том, что вы формулируете его как факт, потому что, хотя это действительно предположение (и неплохое, ИМХО). Конечно факты констатируете, но вопрос почему не взлетело? Это может быть из-за этих недостатков, но эти недостатки на самом деле применимы и к обычному программированию, и, несмотря на это, оно работает нормально. - person Mike Wise; 14.07.2016
comment
Я рассматриваю это не как предположение, а как факт, который имеет место в большинстве случаев программирования. См. В принятом ответе проблему бесконечного цикла, которая является лишь единственным случаем остановки проблемы. Нравится вам это или нет, теория в CS, как и природа в физике, всегда будет рядом, чтобы сказать вам правду. Отличие от обычного программирования в том, что вы не генерируете свою программу случайным образом, а (должны) следовать какому-то рациональному методу для выполнения своей задачи программирования. На мой взгляд, формальные методы являются более практичным подходом к генерации программ, чем генетическое программирование. - person Julien; 15.10.2017

Может быть, что большинство программистов — программисты, а не компьютерщики?

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

Не всему нужен причудливый алгоритм. Из всего кода, написанного в мире, действительно ли «стандартные» веб-приложения, ОС, программирование устройств нуждаются в генетических алгоритмах?

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

person hvgotcodes    schedule 07.12.2010
comment
Независимо от того, правда это или нет, это утверждение по-прежнему утверждает, что существуют ученые-компьютерщики, и, таким образом, на самом деле не отвечает на вопрос. - person Kendrick; 07.12.2010
comment
@kendrick, я думаю, что да, по крайней мере, на словах. Если что-то сдерживается, то почему? Не потому ли, что не хватает людей, которые умеют это делать? - person hvgotcodes; 07.12.2010
comment
Я дам вам это. Мое мнение таково, что в области компьютерных наук определенно работает достаточно много людей, и в этой области можно было бы посвятить больше ресурсов, если бы она была достаточно интересной и/или ценность применения ресурсов для решения проблем была сочтена достаточно высокой. - person Kendrick; 07.12.2010

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

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

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

person redtuna    schedule 07.12.2010

Первобытный суп подозрительный и неаппетитный. Для своего производственного кода я предпочитаю Intelligent Design.

person Josephine    schedule 08.12.2010
comment
Интересно, кто-нибудь успешно использовал GA/GP для создания качественного пользовательского интерфейса? Используя такие вещи, как средний показатель успешности выполнения задачи, индексирование липкости и соотношение посетителей к продажам. - person DampeS8N; 09.12.2010
comment
Интересная мысль дамп. Я думаю, что это проблема, которую может решить ГА, но большая часть работы должна быть сделана программистом, ГА, вероятно, просто изменит положение или размер элементов. Если бы вы могли использовать GP для написания HTML/CSS с нуля, это было бы нечто. - person zenna; 11.12.2010

Мое личное мнение после пары лет исследований общей практики в университете и последующих исследований в этой области: GP не масштабируется.

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

Хотя мне нравится идея, что фитнес-функция GP является TDD в совершенстве :-) Может быть, какой-нибудь светлый ум когда-нибудь придумает лучший способ управления симулированной эволюцией, но этого еще не произошло.

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

Привет, Джей

person Jay    schedule 11.12.2011
comment
Джей, а как насчет самомодификации фитнес-функции, чтобы она развивалась вместе с программой? Таким образом, вам не нужно разрабатывать идеальную фитнес-функцию, а просто алгоритм, позволяющий развивать идеальную фитнес-функцию. - person ; 28.12.2012
comment
@ user922475 Забавная мысль. Нужна ли нам тогда фитнес-функция для оценки фитнес-функции? - person Nicholas Morley; 22.02.2018
comment
Это было сделано в форме коэволюционирующих популяций. Нет специальной фитнес-функции, просто «быть лучше», чем программы в другом населении. Это также было сделано ранее в несколько похожей форме в крупном эксперименте, обычно называемом жизнью на Земле :-) - person Jay; 14.03.2018

Есть несколько проектов, решающих вышеперечисленные проблемы в ГП. Примером может служить opencog MOSES.

person Misgevolution    schedule 12.10.2013

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

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

person tObi    schedule 11.03.2012

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

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

Просто сравните спонсоров их конференций со спонсорами других конференций по AI/ML/оптимизации. Будет понятно их «текущее» значение в промышленности.

Но это область исследований, и от нас зависит, как заставить ее работать. Пока это просто хобби!

person kosmos    schedule 17.11.2016
comment
Определенно согласен с вашим видением. К сожалению, исследования на низком уровне применимы ко многим областям исследований в области прикладных вычислений. - person Julien; 17.11.2016
comment
@EulDjulius Проблема в том, что эти исследователи образуют собственное сообщество и в нем продолжают публиковать свои работы. совершенно не помня о том, что их нужно сравнивать с другими современными алгоритмами. Редко вы найдете упоминания о генетическом программировании на ICML или других ведущих конференциях, таких как IJCAI. - person kosmos; 18.11.2016