Обновить

Комментарии 10

Примеры требуют очень старую версию питона, что не позволяет проверить результаты. Хотелось бы также сравнить с подходом к сетям КАН и увидеть другие методы аппроксимации. Подход же, в котором само выстраивается группа аппроксимирующих символьных функций очень интересен. До сих пор мне был известен только метод Прони, в котором использовалась комбинация exp(b*t)*(c*sin(a*t)+d*cos(a*t).

Здравствйте! Thefittest работает на версиях от 3.7 до 3.13. Актуальная версия на данный момент 0.2.7. Посмотрите документацию для большей информации https://sherstpasha.github.io/thefittest/. Сам google colab, в котором выполнены вычисления, сегодня работает на версии питона 3.11, поэтому "старой" версии быть не должно. Вы также можете повторить эксперименты в самом google colab'е, сделав его копию, или написать мне лично, если у Вас сложности с установкой локально

e:>python -V
Python 3.13.7

e:>pip install thefittest==0.2.7
ERROR: Ignored the following versions that require a different python version: 0.1.10 Requires-Python >=3.7,<3.11; 0.1.11 Requires-Python >=3.7,<3.11; 0.1.13 Requires-Python >=3.7,<3.11; 0.1.14 Requires-Python >=3.7,<3.11; 0.1.15 Requires-Python >=3.7,<3.11; 0.1.9 Requires-Python >=3.7,<=3.10; 0.2.0 Requires-Python >=3.7,<3.11; 0.2.1 Requires-Python >=3.7,<3.12; 0.2.2 Requires-Python >=3.7,<3.12; 0.2.3 Requires-Python >=3.7,<3.12; 0.2.4 Requires-Python >=3.7,<3.12; 0.2.5 Requires-Python >=3.7,<3.12; 0.2.6 Requires-Python >=3.7,<=3.12; 0.2.7 Requires-Python >=3.7,<=3.13
ERROR: Could not find a version that satisfies the requirement thefittest==0.2.7 (from versions: 0.1.7, 0.1.8)

Это ожидаемо. <=3.13 pip воспринимает как <=3.13.0, поэтому 3.13.7 уже не проходит. я не могу сразу расширить поддержку на самые новые версии, потому что зависимости вроде numpy или numba, пайторч тоже переезжают небыстро, и приходится ждать, пока они стабильно начнут поддерживать новые версии. По этой же причине в google colab сейчас 3.11 или на 3.12 - они покрывают большинство пакетов. Подобные проблемы одно из того, с чем я столкнулся, когда начал писать код не только для себя, но и для других

Интересная мысль, а не годится ли такая схема подбора структуры вычислений для построения оптимальных сетей?

смотря что Вы имеете ввиду. Структура (связи, функция пригодности и т. д.) правда подбирается довольно легко. Можно в функцию пригодности добавить штрафы или другие регулирующие параметры, чтобы направить поиск в нужное направление. Если Вы о чем-то другом то, конечно, можно, но нужно понимать, как закодировать решение.

Хотя использование ГП довольно дорогой способ, нужно обучать каждую сеть-кандидата и работать с популяцией. В этом плане часто более эффективны подходы NAS (Neural Architecture Search)

https://link.springer.com/article/10.1007/s10462-024-11058-w?

Покопался в интернете и нашел NEAT https://habr.com/ru/articles/910878/ которую я раньше отказался читать из-за не выловленной автором опечатки. Тоже генетическое построение для поиска оптимальной сети. По моему просто добавлять и удалять узлы и связи, оценивая увеличение точности достаточно. Использовать биологическую терминология не обязательно. Главное алгоритмы добавления, оценка точности и определения конца процесса уточнения.

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

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

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации