Forwarded from optorepost
Шикарное видео про обучение нейронки балансированию двойного маятника. Обучается через генетический алгоритм. Вроде бы простая задача, простое решение, но очень глубоко. А в какой-то момент автор придумал гениальное решение, когда его система перестала обучаться.
Я посмотрел очень много подобных видео, и вообще погружался в тему, и это видео одно из достойнейших. Так что реально рекомендую.
На самом деле это вторая часть, и там есть первая с контекстом и историей. Ради второй стоит посмотреть и первую (https://www.youtube.com/watch?v=EvV5Qtp_fYg).
https://youtu.be/9gQQAO4I1Ck (это вторая)
Я посмотрел очень много подобных видео, и вообще погружался в тему, и это видео одно из достойнейших. Так что реально рекомендую.
На самом деле это вторая часть, и там есть первая с контекстом и историей. Ради второй стоит посмотреть и первую (https://www.youtube.com/watch?v=EvV5Qtp_fYg).
https://youtu.be/9gQQAO4I1Ck (это вторая)
YouTube
How to train simple AIs to balance a double pendulum
Previous video: https://youtu.be/EvV5Qtp_fYg
XPBD article: https://matthias-research.github.io/pages/publications/XPBD.pdf
Github https://github.com/johnBuffer/Pendulum-NEAT
● Support me on patreon https://www.patreon.com/c/pezzzaswork
● Join the Discord…
XPBD article: https://matthias-research.github.io/pages/publications/XPBD.pdf
Github https://github.com/johnBuffer/Pendulum-NEAT
● Support me on patreon https://www.patreon.com/c/pezzzaswork
● Join the Discord…
❤7
optorepost
Шикарное видео про обучение нейронки балансированию двойного маятника. Обучается через генетический алгоритм. Вроде бы простая задача, простое решение, но очень глубоко. А в какой-то момент автор придумал гениальное решение, когда его система перестала обучаться.…
#prog #math #video
Больше всего меня удивило следующее:
Первые решения автора использовали скорость перемещения каретки в качестве выходного параметра (ещё для первой части с уравновешиванием одинарного маятника). В качестве fitness function использовалась очень простая вещь: единица счёта начислялась за каждую секунду симулированного времени, во время которой конец маятника находился достаточно высоко. С таким подходом ему удалось сконструировать решение, но для получения эстетически удовлетворительных результатов — без лишней дёрганности — ему пришлось модифицировать fitness function, чтобы она штрафовала решения за ненулевую угловую скорость маятника и за отклонение от серединного положения.
В комментариях к первому видео автора справедливо заметили, что использование скорости в качестве выходного параметра фактически означает бесконечное ускорение и потому нефизично и нереалистично. В конце второго видео автор попробовал подход, при котором в качестве выходного параметра используется ускорение каретки вместо скорости — разумеется, скорость каретки пришлось добавить в качестве входного параметра для нейросети. В итоге получилось рабочее и при этом не дёрганное решение — и для его достижения было достаточно первой, самой простой формы fitness function.
Больше всего меня удивило следующее:
Первые решения автора использовали скорость перемещения каретки в качестве выходного параметра (ещё для первой части с уравновешиванием одинарного маятника). В качестве fitness function использовалась очень простая вещь: единица счёта начислялась за каждую секунду симулированного времени, во время которой конец маятника находился достаточно высоко. С таким подходом ему удалось сконструировать решение, но для получения эстетически удовлетворительных результатов — без лишней дёрганности — ему пришлось модифицировать fitness function, чтобы она штрафовала решения за ненулевую угловую скорость маятника и за отклонение от серединного положения.
В комментариях к первому видео автора справедливо заметили, что использование скорости в качестве выходного параметра фактически означает бесконечное ускорение и потому нефизично и нереалистично. В конце второго видео автор попробовал подход, при котором в качестве выходного параметра используется ускорение каретки вместо скорости — разумеется, скорость каретки пришлось добавить в качестве входного параметра для нейросети. В итоге получилось рабочее и при этом не дёрганное решение — и для его достижения было достаточно первой, самой простой формы fitness function.
❤🔥1👍1
#prog #rust #article
Enter paradis — A new chapter in Rust's parallelism story
Из-за правил относительно тупого borrow checker работать в Rust с разными мутабельными кусками одной структуры неудобно, даже если они заведомо не пересекаются. Для наиболее простых случаев годится
В случае, если у структуры данных есть некоторая разновидность индексации, которая сопоставляет разным индексам разные элементы, то можно раздавать мутабельные ссылки на разные элементы, соответствующие разным наборам непересекающихся индексов. На практике это выливается в некоторый бойлерплейт с unsafe, который ещё и надо написать достаточно аккуратно, чтобы не потерять проверки времён жизни.
Библиотека paradis как раз стремится заполнить этот пробел за счёт предоставления этих наборов уникальных непересекающихся индексов и их комбинаторов, сохраняющих эти свойства, а также, разумеется, геттеров, использующих эти наборы индексов. Для каждой отдельной структуры данных требуется только реализовать геттер по индексу (unsafe, разумеется). Причём так как эти абстракции предназначены для использования в многопотоке, геттер возвращает данные, принимая self по разделяемой ссылке.
Автор отдельно отмечает, что paradis — экспериментальная библиотека и её дизайн ещё может поменяться.
Enter paradis — A new chapter in Rust's parallelism story
Из-за правил относительно тупого borrow checker работать в Rust с разными мутабельными кусками одной структуры неудобно, даже если они заведомо не пересекаются. Для наиболее простых случаев годится
spli_at_mut
на слайсах, но это не распространяется на более сложные структуры данных и на более сложные случаи. Скажем, просто разбить слайс на набор мутабельных ссылок на элементы с чётными и нечётными индексами уже не получается.В случае, если у структуры данных есть некоторая разновидность индексации, которая сопоставляет разным индексам разные элементы, то можно раздавать мутабельные ссылки на разные элементы, соответствующие разным наборам непересекающихся индексов. На практике это выливается в некоторый бойлерплейт с unsafe, который ещё и надо написать достаточно аккуратно, чтобы не потерять проверки времён жизни.
Библиотека paradis как раз стремится заполнить этот пробел за счёт предоставления этих наборов уникальных непересекающихся индексов и их комбинаторов, сохраняющих эти свойства, а также, разумеется, геттеров, использующих эти наборы индексов. Для каждой отдельной структуры данных требуется только реализовать геттер по индексу (unsafe, разумеется). Причём так как эти абстракции предназначены для использования в многопотоке, геттер возвращает данные, принимая self по разделяемой ссылке.
Автор отдельно отмечает, что paradis — экспериментальная библиотека и её дизайн ещё может поменяться.
👍10❤5
Блог*
#meme про женскую одежду. Насколько я знаю из разговоров со знакомыми женщинами — правдивый.
Ну и раз уж речь зашла об одежде...
#meme о том, как перестать быть слабаком и одеваться по-мужски (прямо как в старые добрые)
#meme о том, как перестать быть слабаком и одеваться по-мужски (прямо как в старые добрые)
🥰16💩3👌3🤮1🤡1
Forwarded from The After Times
Доступ к платным статьям на Medium.
Вдруг пригодятся, как пригодились мне.
Ниже два сервиса для обхода ограничений:
https://freedium.cfd/<URL>
https://medium-forall.vercel.app/
Вдруг пригодятся, как пригодились мне.
Ниже два сервиса для обхода ограничений:
https://freedium.cfd/<URL>
https://medium-forall.vercel.app/
🔥22👍3🤔1🙏1
#prog #rust #rustlib
Стандартная библиотека Rust предоставляет типы Path и PathBuf, которые инкапсулируют в себе платформо-специфичные пути в файловой системе. Эти пути не обязательно закодированы в UTF-8, поэтому работать с
Подход std правилен в том смысле, что не делает каких-то предположений о содержимом файловых путей, но на практике подавляющее большинство путей и так в UTF-8, а некоторые программы вообще с не-UTF-8 путями не работают, поэтому такая педантичность мешается.
Библиотека camino позволяет сделать работу с путями более эргономичной. Именно, она предоставляет типы Utf8Path и Utf8PathBuf, которые повторяют функциональность
Если что, camino используется в rust-analyzer.
И ещё: если вам требуется отобразить путь при помощи
Стандартная библиотека Rust предоставляет типы Path и PathBuf, которые инкапсулируют в себе платформо-специфичные пути в файловой системе. Эти пути не обязательно закодированы в UTF-8, поэтому работать с
Path
не очень удобно: Path
не реализует Display
, множество полезных функций для манипуляции строками доступны только на str
, но конвертация из Path
в str
может вернуть ошибку.Подход std правилен в том смысле, что не делает каких-то предположений о содержимом файловых путей, но на практике подавляющее большинство путей и так в UTF-8, а некоторые программы вообще с не-UTF-8 путями не работают, поэтому такая педантичность мешается.
Библиотека camino позволяет сделать работу с путями более эргономичной. Именно, она предоставляет типы Utf8Path и Utf8PathBuf, которые повторяют функциональность
Path
и PathBuf
, но гарантированно в UTF-8. Эта проверка осуществляется только один раз: во время создания этих типов, поэтому преобразование из них в str
всегда успешно, и вдобавок они реализуют Display
.Если что, camino используется в rust-analyzer.
И ещё: если вам требуется отобразить путь при помощи
Display
, то вам пригодится метод display на Path
. Он возвращает тип, который по возможности отображает путь так же, как и str
, и каким-то образом замещает невалидные UTF-8 последовательности.👍15🤡5🔥1💩1