Про симуляцию эволюции - я думал что это приключение на 20 минут, что самым сложным была физика, но оказалось нет. Я написал модуль для нейросети, сделал эволюцию, запускаю её и... Нифига, оно не обучается. Дай бог делает один поворот и всё.
В прошлом посте можно видеть что были зелёные круги - они означают награду, при их пересечении даётся +1. И вот с помощью эволюции пытался максимизировать это число. Была идея что оно само сможет, лёгкая же задача.
Поэтому начал с того чтобы сделать эту награду более гладкой: добавил расстояние до следующей награды, и замеряю его. Не помогло.
Сделал чтобы машинка всегда стартовала с некоторым небольшим случайным смещением и направлением, чтобы сделать итог более гладким. Сделал чтобы таких запусков было несклько в одной оценке нейронки. Не помогло.
Сделал визуальный редактор трасс - первая анимация. На нём сделал кучу трасс с гладкими поворотами, резкими поворотами, движением по прямой, несколько поворотов, и ещё отразил всё зеркально. Не помогло.
Поменял алгоритм оптимизации на очень крутой CMA-ES, оставлял долго работать. Не помогло.
Менял туда-сюда десяток параметров награды, размеров сети, управления. Не помогло.
Даже функцию активации поменял! Не помогло.
И ведь если погуглить как люди обучают машинки ездить, то всё у них так просто получается, они берут и ездят сразу.Почему он, а не я! Что я делаю не так? Не может быть же так что я настолько туп, что у меня ничего не получается. Начал подсматривать, у них вообще за десяток поколений всё сходилось.
И только в этот момент до меня дошло, что я всё делал правильно, за исключением, что моя задача слишком сложна. Нейронка не может из неё научиться по такому малому числу трасс и вообще. Ну разве, если что сделать 100500 очень разнообразных трасс. Или сделать чтобы нейронка сначала научилась не проходить трассы, а управлять своим телом, хммм. И тут вспоминается данное видео про двойной маятник, там у автора тоже обучение никак не шло, и он решил усложнять задачу постепенно.
Я подумал что последнее что я не твикал - это сложность управления. Ведь у меня такая сложная физика, дрифты там, повороты, инерция (!). Может быть нейронка просто никак не может выучить как этим пользоваться? Минимизировал физику до абсурда: просто дал нейронке возможность разворачивать угол и двигаться вперёд. Никакой инерции и колёс.
И о чудо, обучение пошло!!!! На второй картинке можно видеть дебажный вывод который я использовал, чтобы понять сколько трасс пройдено. И она прошла ВСЕ! Посмотрите как эта она ездит по трассе. Не знаю почему, но напоминает мышку (крадёться). Два дня писал код по 14 часов и НАКОНЕЦ-ТО, ОНО РАБОТАЕТ!!!
Теперь я знаю что надо делать - надо постепенно увеличивать сложность. Сделаю чтобы в физике были отключаемые элементы, и потихоньку, через параметры буду их включать.
#машинки
В прошлом посте можно видеть что были зелёные круги - они означают награду, при их пересечении даётся +1. И вот с помощью эволюции пытался максимизировать это число. Была идея что оно само сможет, лёгкая же задача.
Поэтому начал с того чтобы сделать эту награду более гладкой: добавил расстояние до следующей награды, и замеряю его. Не помогло.
Сделал чтобы машинка всегда стартовала с некоторым небольшим случайным смещением и направлением, чтобы сделать итог более гладким. Сделал чтобы таких запусков было несклько в одной оценке нейронки. Не помогло.
Сделал визуальный редактор трасс - первая анимация. На нём сделал кучу трасс с гладкими поворотами, резкими поворотами, движением по прямой, несколько поворотов, и ещё отразил всё зеркально. Не помогло.
Поменял алгоритм оптимизации на очень крутой CMA-ES, оставлял долго работать. Не помогло.
Менял туда-сюда десяток параметров награды, размеров сети, управления. Не помогло.
Даже функцию активации поменял! Не помогло.
И ведь если погуглить как люди обучают машинки ездить, то всё у них так просто получается, они берут и ездят сразу.
И только в этот момент до меня дошло, что я всё делал правильно, за исключением, что моя задача слишком сложна. Нейронка не может из неё научиться по такому малому числу трасс и вообще. Ну разве, если что сделать 100500 очень разнообразных трасс. Или сделать чтобы нейронка сначала научилась не проходить трассы, а управлять своим телом, хммм. И тут вспоминается данное видео про двойной маятник, там у автора тоже обучение никак не шло, и он решил усложнять задачу постепенно.
Я подумал что последнее что я не твикал - это сложность управления. Ведь у меня такая сложная физика, дрифты там, повороты, инерция (!). Может быть нейронка просто никак не может выучить как этим пользоваться? Минимизировал физику до абсурда: просто дал нейронке возможность разворачивать угол и двигаться вперёд. Никакой инерции и колёс.
И о чудо, обучение пошло!!!! На второй картинке можно видеть дебажный вывод который я использовал, чтобы понять сколько трасс пройдено. И она прошла ВСЕ! Посмотрите как эта она ездит по трассе. Не знаю почему, но напоминает мышку (крадёться). Два дня писал код по 14 часов и НАКОНЕЦ-ТО, ОНО РАБОТАЕТ!!!
Теперь я знаю что надо делать - надо постепенно увеличивать сложность. Сделаю чтобы в физике были отключаемые элементы, и потихоньку, через параметры буду их включать.
#машинки
У Онигири вышло новое видео про агентов на основе GPT, которые играют в Among Us. Довольно интересные результаты, особенно мне понравилось что (спойлер к видео) с двумя импосторами, импосторы выигрывают чаще, чем с одним .
Я, кстати принял там участие в озвучке зелёного амогуса)) Артём сказал что некоторые будут кривляться, вот и я вместо своего обычного монотонного голоса попробовал отыгрывать голос, похожий на саламандр из аудиокниги, которую рекомендовал выше. Мне тяжеловато эти моменты смотреть, кринжовенько 😅
https://www.youtube.com/watch?v=gHZzzNNrDz0
Я, кстати принял там участие в озвучке зелёного амогуса)) Артём сказал что некоторые будут кривляться, вот и я вместо своего обычного монотонного голоса попробовал отыгрывать голос, похожий на саламандр из аудиокниги, которую рекомендовал выше. Мне тяжеловато эти моменты смотреть, кринжовенько 😅
https://www.youtube.com/watch?v=gHZzzNNrDz0
YouTube
Сделал Among Us, где все игроки - GPT
Стань Data Scientist с нуля в Skillfactory: https://go.skillfactory.ru/TOA-Yw
Скидка 50% + бесплатный курс по нейросетям по промокоду ONIGIRI50
Арендуйте сервер на Aéza - https://aeza.net/?ref=onigiriyt
Скидки на StorageVPS 20% - https://aeza.net/ru/storage…
Скидка 50% + бесплатный курс по нейросетям по промокоду ONIGIRI50
Арендуйте сервер на Aéza - https://aeza.net/?ref=onigiriyt
Скидки на StorageVPS 20% - https://aeza.net/ru/storage…
Ну шо народ, 20к подписчиков в ютубе?
Кстати, спасибо тем кто подписывается, я сам очень привередливый, и подписываюсь только когда посмотрю много контента от человека, и понимаю что он мне заходит. Редко бывает что подписываюсь почти сразу. А тут у меня всего 2 видео, перспективы странные, никаких выводов сделать толком нельзя, но люди всё-равно подписываются.
Проспойлерю: через 2 месяца вас ждёт один сюрприз.
Кстати, спасибо тем кто подписывается, я сам очень привередливый, и подписываюсь только когда посмотрю много контента от человека, и понимаю что он мне заходит. Редко бывает что подписываюсь почти сразу. А тут у меня всего 2 видео, перспективы странные, никаких выводов сделать толком нельзя, но люди всё-равно подписываются.
Проспойлерю: через 2 месяца вас ждёт один сюрприз.
This media is not supported in your browser
VIEW IN TELEGRAM
В моей симуляции эволюции машинка наконец-то научилась водить со сложной физикой! Правда, водит она так себе, но это уже что-то, хотя бы трассу проходит.
В итоге наэволюционировал как и планировал: постепенно переходил от простой физике к сложной. Причём простую физику сделал так, чтобы она практически идентично работала со сложной, с точки зрения управления и оказываемого эффекта. Сделал параметр, который можно крутить, и поставил его постепенное движение в сторону сложной физики. На каждое изменение запускал по 50 поколений, чтобы нейронка успела адаптироваться.
Обучение шло очень хорошо, видимо такими методами я и смогу добиться чтобы машинка дрифтила и делала ещё много всяких сложных и интересных вещей)
#машинки
В итоге наэволюционировал как и планировал: постепенно переходил от простой физике к сложной. Причём простую физику сделал так, чтобы она практически идентично работала со сложной, с точки зрения управления и оказываемого эффекта. Сделал параметр, который можно крутить, и поставил его постепенное движение в сторону сложной физики. На каждое изменение запускал по 50 поколений, чтобы нейронка успела адаптироваться.
Обучение шло очень хорошо, видимо такими методами я и смогу добиться чтобы машинка дрифтила и делала ещё много всяких сложных и интересных вещей)
#машинки
Прочитал статью https://habr.com/ru/companies/yandex/articles/845958/
Это прикольно, но слишком сложно! У нас (людей, животных) нет никаких лидаров, 3D реконструкции, gaussian splatting, backpropagation, gps, 360° зрения итд. При этом мы можем выполнять задачи доставки в 100 раз лучше всех этих роботов.
У нас не хватает фундаментальных исследований и открытий в области машинного обучения. Deep Learning слишком полагается на данные и оффлайн-обучение по ним. При этом модели обученные DL толком не способны дообучаться, особенно в реальном времени.
Надеюсь я со своими машинками что-то новое открою.
Это прикольно, но слишком сложно! У нас (людей, животных) нет никаких лидаров, 3D реконструкции, gaussian splatting, backpropagation, gps, 360° зрения итд. При этом мы можем выполнять задачи доставки в 100 раз лучше всех этих роботов.
У нас не хватает фундаментальных исследований и открытий в области машинного обучения. Deep Learning слишком полагается на данные и оффлайн-обучение по ним. При этом модели обученные DL толком не способны дообучаться, особенно в реальном времени.
Надеюсь я со своими машинками что-то новое открою.
Хабр
Как устроен робот-доставщик Яндекса: от восприятия до планирования движения
Уже пять лет по улицам Москвы колесят роботы‑курьеры Яндекса, доставляя нам еду из любимых ресторанов и магазинов быстрее, чем мы успеваем проголодаться. На пути им встречается...
С момента прошлого поста про обучение машинок случилось ОЧЕНЬ много прогресса, о котором я тут не писал, потому что он был черновой, и не готовый к публикации, но вот наконец я достиг той точки, которая достойна.
В прошлом посте я сказал что мне удалось научить машинку ездить через изменение простоты физики - от простой к сложной.
Но когда я начал экспериментировать с разными параметрами нейросети, машинка не обучилась снова ездить. Вернул параметры обратно, а она снова не обучилась. Оказалось что моё обучение очень нестабильно, и в тот раз мне просто очень повезло. И его нифига нельзя использовать для дальнейших экспериментов. Поэтому я погрузился в кроличью нору исследования того как можно улучшить моё обучение, чтобы оно было быстрее и стабильнее. Я сделал следующее:
* Все параметры обучения вынес в тип конфига, чтобы всё что угодно можно было включать/выключать и настраивать числа
* Каждое обучения запускаю по 30-100 раз
* Сохраняю всю инфу в json файлики
* С помощью скрипта на python визуализирую графиками среднее и отклонение от среднего
* Мой компьютер слабенький, поэтому я арендовал сервак с 80 ядрами (!!!) и запускал все эксперименты на нём, нагружая все 80 ядер
Такое огромное число запусков нужно как раз из-за нестабильности обучения, чтобы на среднем видеть тренд, какое изменение в обучении реально влияет на него, а какое нет.
И так я проделал для каждого изменения в метрике обучения, я анализировал всё:
* величину штрафа за врезание в стену
* добавление случайного числа к ответу нейросети
* отключение и включение разных трасс
* изменение разных наград
* алгоритм оптимизации (!) (лучший - cma-es)
* итд итд...
Щас подсчитал все картинки что у меня лежат, и их ровно 199! То есть я провёл не менее 199 экспериментов с машинками, и у меня лежат гигабайты этих json файликов...
И после всего этого я выяснил самую эффективную метрику, которая влияет на скорость и стабильность обучения сильнее, чем все мои другие изменения что я вносил. Но сначала расскажу про прошлую метрику.
Раньше я делал так: машинка проезжала N трасс, и для каждой трассы я суммировал: пройденное расстояние + завершилась ли трасса + как быстро машинка её проехала + минус штраф за удары в стену, всё это с какими-то коэффициентами, а затем суммировал все эти числа в одно число, и старался его максимизировать (чтобы машинка старалась проходить трассы, увеличивать расстояние, а ещё чтобы меньше старалась врезаться, так как это уменьшает итоговое число). Звучит логично, да. Но на самом деле это довольно плохая метрика, так как она разменивает удары об стену на скорость прохождения. И она не стремится проходить все трассы, так как быстрое прохождение по очень простой трассе даст ей столько же очков как и медленное прохождение сложной трассы. А так как она не знает какую трассу проходит, то выбирает одну тактику на все.
Можно было бы сказать что эту метрику надо просто настроить, дать "правильные" коэффициенты всем параметрам, и тогда всё будет очень хорошо сходиться.
В ходе моих экспериментов я выяснил что это нифига не так, и нахождение "правильных" коэффициентов хоть и улучшает обучение, но никакого вау-эффекта не происходит.
Так что же за невероятная метрика, которая делает вау-эффект? Делаем следующее: за каждую пройденную трассу даём в метрику дискретное +1; далее все положительные награды уменьшаем до пределов [0; 1] и берём от них среднее и тоже прибавляем в метрику; а штраф тоже уменьшаем до [0; 1], но через функцию 1/(1+x), чтобы уменьшение штрафа вело к увеличению метрики. И всё, максимизируем это число.
Оказывается с такой метрикой обучение идёт НАМНОГО стабильней и быстрей, чем с прошлой. И если сравнивать по величине раннего финиша (насколько быстро проходит), количеству пройденных трасс, штрафу и прочим параметрам, она реально лучше.
#машинки
В прошлом посте я сказал что мне удалось научить машинку ездить через изменение простоты физики - от простой к сложной.
Но когда я начал экспериментировать с разными параметрами нейросети, машинка не обучилась снова ездить. Вернул параметры обратно, а она снова не обучилась. Оказалось что моё обучение очень нестабильно, и в тот раз мне просто очень повезло. И его нифига нельзя использовать для дальнейших экспериментов. Поэтому я погрузился в кроличью нору исследования того как можно улучшить моё обучение, чтобы оно было быстрее и стабильнее. Я сделал следующее:
* Все параметры обучения вынес в тип конфига, чтобы всё что угодно можно было включать/выключать и настраивать числа
* Каждое обучения запускаю по 30-100 раз
* Сохраняю всю инфу в json файлики
* С помощью скрипта на python визуализирую графиками среднее и отклонение от среднего
* Мой компьютер слабенький, поэтому я арендовал сервак с 80 ядрами (!!!) и запускал все эксперименты на нём, нагружая все 80 ядер
Такое огромное число запусков нужно как раз из-за нестабильности обучения, чтобы на среднем видеть тренд, какое изменение в обучении реально влияет на него, а какое нет.
И так я проделал для каждого изменения в метрике обучения, я анализировал всё:
* величину штрафа за врезание в стену
* добавление случайного числа к ответу нейросети
* отключение и включение разных трасс
* изменение разных наград
* алгоритм оптимизации (!) (лучший - cma-es)
* итд итд...
Щас подсчитал все картинки что у меня лежат, и их ровно 199! То есть я провёл не менее 199 экспериментов с машинками, и у меня лежат гигабайты этих json файликов...
И после всего этого я выяснил самую эффективную метрику, которая влияет на скорость и стабильность обучения сильнее, чем все мои другие изменения что я вносил. Но сначала расскажу про прошлую метрику.
Раньше я делал так: машинка проезжала N трасс, и для каждой трассы я суммировал: пройденное расстояние + завершилась ли трасса + как быстро машинка её проехала + минус штраф за удары в стену, всё это с какими-то коэффициентами, а затем суммировал все эти числа в одно число, и старался его максимизировать (чтобы машинка старалась проходить трассы, увеличивать расстояние, а ещё чтобы меньше старалась врезаться, так как это уменьшает итоговое число). Звучит логично, да. Но на самом деле это довольно плохая метрика, так как она разменивает удары об стену на скорость прохождения. И она не стремится проходить все трассы, так как быстрое прохождение по очень простой трассе даст ей столько же очков как и медленное прохождение сложной трассы. А так как она не знает какую трассу проходит, то выбирает одну тактику на все.
Можно было бы сказать что эту метрику надо просто настроить, дать "правильные" коэффициенты всем параметрам, и тогда всё будет очень хорошо сходиться.
В ходе моих экспериментов я выяснил что это нифига не так, и нахождение "правильных" коэффициентов хоть и улучшает обучение, но никакого вау-эффекта не происходит.
Так что же за невероятная метрика, которая делает вау-эффект? Делаем следующее: за каждую пройденную трассу даём в метрику дискретное +1; далее все положительные награды уменьшаем до пределов [0; 1] и берём от них среднее и тоже прибавляем в метрику; а штраф тоже уменьшаем до [0; 1], но через функцию 1/(1+x), чтобы уменьшение штрафа вело к увеличению метрики. И всё, максимизируем это число.
Оказывается с такой метрикой обучение идёт НАМНОГО стабильней и быстрей, чем с прошлой. И если сравнивать по величине раннего финиша (насколько быстро проходит), количеству пройденных трасс, штрафу и прочим параметрам, она реально лучше.
#машинки
А в чём её идея? Да в том что если машинка научилась проходить какую-то трассу, то ей невыгодно уже перестать уметь её проходить, потому что никакое изменение штрафа и раннего финиша не смогут дать ей такую награду, как пройденная трасса. Плюс, помимо такой дискретной составляющей у неё есть непрерывная - пройденное расстояние на трассе, и она может постепенно увеличивать это число, пока в какой-то момент оно не превратится в +1.
Прикрепляю график. Значит что на нём значит:
* Цветное - это новая метрика, а серый - старая.
* Первая строка - индивидуальные запуски, там ничего особо полезного.
* Вторая строка - тоже особо ничего полезного.
* Третья строка - график слева показывает число пройденных трасс, сплошная линия - новая метрика, пунктирная - старая. Самое-самое главное что новая метрика в большем % случаев проходит больше трасс, особенно смотрите на розовую трассу complex - самую сложную трассу (она участвует в гифках в прошлых постах).
* Затем идёт Early finish - это значит насколько быстро пройдена трасса, берётся среднее от всех трасс и рисуется здесь.
* Четвёртая строка - штрафы за удары в стену, первый график - среднее от всех трасс, второй график - максимальное среди всех трасс.
* Пятая строка - среднее пройденное расстояние и минимальное пройденное расстояние.
Сплошная линия показывает медиану, первая закрашенная область показывает значения между 25 и 75 перцентилями, а очень слабо закрашенная область показывает между 10 и 90 перцентилями. Напоминаю, что это 100 разных запусков обучения, и широта области показывает что в этом месте обучение оч нестабильно, и при разных запусках сходится к разной величине.
По графику в первую очередь видно что в среднем стало проходиться больше трас, они в среднем проходятся быстрее. Но вот меньше ударов в стену было у прошлой метрики, но это довольно старый график, я это уже как-то пофиксил, и новая метрика щас вообще очень хорошо по штрафу идёт, практически возле нуля.
(и да, представляете, я отсмотрел и проанализировал минимум 199 таких графиков...)
Ах да, забыл сказать, я называю эту метрику "уровни". Можно её делать многоуровневой, типо на втором уровне я щас экспериментирую с штрафами (три уровня: штраф < 15, штраф < 5, штраф = 0).
Очень горжусь этой метрикой и рад что её нашёл, с ней обучение реально стало лучше.
На самом деле эти два поста - вводная к следующему (тот самый достойный момент), но чот слишком много написал уже, завтра опубликую 😜, а вы пока читайте это.
#машинки
Прикрепляю график. Значит что на нём значит:
* Цветное - это новая метрика, а серый - старая.
* Первая строка - индивидуальные запуски, там ничего особо полезного.
* Вторая строка - тоже особо ничего полезного.
* Третья строка - график слева показывает число пройденных трасс, сплошная линия - новая метрика, пунктирная - старая. Самое-самое главное что новая метрика в большем % случаев проходит больше трасс, особенно смотрите на розовую трассу complex - самую сложную трассу (она участвует в гифках в прошлых постах).
* Затем идёт Early finish - это значит насколько быстро пройдена трасса, берётся среднее от всех трасс и рисуется здесь.
* Четвёртая строка - штрафы за удары в стену, первый график - среднее от всех трасс, второй график - максимальное среди всех трасс.
* Пятая строка - среднее пройденное расстояние и минимальное пройденное расстояние.
Сплошная линия показывает медиану, первая закрашенная область показывает значения между 25 и 75 перцентилями, а очень слабо закрашенная область показывает между 10 и 90 перцентилями. Напоминаю, что это 100 разных запусков обучения, и широта области показывает что в этом месте обучение оч нестабильно, и при разных запусках сходится к разной величине.
По графику в первую очередь видно что в среднем стало проходиться больше трас, они в среднем проходятся быстрее. Но вот меньше ударов в стену было у прошлой метрики, но это довольно старый график, я это уже как-то пофиксил, и новая метрика щас вообще очень хорошо по штрафу идёт, практически возле нуля.
(и да, представляете, я отсмотрел и проанализировал минимум 199 таких графиков...)
Ах да, забыл сказать, я называю эту метрику "уровни". Можно её делать многоуровневой, типо на втором уровне я щас экспериментирую с штрафами (три уровня: штраф < 15, штраф < 5, штраф = 0).
Очень горжусь этой метрикой и рад что её нашёл, с ней обучение реально стало лучше.
На самом деле эти два поста - вводная к следующему (тот самый достойный момент), но чот слишком много написал уже, завтра опубликую 😜, а вы пока читайте это.
#машинки
Теперь я научился почти гарантированно обучать нейронку управлять машинкой при сложной физике. Ради чего я и написал два прошлых поста.
В двух прошлых постах шло обсуждение обучения при простой физике, когда нет сил, колёс, инерции итд, а машинка просто безусловно двигается вперёд и безусловно поворачивается по воле нейронки. Даже для такой простой задачи обучение толком не сходится, как можете видеть (уж слишком сложные трассы я наделал видимо).
Ну и я начал исследовать как же добиться того чтобы можно было начинать обучение с простой физики, а заканчивать сложной. Сравнил три разных подхода:
1. Начинать обучение сразу со сложной физики (x = 0.0).
2. Встроить сложность физики в параметр оптимизации и давать очень большую награду за его увеличение.
3. Начинать с простой (x = 1.0), а потом постепенно увеличивать сложность в цикле (x -= 0.02).
Первый вариант изображён синим цветом, по нему видно что он очень плохой, в среднем не проходит трассу, не может научиться быстро ездить, много врезается в стену. Поэтому какое-то сведение к простой физике жизненно необходимо, иначе ничего никогда обучить нельзя. Именно это я и видел в одном из прошлых постов.
Второй вариант изображён зелёным цветом, и его суть в том что сложность физики эволюционируется рядом с параметрами нейросети, и награда за сложную физику даётся очень большая, больше чем прохождение конкретных уровней. Сделал награду такой: если все трассы пройдены, то давать награду за сложность физики, иначе штрафовать за сложность физики, чтобы она была максимально простой. Идея была в том что сначала нейронка обучается проходить все трассы на простой физике, и только как этого достигает, она начинает проходить по сложной физике, причём ей запрещено разучиваться проходить хотя бы одну трассу, иначе она теряет очень много награды.
Этот вариант был самым перспективным, и как мне казалось, гениальным. Я думал что смогу просто встроить в метрику любые подобные параметры, и не надо будет писать ручные циклы, а можно будет делать всё в рамках одного обучения. Но как оказалось, это обучалось очень плохо, доходило до простоты физики около 0.2, и дальше никак не эволюционировало. Как я посмотрел, машинка стала вилять, и из-за медленного прохождения трассы ей перестало хватать квоты на число шагов и поэтому она не могла дальше уменьшать простоту физики, ведь у неё есть требование что все трассы должны проходиться.
Я перепробовал очень много модификаций к этой идее, но ничего не смогло заставить её нормально сходиться.
То как эта метрика работает можно видеть на графике: количество пройденных треков у неё очень хорошее, потому что на оптимизирует до тех пор, пока все треки не пройдутся, но сложность физики она оптимзириует очень плохо, а штраф не в нуле.
Ну и третий вариант, изображён красным цветом, самый тупой: сначала тупо запускаем 100 поколений эволюции на простой физике, затем усложняем физику с шагом 0.02, и эволюционируем максимум 10 поколений, или пока новый скор не будет больше или равен старому. Затем снова эволюционируем 100 поколений чтобы машикна стала лучше ездить.
И это показывает себя лучше всего. Правда видно большую вариацию в скорости сходимости простой физики и в других параметрах (закрашенная красная область), потому что довольно много запусков, которые за первые 100 поколений не научились проходить все трассы, и затем для таких плохих машинок мы начинаем упрощать физику, и им становится всё сложнее и сложнее.
Проблема нестабильности обучения даже при простой физике - задача, которую ещё предстоит решить. Ведь если я её не решу, то не смогу создать агентов, которые обучаются без эволюции, онлайн, как люди и животные. Да, именно такая у меня конечная цель.
Пока у меня гипотеза что основной компьют тратится на обучение зрения, поэтому простая физика так легко дообучается до сложной, поэтому здесь есть идея добавить автокодировщик на зрение. Может тогда стабильность улучшится.
#машинки
В двух прошлых постах шло обсуждение обучения при простой физике, когда нет сил, колёс, инерции итд, а машинка просто безусловно двигается вперёд и безусловно поворачивается по воле нейронки. Даже для такой простой задачи обучение толком не сходится, как можете видеть (уж слишком сложные трассы я наделал видимо).
Ну и я начал исследовать как же добиться того чтобы можно было начинать обучение с простой физики, а заканчивать сложной. Сравнил три разных подхода:
1. Начинать обучение сразу со сложной физики (x = 0.0).
2. Встроить сложность физики в параметр оптимизации и давать очень большую награду за его увеличение.
3. Начинать с простой (x = 1.0), а потом постепенно увеличивать сложность в цикле (x -= 0.02).
Первый вариант изображён синим цветом, по нему видно что он очень плохой, в среднем не проходит трассу, не может научиться быстро ездить, много врезается в стену. Поэтому какое-то сведение к простой физике жизненно необходимо, иначе ничего никогда обучить нельзя. Именно это я и видел в одном из прошлых постов.
Второй вариант изображён зелёным цветом, и его суть в том что сложность физики эволюционируется рядом с параметрами нейросети, и награда за сложную физику даётся очень большая, больше чем прохождение конкретных уровней. Сделал награду такой: если все трассы пройдены, то давать награду за сложность физики, иначе штрафовать за сложность физики, чтобы она была максимально простой. Идея была в том что сначала нейронка обучается проходить все трассы на простой физике, и только как этого достигает, она начинает проходить по сложной физике, причём ей запрещено разучиваться проходить хотя бы одну трассу, иначе она теряет очень много награды.
Этот вариант был самым перспективным, и как мне казалось, гениальным. Я думал что смогу просто встроить в метрику любые подобные параметры, и не надо будет писать ручные циклы, а можно будет делать всё в рамках одного обучения. Но как оказалось, это обучалось очень плохо, доходило до простоты физики около 0.2, и дальше никак не эволюционировало. Как я посмотрел, машинка стала вилять, и из-за медленного прохождения трассы ей перестало хватать квоты на число шагов и поэтому она не могла дальше уменьшать простоту физики, ведь у неё есть требование что все трассы должны проходиться.
Я перепробовал очень много модификаций к этой идее, но ничего не смогло заставить её нормально сходиться.
То как эта метрика работает можно видеть на графике: количество пройденных треков у неё очень хорошее, потому что на оптимизирует до тех пор, пока все треки не пройдутся, но сложность физики она оптимзириует очень плохо, а штраф не в нуле.
Ну и третий вариант, изображён красным цветом, самый тупой: сначала тупо запускаем 100 поколений эволюции на простой физике, затем усложняем физику с шагом 0.02, и эволюционируем максимум 10 поколений, или пока новый скор не будет больше или равен старому. Затем снова эволюционируем 100 поколений чтобы машикна стала лучше ездить.
И это показывает себя лучше всего. Правда видно большую вариацию в скорости сходимости простой физики и в других параметрах (закрашенная красная область), потому что довольно много запусков, которые за первые 100 поколений не научились проходить все трассы, и затем для таких плохих машинок мы начинаем упрощать физику, и им становится всё сложнее и сложнее.
Проблема нестабильности обучения даже при простой физике - задача, которую ещё предстоит решить. Ведь если я её не решу, то не смогу создать агентов, которые обучаются без эволюции, онлайн, как люди и животные. Да, именно такая у меня конечная цель.
Пока у меня гипотеза что основной компьют тратится на обучение зрения, поэтому простая физика так легко дообучается до сложной, поэтому здесь есть идея добавить автокодировщик на зрение. Может тогда стабильность улучшится.
#машинки
dev optozorax
Теперь я научился почти гарантированно обучать нейронку управлять машинкой при сложной физике. Ради чего я и написал два прошлых поста. В двух прошлых постах шло обсуждение обучения при простой физике, когда нет сил, колёс, инерции итд, а машинка просто безусловно…
Я понял что забыл ещё один способ. Одновременно запускать нейронку на сложной и на простой физике, чтобы она училась ездить на обоих одновременно. И возможно, навыки полученные на простой физике, она сможет экстраполировать на сложную. Ведь именно так и происходит с трассами, я проверил, когда заставляешь нейронку ездить только на одной простой трассе, у неё никак не получается уменьшать штраф, а если дать ей много трасс, то неожиданно, происходит абстрагирование и она обучается лучше.
Конечно, чтобы это работало, я подаю нейронке на вход не только текущую картинку, но ещё и разницу между предыдущей и текущей! Чтобы она могла хоть как-то чувствовать различия в физике. А то есть подозрение что никак не обучится, у неё ведь нет памяти, и она не RNN.
Попробовал, и это на самом деле работает (но обучается в 5 раз дольше, так как все трассы проезжаются с разной степенью простой физики). Вот только работает не так хорошо, как хотелось бы: оно учится ездить трасы лучше, чем просто на ванильной сложной физике, но всё-равно делает это слишком долго и итоговый штраф ударов об стену никак не может опустить до 0. Идёт где-то 5 ударов за трассу и всё.
А жаль, тоже был перспективный подход.
#машинки
Конечно, чтобы это работало, я подаю нейронке на вход не только текущую картинку, но ещё и разницу между предыдущей и текущей! Чтобы она могла хоть как-то чувствовать различия в физике. А то есть подозрение что никак не обучится, у неё ведь нет памяти, и она не RNN.
Попробовал, и это на самом деле работает (но обучается в 5 раз дольше, так как все трассы проезжаются с разной степенью простой физики). Вот только работает не так хорошо, как хотелось бы: оно учится ездить трасы лучше, чем просто на ванильной сложной физике, но всё-равно делает это слишком долго и итоговый штраф ударов об стену никак не может опустить до 0. Идёт где-то 5 ударов за трассу и всё.
А жаль, тоже был перспективный подход.
#машинки
This media is not supported in your browser
VIEW IN TELEGRAM
Я обучил нейронку, способную ездить при любых физических условиях.
(в видео есть звук, но лучше сначала прочитать пост)
Делать исследования для прошлого поста я начал как раз для этой цели: я захотел обучить нейронку, способную ездить при разных физических условиях: разном сцеплении, разном ускорении итд. А чтобы это сделать, нужно в обучении замерять нейронку на всех этих условиях одновременно.
В этот раз взял такую нейронку: видит разницу между прошлой картинкой, один скрытый слой с 10 нейронами, функция ReLU, 3 RNN нейронов, знает номер текущего трека, угол обзора 180 градусов, итого 790 чисел в нейронке. Не то, чтобы всё это было категорически необходимо для хорошего обучения, но если уж начал обучать нейронку, то к делу нужно подходить серьёзно. А именно такие параметры подобрал через муторные сравнения 100 запусков с построением кучи графиков.
Как видно из прошлого поста, обучение нейронки с нуля таким образом работало плохо. Ещё хуже работало после добавления разных физических условий. Поэтому я пошёл по старому пути: сначала запускаю обучение на простой физике, она доходит до идеального состояния, когда ноль врезаний и все трассы проходит быстро. Затем постепенно усложняю физику и затем ещё 100 поколений на сложной физике.
После этого этапа включаю обучение сразу по множеству сложностей физики: простая физика + сложная физика + промежуточные между ними. Ещё 100 поколений. Идёт долго, но хорошо, по всем фронтам у машинки получается сходиться к нулевому числу врезаний и быстро проходить трассы.
И вот после этого добавляю к прошлому ещё разные физические условия на 100 поколений, но все физические условия запускаются только на сложной физике, поэтому оставляю ещё простую и промежуточные, чтобы она это не забывала.
И после этого ещё всякие дополнительные обучения, когда мне какая-то часть метрики не нравится (когда начал записывать видео, заметил что нейронка плохо ездит на чистой простой физике, пришлось фиксить, дообучать).
И вот я получил нейронку, которая на каждой трассе врезается либо 1 раз, либо чаще вообще не врезается; умеет ездить при разной сложности физики, и при разных условиях сложной физики. Считаю это вполне хорошим майлстоуном и наверное можно чуток успокоиться с проектом, а то делаю его 24/7 в свободное время)))
К сожалению машинка всё ещё ездит медленней меня, и мне ещё ни разу не удавалось получить машинку быстрее. Не знаю почему так происходит, что-то я точно упускаю. Думаю это будем моим следующим фокусом к исследованиям.
#машинки
(в видео есть звук, но лучше сначала прочитать пост)
Делать исследования для прошлого поста я начал как раз для этой цели: я захотел обучить нейронку, способную ездить при разных физических условиях: разном сцеплении, разном ускорении итд. А чтобы это сделать, нужно в обучении замерять нейронку на всех этих условиях одновременно.
В этот раз взял такую нейронку: видит разницу между прошлой картинкой, один скрытый слой с 10 нейронами, функция ReLU, 3 RNN нейронов, знает номер текущего трека, угол обзора 180 градусов, итого 790 чисел в нейронке. Не то, чтобы всё это было категорически необходимо для хорошего обучения, но если уж начал обучать нейронку, то к делу нужно подходить серьёзно. А именно такие параметры подобрал через муторные сравнения 100 запусков с построением кучи графиков.
Как видно из прошлого поста, обучение нейронки с нуля таким образом работало плохо. Ещё хуже работало после добавления разных физических условий. Поэтому я пошёл по старому пути: сначала запускаю обучение на простой физике, она доходит до идеального состояния, когда ноль врезаний и все трассы проходит быстро. Затем постепенно усложняю физику и затем ещё 100 поколений на сложной физике.
После этого этапа включаю обучение сразу по множеству сложностей физики: простая физика + сложная физика + промежуточные между ними. Ещё 100 поколений. Идёт долго, но хорошо, по всем фронтам у машинки получается сходиться к нулевому числу врезаний и быстро проходить трассы.
И вот после этого добавляю к прошлому ещё разные физические условия на 100 поколений, но все физические условия запускаются только на сложной физике, поэтому оставляю ещё простую и промежуточные, чтобы она это не забывала.
И после этого ещё всякие дополнительные обучения, когда мне какая-то часть метрики не нравится (когда начал записывать видео, заметил что нейронка плохо ездит на чистой простой физике, пришлось фиксить, дообучать).
И вот я получил нейронку, которая на каждой трассе врезается либо 1 раз, либо чаще вообще не врезается; умеет ездить при разной сложности физики, и при разных условиях сложной физики. Считаю это вполне хорошим майлстоуном и наверное можно чуток успокоиться с проектом, а то делаю его 24/7 в свободное время)))
К сожалению машинка всё ещё ездит медленней меня, и мне ещё ни разу не удавалось получить машинку быстрее. Не знаю почему так происходит, что-то я точно упускаю. Думаю это будем моим следующим фокусом к исследованиям.
#машинки
Уважаемые подписчики, а какой у вас процессор? Можете запустить мой бенчмарк?
Я просто думаю насчёт апгрейда компа (а то на нём железо 2014 года), и вот присматриваюсь к разным процессорам. Особенно интересен AMD Ryzen 9 9950X и новый Mac mini на M4 (если он хоть у кого-то есть).
Просто мои эксперименты я запускаю именно на процессоре, на видеокарту очень лень переписывать, и вряд ли оно будет там работать. Арендую 80-ядерный комп на время экспериментов.
Вот ссылка на бенчмарк: https://github.com/optozorax/car_drift/tree/8fbfd0f82f614d9d32bbf78176b77e98affdadcb (скомпилировать через Rust (rust-lang.org) и запустить
Результаты бенчмарка:
* Мой домашний комп - 186с
* Арендуемый 80-ядерный сервер: 18.5с
* M3 Max (16-ядерный): 19.8с
Кидайте пожалуйста в комменты скриншоты вывода (там пишется время), ваш процессор и сколько у него ядер.
UPD: Всем большое спасибо! Можно больше не замерять. Пока выглядит так что я хочу AMD 9950, потому что 7950 уже работает быстрее всего что я видел.
Я просто думаю насчёт апгрейда компа (а то на нём железо 2014 года), и вот присматриваюсь к разным процессорам. Особенно интересен AMD Ryzen 9 9950X и новый Mac mini на M4 (если он хоть у кого-то есть).
Просто мои эксперименты я запускаю именно на процессоре, на видеокарту очень лень переписывать, и вряд ли оно будет там работать. Арендую 80-ядерный комп на время экспериментов.
Вот ссылка на бенчмарк: https://github.com/optozorax/car_drift/tree/8fbfd0f82f614d9d32bbf78176b77e98affdadcb (скомпилировать через Rust (rust-lang.org) и запустить
cargo run --release
, если вы не программист, то не парьтесь), можете почитать код, там ничего опасного не делается: запускается функция с эволюцией, а там 10 эволюций параллельно, в 30 поколений, ничего серьёзного, компиляция дольше займёт. Самое главное что там всё максимально распараллеливается и утилизируются все ядра, поэтому не важно 80 ядер у вас или 4.Результаты бенчмарка:
* Мой домашний комп - 186с
* Арендуемый 80-ядерный сервер: 18.5с
* M3 Max (16-ядерный): 19.8с
Кидайте пожалуйста в комменты скриншоты вывода (там пишется время), ваш процессор и сколько у него ядер.
UPD: Всем большое спасибо! Можно больше не замерять. Пока выглядит так что я хочу AMD 9950, потому что 7950 уже работает быстрее всего что я видел.
Смена парадигмы в обучении #машинки
Итак, мои машинки вообще не могут обучаться сразу со сложной физики, поэтому я выдумывал всякое обучение с простой физики и дальнейшее дообучение на сложную. Но тут я нашёл невероятный метод, который может научиться всему, сразу со сложной физики!
Давайте начнём по порядку, у моей машинки нет памяти, нет знания о своих прошлых намерениях, нет рекуррентных нейронов, в общем для неё каждый кадр - как новая жизнь, с нуля. Это потому что она обычная нейросетка с Dense слоями. Она получает на вход текущее зрение, своё внутреннее состояние и ей нужно предсказать следующее действие в виде: насколько повернуть направо, насколько повернуть налево, насколько сильно сделать газ, насколько сильно тормозить. Ещё это называют задачей регрессии. Для задачи регрессии нейронка обучалась плохо, это красный график. Ну и у во всех моих прошлых постах всегда была именно задача регрессии.
Давайте попробуем задачу классификации? Возьмём 9 самых популярных действий и будем просить нейронку выбрать одно действие, то есть будет 9 выходных нейронов, и будет выбираться то действие, на котором находится максимальное число. Это зелёный график. Уже работает получше, но всё ещё не сходится к решению. Наверное здесь мораль в том, что делать классификацию чуток проще, чем регрессию.
Следующая задача - это задача скоринга. Скорее всего про такое вы не слышали. В этой задаче у нас есть нейронка, которая принимает на вход текущее состояние и предполагаемое действие, а на выход выдаёт 1 (одно) число. Далее мы перебираем среди наших 9 действий и выбираем то, у которого нейронка вернула самое большое число. В науке это называется Energy-based model, потому что это число называют энергией, и выбор оптимального действия на основе энергии называют "оптимизацией энергии". Может быть слышали есть такая JEPA у Яна ЛеКуна? Вот это оно. ЛеКун много писал в твиттере что это самая лучшая архитектура, в том числе и для генерации текста, чем регрессионные трансформеры, потому что почувствовать какой текст правильный намного проще, чем сгенерировать его сразу.
Я давно намотал это на ус и вот только недавно решил проверить его слова, и результат вы можете видеть на графике оранжевым цветом: ОНО РАБОТАЕТ ОФИГЕННО. Понимаете, эта нейронка всего за 200 поколений научилась проходить все трассы, с нулевым штрафом, без всяких ухищрений в виде простой физики, сразу со сложной физики, просто так! НАКОНЕЦ-ТО! Настоящая смена парадигмы.
Ещё вы можете видеть там синий график, это моя первоначальная версия, когда я для каждого действия симулировал мир на 1 шаг с этим дейстивем и подавал ещё и это на вход нейронке. Я думал что без хорошей модели мира это работать не будет, но это оказалось не нужно, оно даже не даёт ничего полезного.
Ещё там есть фиолетовый график, в нём выбирается не максимальное число, а самое близкое к нулю. Была идея в том что так нейронка может закодировать производную и тогда это типо должно легче обучаться. Но на самом деле нет.
В общем я очень очень рад новой парадигме, чувствую себя каким-то первооткрывателем, ибо вот никогда такого не видел для задачи обучения агентов! Теперь всё буду пробовать формулировать в виде energy-based model, может обучение будет сильно проще! Если у вас есть идеи какие подходы можно попробовать - пишите!
PS: Вот почему я в самом начале отказался от вашего дурацкого Reinforcement Learning и выбрал генетические алгоритмы, потому что вы можете себе представить чтобы я такой же эксперимент проводил с RL? Да я бы никогда это не сделал, у меня бы ни ума, ни времени, ни компьюта бы не хватило, чтобы обучить Energy-based model через RL. Они поэтому и не заслужили такую популярность, потому что их хрен обучишь. А для генетического алгоритма я это накодил за полчаса, и во время обучения ему хоть бы хны. Это называется СВОБОДА.
Итак, мои машинки вообще не могут обучаться сразу со сложной физики, поэтому я выдумывал всякое обучение с простой физики и дальнейшее дообучение на сложную. Но тут я нашёл невероятный метод, который может научиться всему, сразу со сложной физики!
Давайте начнём по порядку, у моей машинки нет памяти, нет знания о своих прошлых намерениях, нет рекуррентных нейронов, в общем для неё каждый кадр - как новая жизнь, с нуля. Это потому что она обычная нейросетка с Dense слоями. Она получает на вход текущее зрение, своё внутреннее состояние и ей нужно предсказать следующее действие в виде: насколько повернуть направо, насколько повернуть налево, насколько сильно сделать газ, насколько сильно тормозить. Ещё это называют задачей регрессии. Для задачи регрессии нейронка обучалась плохо, это красный график. Ну и у во всех моих прошлых постах всегда была именно задача регрессии.
Давайте попробуем задачу классификации? Возьмём 9 самых популярных действий и будем просить нейронку выбрать одно действие, то есть будет 9 выходных нейронов, и будет выбираться то действие, на котором находится максимальное число. Это зелёный график. Уже работает получше, но всё ещё не сходится к решению. Наверное здесь мораль в том, что делать классификацию чуток проще, чем регрессию.
Следующая задача - это задача скоринга. Скорее всего про такое вы не слышали. В этой задаче у нас есть нейронка, которая принимает на вход текущее состояние и предполагаемое действие, а на выход выдаёт 1 (одно) число. Далее мы перебираем среди наших 9 действий и выбираем то, у которого нейронка вернула самое большое число. В науке это называется Energy-based model, потому что это число называют энергией, и выбор оптимального действия на основе энергии называют "оптимизацией энергии". Может быть слышали есть такая JEPA у Яна ЛеКуна? Вот это оно. ЛеКун много писал в твиттере что это самая лучшая архитектура, в том числе и для генерации текста, чем регрессионные трансформеры, потому что почувствовать какой текст правильный намного проще, чем сгенерировать его сразу.
Я давно намотал это на ус и вот только недавно решил проверить его слова, и результат вы можете видеть на графике оранжевым цветом: ОНО РАБОТАЕТ ОФИГЕННО. Понимаете, эта нейронка всего за 200 поколений научилась проходить все трассы, с нулевым штрафом, без всяких ухищрений в виде простой физики, сразу со сложной физики, просто так! НАКОНЕЦ-ТО! Настоящая смена парадигмы.
Ещё вы можете видеть там синий график, это моя первоначальная версия, когда я для каждого действия симулировал мир на 1 шаг с этим дейстивем и подавал ещё и это на вход нейронке. Я думал что без хорошей модели мира это работать не будет, но это оказалось не нужно, оно даже не даёт ничего полезного.
Ещё там есть фиолетовый график, в нём выбирается не максимальное число, а самое близкое к нулю. Была идея в том что так нейронка может закодировать производную и тогда это типо должно легче обучаться. Но на самом деле нет.
В общем я очень очень рад новой парадигме, чувствую себя каким-то первооткрывателем, ибо вот никогда такого не видел для задачи обучения агентов! Теперь всё буду пробовать формулировать в виде energy-based model, может обучение будет сильно проще! Если у вас есть идеи какие подходы можно попробовать - пишите!
PS: Вот почему я в самом начале отказался от вашего дурацкого Reinforcement Learning и выбрал генетические алгоритмы, потому что вы можете себе представить чтобы я такой же эксперимент проводил с RL? Да я бы никогда это не сделал, у меня бы ни ума, ни времени, ни компьюта бы не хватило, чтобы обучить Energy-based model через RL. Они поэтому и не заслужили такую популярность, потому что их хрен обучишь. А для генетического алгоритма я это накодил за полчаса, и во время обучения ему хоть бы хны. Это называется СВОБОДА.
dev optozorax
Я увольняюсь с работы и становлюсь ютубером на full time После выхода второго видоса понял что надоело работать обычным программистом, и хочется заниматься чем-то более интересным, например, своими пет-проектами. И потом снимать об этом интересные видео.…
Я увольняюсь с работы и становлюсь ютубером на full time
В этот раз по-настоящему, сегодня мой последний рабочий день на работе.
Как говорится в каждой шутке есть доля правды))) 1 апреля я не был уверен что действительно так поступлю, но за прошедшее время мне удалось решить множество проблем, препятствовавших этому решению, и появилось сильно больше уверенности и понимания. А ещё по работе я закончил свой большой проект, вот буквально вчера всё сошлось на 100%, так что ухожу с чистой душой)
Поэтому ждите! Будут видосы и по порталам, и по машинкам/эволюции, и много чего ещё!
В этот раз по-настоящему, сегодня мой последний рабочий день на работе.
Как говорится в каждой шутке есть доля правды))) 1 апреля я не был уверен что действительно так поступлю, но за прошедшее время мне удалось решить множество проблем, препятствовавших этому решению, и появилось сильно больше уверенности и понимания. А ещё по работе я закончил свой большой проект, вот буквально вчера всё сошлось на 100%, так что ухожу с чистой душой)
Поэтому ждите! Будут видосы и по порталам, и по машинкам/эволюции, и много чего ещё!
dev optozorax
Идея как научить GPT-4 мыслить на примере задач по программированию С момента выхода ChatGPT я много наблюдал за происходящим и понимал что мне не нравится как это работает, как это преподносят и говорят о каком-то AGI, боятся GPT-5 итд. Просто дело в том…
Буквально вчера появилась новая версия o1, и она смогла решить задачу про которую я написал свою статью!
Но пришлось дополнять промт после каждой её ошибки.
Без всех этих промтов она старалась откосить в сторону suffix array. Без него она пыталась сделать решение O(n), со всякими ухищрениями (которые конечно же были неверны). Её ошибки обычно детектировались на самом простом примере: ABB, поэтому я добавил и его в промт. И когда это случилось, то она таки смогла.
Конечно, нельзя отменять секцию "Самокритика" и "Возможные причины" о том что какая-то часть этого уже была в интернете, и поэтому ей повезло додуматься. Плюс она сама пишет что "известная формула". А мне эту формулу пришлось самому выводить((
Это не то мышление, которое я ожидал, но явно большой шаг в правильном направлении! Ну и как я говорил, стакать больше слоёв не получится, вот не зря сделали обучение через RL и размышления. Надеюсь в какой-то момент она начнёт думать как бы опровергнуть свои мысли, тогда сможет сама додуматься до ABB. Ну и конечно ждём добавления ей инструментов, чтобы она смогла сама написать наивную версию, и затем сравнивать себя с наивным решением, запуская свой код.
Ещё большая проблема этой модели - как дать ей возможность думать в течении множества часов, например? Потому что засовывать ВСЁ в контекст - это плохой способ. Надо будет придумывать способы чтобы она смогла ужимать найденные знания в короткий текст и заново запускать себя со свежим контекстом. А это тоже нетривиально, чтобы не потерять все важные мысли и идеи.
Теперь надо искать новую задачу и оценивать модели на ней)
Промпт и решение нейронки можно увидеть тут: https://optozorax.github.io/p/gpt4/#apdeit-posle-vykhoda-o1-6-dekabria-2024
---
(по поводу порталов - перевожу на английский, тут ничего интересного)
Но пришлось дополнять промт после каждой её ошибки.
Без всех этих промтов она старалась откосить в сторону suffix array. Без него она пыталась сделать решение O(n), со всякими ухищрениями (которые конечно же были неверны). Её ошибки обычно детектировались на самом простом примере: ABB, поэтому я добавил и его в промт. И когда это случилось, то она таки смогла.
Конечно, нельзя отменять секцию "Самокритика" и "Возможные причины" о том что какая-то часть этого уже была в интернете, и поэтому ей повезло додуматься. Плюс она сама пишет что "известная формула". А мне эту формулу пришлось самому выводить((
Это не то мышление, которое я ожидал, но явно большой шаг в правильном направлении! Ну и как я говорил, стакать больше слоёв не получится, вот не зря сделали обучение через RL и размышления. Надеюсь в какой-то момент она начнёт думать как бы опровергнуть свои мысли, тогда сможет сама додуматься до ABB. Ну и конечно ждём добавления ей инструментов, чтобы она смогла сама написать наивную версию, и затем сравнивать себя с наивным решением, запуская свой код.
Ещё большая проблема этой модели - как дать ей возможность думать в течении множества часов, например? Потому что засовывать ВСЁ в контекст - это плохой способ. Надо будет придумывать способы чтобы она смогла ужимать найденные знания в короткий текст и заново запускать себя со свежим контекстом. А это тоже нетривиально, чтобы не потерять все важные мысли и идеи.
Теперь надо искать новую задачу и оценивать модели на ней)
Промпт и решение нейронки можно увидеть тут: https://optozorax.github.io/p/gpt4/#apdeit-posle-vykhoda-o1-6-dekabria-2024
---
(по поводу порталов - перевожу на английский, тут ничего интересного)
optozorax.github.io
Идея как научить GPT-4 мыслить на примере задач по программированию — Блог optozorax'а
Предлагаю как можно улучшить GPT-4, чтобы она смогла мыслить и итеративно улучшаться в области решения олимпиадных задач по программированию.
Вы наверное думали что я ничего не делал, а я на самом деле переводил своё первое видео на английский. Старался не просто перевести, а ещё и улучшить, исправить ошибки.
Ух какое классное интро я сделал, и часть про движение порталов сильно переработана. И в музыке более-менее разобрался. В общем повысил свои навыки для будущих видосов уж точно.
В итоге это заняло больше времени, чем ожидал, где больше всего времени ушло на запись английского голоса и борьбу с собой чтобы войти в поток. По итогу сейчас у меня произношение сильно улучшилось, и единственное что осталось - это заново перезаписать весь голос с новым улучшенным произношением (😭😭😭). Господи, как же я мечтаю снова озвучивать на русском, очень тяжело этот английский.
Завтра буду заниматься этим, и где-то в ближайшие пару дней опубликую наконец видос. Но вам не покажу к сожалению((( Потому что не хочу ломать алгоритмы ютуба, чтобы они не обучились показывать это видео русским людям.
После этого надо будет сделать то же самое с моим вторым видосом про порталы, и только тогда смогу начать делать новый... Благо теперь ожидание будет не 2 года. А там эпик, ожидание стоит того.
А новое интро скину в комменты, там 45 секунд с хорошой музычкой и всяким таким.
Ух какое классное интро я сделал, и часть про движение порталов сильно переработана. И в музыке более-менее разобрался. В общем повысил свои навыки для будущих видосов уж точно.
В итоге это заняло больше времени, чем ожидал, где больше всего времени ушло на запись английского голоса и борьбу с собой чтобы войти в поток. По итогу сейчас у меня произношение сильно улучшилось, и единственное что осталось - это заново перезаписать весь голос с новым улучшенным произношением (😭😭😭). Господи, как же я мечтаю снова озвучивать на русском, очень тяжело этот английский.
Завтра буду заниматься этим, и где-то в ближайшие пару дней опубликую наконец видос. Но вам не покажу к сожалению((( Потому что не хочу ломать алгоритмы ютуба, чтобы они не обучились показывать это видео русским людям.
После этого надо будет сделать то же самое с моим вторым видосом про порталы, и только тогда смогу начать делать новый... Благо теперь ожидание будет не 2 года. А там эпик, ожидание стоит того.
А новое интро скину в комменты, там 45 секунд с хорошой музычкой и всяким таким.
dev optozorax
Я решил проблему с заданием "вероятностей", описанную в /184. Постараюсь снова расписать и объяснить что это и зачем нужно. В чём моя проблема? Я хочу иметь какие-то абстрактные чиселки рядом с правилами грамматики, которые будут преобразовываться по каким…
Если кто давно подписан на мой канал, то наверное помнит этот пост (ни комментов, ни эмодзи, дикие были времена). Там у меня есть проблема, которую я сформулировал в виде математической задачи: даны свойства функции, надо придумать функцию, которая им удовлетворяет. Потратил какое-то нетривиальное время на решение этой задачи самому, ещё в 2020м, и написал эту статейку.
Я решил попробовать скормить эту задачу модели ИИ o1, и она придумала крутую функцию, проще чем моя! Воистину, с этими размышляющими моделями мы входим в новую эру.
Написал этот апдейт в блоге, там можно посмотреть на запрос и её решение.
https://optozorax.github.io/p/symmetric-probabilities/#apdeit-ot-21-12-2024
Я решил попробовать скормить эту задачу модели ИИ o1, и она придумала крутую функцию, проще чем моя! Воистину, с этими размышляющими моделями мы входим в новую эру.
Написал этот апдейт в блоге, там можно посмотреть на запрос и её решение.
https://optozorax.github.io/p/symmetric-probabilities/#apdeit-ot-21-12-2024
optozorax.github.io
Симметричные вероятности или Уверенности — Блог optozorax'а
Обычные вероятности задают шанс того что какое-то событие произойдёт. А как описать человеческую уверенность в том что событие произойдёт? А как описать что при условии какого-то события вероятность увеличится? Я предлагаю интересную идею «уверенностей»,…
Я НАКОНЕЦ-ТО ЗАКОНЧИЛ С АНГЛИЙСКИМИ ВИДЕО!!!
И наконец сажусь за новое видео!!!
Знали бы вы как я устал их переводить, и как много от этого прокрастинировал... Самая противная часть - это произношение. Очень тяжело это делается, выматывает сильно. Запинаюсь постоянно, звуки в английском сложные. Затем это всё ещё слушать, ставить нормальные паузы, нормально обрезать. Самым тяжёлым был первый видос, а дальше уже немного проще.
И вот знаете, особенно расстраивает когда после всего этого к тебе в комментарии приходят РУССКИЕ люди и говорят какой у меня плохой акцент, что он меня выдаёт, что мне надо использовать синтез голоса итд. Очень обидно. Причём англичанам норм, это только русские триггерятся на себеподобный акцент. Пожалуйста, НИКОГДА не пишите русским людям про их англ акцент, хорошо?
Я разбил второе видео на две части, плюс там вырезал некоторые моменты (например математика ленты Мёбиуса). А первое видео значительно улучшил и непоправимо улучшил интро. Ну и по мелочам улучшил везде, но старался не упарываться.
Ютуб меня любит, поэтому видео сразу залетели, хотя не так хорошо как на русском.
А вот монетизация на английском языке сильно меньше, чем я ожидал((
Даже не верится что я с этим закончил и что осилил болтать на неродном языке.
И наконец сажусь за новое видео!!!
Знали бы вы как я устал их переводить, и как много от этого прокрастинировал... Самая противная часть - это произношение. Очень тяжело это делается, выматывает сильно. Запинаюсь постоянно, звуки в английском сложные. Затем это всё ещё слушать, ставить нормальные паузы, нормально обрезать. Самым тяжёлым был первый видос, а дальше уже немного проще.
И вот знаете, особенно расстраивает когда после всего этого к тебе в комментарии приходят РУССКИЕ люди и говорят какой у меня плохой акцент, что он меня выдаёт, что мне надо использовать синтез голоса итд. Очень обидно. Причём англичанам норм, это только русские триггерятся на себеподобный акцент. Пожалуйста, НИКОГДА не пишите русским людям про их англ акцент, хорошо?
Я разбил второе видео на две части, плюс там вырезал некоторые моменты (например математика ленты Мёбиуса). А первое видео значительно улучшил и непоправимо улучшил интро. Ну и по мелочам улучшил везде, но старался не упарываться.
Ютуб меня любит, поэтому видео сразу залетели, хотя не так хорошо как на русском.
А вот монетизация на английском языке сильно меньше, чем я ожидал((
Даже не верится что я с этим закончил и что осилил болтать на неродном языке.
This media is not supported in your browser
VIEW IN TELEGRAM
Теперь в Portal Explorer камера умеет телепортироваться через порталы!
Для нового видео добавил эту очень важную и полезную фичу. Так как в программе у меня сцена представлена в первую очередь кодом шейдеров, то не очевидно как можно реализовать такую вещь как телепортация камеры. Я придумал очень хитрый метод - беру предыдущее положение камеры и текущее, и создаю из этого луч. Далее этот луч пускаю в сцену через фрагментный шейдер и узнаю его новое положение после того как он телепортировался, далее использую сложную функцию, позволяющую закодировать float в бинарном представлении для возвращения этого через цвета фрагментного шейдера, и через картинку 2х3 возвращаю три числа нового положения камеры.
В итоге у меня и для телепортации камеры и для рисования сцены используется один шейдер, я просто одним юниформом переключаю это поведение.
Но одним новым положением сыт не будешь - ведь может меняться её ориентация, поворот, масштаб. Поэтому я делаю то же самое ещё с тремя точками рядом с камерой (с отступом 0.001 по всем осям) и далее конвертирую это в матрицу преобразования координат и преобразую матрицу камеры этой матрицей.
Работает невероятно гладко, мне очень нравится как получилось. Как я раньше без этого жил?
Кстати точно таким же методом можно реализовать чтобы камера не проходила сквозь объекты, я такую опцию добавил в программу, но по умолчанию она не включена.
Но есть пара ограничениий - не работает когда за раз проходишь более 10 телепортаций, я поставил такое ограничение, чтобы оно бесконечно не вычислялось. Второе ограничение - не работает со случаем когда портал налетает на камеру - либо в анимациях, либо в когда меняется масштаб или что-то ещё у портала. Я не смог придумать как обойти второе ограничение с помощью моей методики луча, надо наверное придумывать другую методику, из-за которой придётся переписать половину кодовой базы, а мне и так нормально.
Для нового видео добавил эту очень важную и полезную фичу. Так как в программе у меня сцена представлена в первую очередь кодом шейдеров, то не очевидно как можно реализовать такую вещь как телепортация камеры. Я придумал очень хитрый метод - беру предыдущее положение камеры и текущее, и создаю из этого луч. Далее этот луч пускаю в сцену через фрагментный шейдер и узнаю его новое положение после того как он телепортировался, далее использую сложную функцию, позволяющую закодировать float в бинарном представлении для возвращения этого через цвета фрагментного шейдера, и через картинку 2х3 возвращаю три числа нового положения камеры.
В итоге у меня и для телепортации камеры и для рисования сцены используется один шейдер, я просто одним юниформом переключаю это поведение.
Но одним новым положением сыт не будешь - ведь может меняться её ориентация, поворот, масштаб. Поэтому я делаю то же самое ещё с тремя точками рядом с камерой (с отступом 0.001 по всем осям) и далее конвертирую это в матрицу преобразования координат и преобразую матрицу камеры этой матрицей.
Работает невероятно гладко, мне очень нравится как получилось. Как я раньше без этого жил?
Кстати точно таким же методом можно реализовать чтобы камера не проходила сквозь объекты, я такую опцию добавил в программу, но по умолчанию она не включена.
Но есть пара ограничениий - не работает когда за раз проходишь более 10 телепортаций, я поставил такое ограничение, чтобы оно бесконечно не вычислялось. Второе ограничение - не работает со случаем когда портал налетает на камеру - либо в анимациях, либо в когда меняется масштаб или что-то ещё у портала. Я не смог придумать как обойти второе ограничение с помощью моей методики луча, надо наверное придумывать другую методику, из-за которой придётся переписать половину кодовой базы, а мне и так нормально.