Pull to refresh
109
0
Евгений @Jenyay

Пользователь

Send message
> А у вас есть какие-нибудь ссылки на эту тему? А то те работы, что я находил сводились к тому, чтобы подобрать начальные веса сети, а затем учить её как обычно, обратным распространением.

Я имел в виду книгу, изданную в Бауманке: Комарцова Л.Г., Максимов А. В. «Нейрокомпьютеры: Учеб. пособие для вузов». Изд-во МГТУ им. Баумана, 2004.

Там есть глава, которая называется «Обучение нейронных сетей на основе генетического алгоритма». Хотя по сути в этой главе описываются генетические алгоритмы в общем виде и про применение к нейронным сетям сказано мало.
Между вызовами find_min и next_iterations. Одна из задач, которую хочу реализовать с помощью этой библиотеки — это интерфейс для демонстрации работы генетического алгоритма. Там нужно будет запускать алгоритм на заданное количество итераций (1, 10, 100 и т.д.) Поэтому сначала будет создаваться объект MaxIterations для критерия останова на одно количество итераций, а потом, когда алгоритм их завершит, заменить этот объект на MaxIterations с другим критерием останова.

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

Хотелось оставить возможность в процессе работы менять объекты, которые отвечают за разные этапы алгоритма.

> Так ли необходимы именно упакованные типажи-объекты?

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

> Если подправить эти моменты, то производительность может неплохо возрасти.

Для ускорения в первую очередь надо распараллелить алгоритм, а параллелиться по идее он должен достаточно легко.
> Так я вам и предлагаю, распилить это на две части: сама мутация и выбор того, кто мутирует.

Сейчас как раз так и сделано. Создается структура VecMutation, которая определяет, будет ли мутироваться данная особь или нет. А конструктору VecMutation передается структура, которая определяет, каким образом будет мутироваться особь (если будет).
> Теперь ясно, у вас оператор мутации выбирает, кого мутировать а кого нет. Здесь немного смущает то, что если мне понадобится поменять сам принцип отбора особей для мутации, то мне придется менять тот компонент, который отвечает за саму мутацию.

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

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

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

> А у вас есть какие-нибудь ссылки на эту тему? А то те работы, что я находил сводились к тому, чтобы подобрать начальные веса сети, а затем учить её как обычно, обратным распространением.

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

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

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

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

> то есть мутируют всегда.

Не совсем так. Структура VecMutation мутирует каждую хромосому с заданной вероятностью, которая задается в конструкторе. Эта структура использует другие структуры, которые описывают, каким именно образом будет происходить мутация. Есть еще структура BitwiseMutation, которая мутирует хромосомы всегда, но она предназначена для использования вместе с VecMutation. Но, пожалуй, для ясности стоит сделать так, чтобы и BitwiseMutation мутировала с какой-то вероятностью.

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

Я это и имел в виду, когда писал абзац про нейронные сети и применение в CAD. Может быть стоило описать более подробно примеры.
Спасибо большое, для меня Rust еще новый язык, поэтому любые советы по поводу того, что как делать правильно с точки зрения идеологии, полезны.
Нет, сама библиотека не занимается профилированием кода, она только запускает генетический алгоритм.
Мне кажется, что создание стрелок с размерами, привязанными к конкретным точкам — это была бы полезная вещь, чтобы сразу видеть, не поехали ли какие-то размеры в процессе изменения модели. То, что их придется проставлять руками — понятно, и в этом нет ничего страшного.
Можно ли с созданной моделью сделать что-то полезное помимо преобразования в STL для отправки на 3D-принтер? Есть ли шанс, что в будущем можно будет создавать чертежи по модели? Можно ли как-то отображать размеры на трехмерной модели?
Меня в этом плане особенно пугает Web и настольные приложения, построенные поверх него (aka Electron). Количество слове абстракции зашкаливает. Например, Typescript -> JavaScript -> HTML -> браузер -> нативный код.
Спасибо за доходчивое объяснение. На днях как раз задавался этим вопросом и читал, что пишут на форумах по этой теме. Эта статья показалась понятнее того, что я видел до этого.
А может быть там есть картинка и на другой стороне блока.
На данный момент у этой библиотеки есть проблемы, если пытаться открывать страницу, путь до которой содержит нелатинские буквы. Ссылка на баг — bugs.webkit.org/show_bug.cgi?id=184660
Если это действительно так, то это было бы вообще идеально. Но нужна смотрелка, которую мог бы установить простой пользователь. Кстати, есть такие?
А какие компании занимаются разработкой этого стандарта? Есть шансы, что его будут продвигать крупные игроки? В Википедии есть впечатляющий список участников Khronos Group, но Khronos Group занимается и более известными стандартами вроде OpenGL и OpenCL. Интересно, кто заинтересован в развитии и использовании glTF. Потому что проблема с отображением 3D у пользователя действительно есть.
Судя по описанию, этот формат больше предназначен для показа в web конечному пользователю, следовательно ближе к художественной трехмерной графике. В тексте хорошо сравнили формат фотошопа и jpg.
А не получится так, что при создании API на основе GraphQL мы невольно начнем привязывать представление данных и элементы запроса к структуре БД (или моделям) на сервере?
Я за то, чтобы веб наоборот стал более стандартизованным. Когда делают десктопный софт, то стараются, чтобы он не выглядел чужеродно в операционной системе, а интерфейс сайтов — хаос. Не хочу я видеть десятки разных шрифтов на каждой странице, сделайте так, чтобы я видел шрифт, установленный в браузере по умолчанию. Хорошо, можете использовать шрифты для всяких картинок-эмодзи, но не для текста.
А как у Rust с научными расчетами? Есть какие-то общепризнанные математические библиотеки для работы с матрицами, математическими функциями вроде функций Бесселя и т.п? И есть ли библиотека для построение 2D- и 3D-графиков?

Интересно, удастся ли полноценно заменить связку Python + numpy + matplotlib на Rust + что-то.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity