Борис опять
16K subscribers
1.46K photos
72 videos
35 files
1.51K links
life = curiosity + irreducible noise

Whois: https://t.me/boris_again/3400

Лс: @btseytlin
Download Telegram
Если вас зацепило, то советую читать статью. Она написана отлично, и даже такой профан в RL как я понял большую часть. Далее несколькими постами я расскажу конкретно про ключевые поинты работы.
Можно ещё позалипать в видосики результатов.

Пиксельные человечки достигают уровня разума игроков в шутеры и используют spawn camping:
https://youtu.be/lTmL7jwFfdw?t=54

Человечки мочат друг друга, хотя им выгодно работать вместе:
https://youtu.be/lTmL7jwFfdw?t=424

Человечки смогли договориться и все получили награды:
https://youtu.be/lTmL7jwFfdw?t=486

Человечки занимаются бесполезной работой, прям как в армии РФ:
https://youtu.be/lTmL7jwFfdw?t=583

Самое интересное, логическая задача:
https://youtu.be/lTmL7jwFfdw?t=651

Человечки делают рандомную фигню до тех пор, пока у них не получается то, что хотелось:
https://youtu.be/lTmL7jwFfdw?t=769
# Обзор Open-Ended Learning 2: пространство заданий

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

Определим терминологию, чтобы не запутаться:
1. Мир — уровень в игре. Включает в себя платформы, по которым можно ходить, освещение и динамические объекты (желтые шары, красные пирамидки, места появления игроков).
2. Игрок — пиксельный человечек, который играет в игру.
3. Агент — черный ящик, который управляет игроком и стремится выполнить цели игрока. Именно его мы обучаем.
4. Цель игрока — состояние, в котором он получает награду.
5. Игра — набор целей игроков.
6. Задание — набор (мир, игра, действия игроков).

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

Цели в данной работе бинарные: держать желтый шар, стоять на красном полу, не быть в поле зрения синего игрока, итд. Цель или достигнута или нет. Далее из нескольких простых целей составляются более сложные цели через операторы И, ИЛИ, например: (держать желтый шар И стоять на красном полу) ИЛИ (синий игрок не держит желтый шар). Это представление называется дизьюнктивной нормальной формой (DNF). Крутость таких целей в том, что агент учиться выбирать, какую из опций (разделенную ИЛИ) проще выполнить. Это порождает планирование. Например, в игре захват флага, возникает сложная стратегия: агенту бывает выгодно упустить награду сейчас и сосредоточиться на устранении противника, чтобы заработать побольше очков потом. Второй прикол DNF целей: их можно записать как матрицу и подать на вход агенту.

С мирами и целями понятно, переходим к действиям. В Reinforcement Learning мы учим агентов выдавать последовательность действий в зависимости от мира и игры. В каждый момент времени агент получает на вход наблюдения: какие пиксели он видит на экране, держит он что-то в руке или нет, какая у него цель в игре. Важно, что в данной стстье агент не получает информацию о награде: он должен сам понять, достигнута цель или нет. Выход агента это действие: ничего не делать, повернуть камеру, идти, прыгнуть, итд.

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

В итоге мы получаем огромное пространство возможных игр. Изменяя миры мы можем делать игру проще или сложнее. Изменяя цели мы можем варьировать кооперативность, баланс, сложность стратегий. Нам нужно только научиться выбирать из этого огромного пространства такие игры, чтобы они были полезны для обучения агентов, но об этом в следующих постах.
# Обзор Open-Ended Learning 3: оценка агентов

Итак, у нас есть возможность динамически создавать разные игры. Как оценить, насколько хорошо играет агент? Как выбрать лучшего?

Мы хотим получить таких агентов, которые:
1. Проваливают как можно меньше заданий.
2. Хорошо выполняют как можно больше заданий.
3. Отдают предпочтение общим способностям, а не узкой компетентности.

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

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

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

Вывод: одного числа недостаточно. Нужно рассмотреть распределение наград агента. Авторы предлагают считать нормализованные перцентили наград. Алгоритм такой:
1. Запускаем популяцию (несколько разных агентов примерно одного уровня) играть в одни и те же несколько игр.
2. Для каждого агента получили его очки в каждой игре, а так же самый лучший результат в этой игре среди всей популяции.
3. Для каждой игры делим очки агента на самый лучший результат в этой игре. Вместо наград непонятного масштаба получили числа от 0 до 1 - нормализованные награды.
4. Для каждого агента считаем с 0 по 50 перцентили нормализованных наград.

Напомню, что перцентиль q это такое число, что q% чисел в последовательности меньше или равны этому числу, а (100-q)% больше этого числа. Например перцентиль 50% это медиана: половина чисел больше этого числа, половина меньше.

На выходе мы получили для каждого агента 50 чисел - перцентили его нормализованных наград. Их несложно интерпретировать. Перцентиль 0 показывает сколько очков агент получил в самой сложной игре: это наш минимум. Прцентиль 50 это медианная награда агента, его "типичное качество". А первое ненулевое число k среди перцентилей показывает, что агент получает хоть какую-то награду в (100-k)% игр. В итоге мы получили вектор, который описывает всё распределение наград агента.

Если надо сравнить двух агентов можно сделать так: агент А лучше агента Б тогда, когда агент А во всех перцентилях не хуже агента Б и хотя бы в одном лучше (на языке шарящих: агент А лучше агента Б если А Парето-доминирует Б).

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

Качество лучшего агента задает планку сложности при создании заданий для для следуюшего поколения, но об этом в следующем посте.
Борис опять pinned «# Обзор: Open-Ended Learning Leads to Generally Capable Agents, Deepmind 2021 В этой статье пиксельные человечки бегают по процедурно генерируемым мирам, то играют в прятки, то пытаются решить, искать им лучше желтую пирамидку или красный шар. Что из этого…»
Релевантная пикча.

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

https://astralcodexten.substack.com/p/classifieds-thread-82021
Например
# Обзор Open-Ended Learning 4/4: Population based training

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

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

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

Как же авторы динамически увеличивают сложность заданий для каждого поколения? К сожалению у меня нет ответа. Это единственный пробел данной статьи, хотя вполне возможно, что я просто не понял. Авторы упоминают, что пространство миров у них гладкое. Значит каждый мир можно записать как вектор, и распределение миров тоже. Если строго по тексту, то изменение этого распределения упоминается только в работе эволюционного алгоритма. Остается предположить, что миры агентов постепенно усложняются при мутации.

На этом разбор "Open-Ended Learning..." закончен. Я не покрыл ещё много клевых фишек из статьи (там короче нейроны Кохонена, которые визуализируют внутреннее состояние агента и выглядит это прямо как МРТ мозга!), но их там слишком много. Пока можно сказать, что RL это впечатляющий и поражающий воображение трехэтажный набор костылей.
# Унижаем Deep Learning

Всё время слышим про чудеса машинлернинга, но сегодня всё по-другому. В эфире велосипеды от Бориса и сегодня мы будем ощущать своё превосходство.

Итак, задача бинарной классификации. Даны признаки X и ответы Y и нужно понять, какая связь между X и Y. Данные в таблице:
x0 | x1 | y
-----------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0

Ответ: если единиц нечетное количество y=1, иначе y=0.

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

Машинное обучение на такой подвиг неспособно.

При смене значения любого признака результат меняется на противоположный, то есть причинно-следственная связь очевидна. Однако корреляция между каждым X и Y нулевая, как и другие меры связи. Если вы построите регрессию, то все её коэффициенты будут нолями, как будто зависимости нет. Один из тех случаев, когда по факту явления связаны, но статистические тесты этого не показывают.

Если мы применим линейную модель, например логистическую регрессию, то она ожидаемо научится выдавать всегда 1, или всегда 0, и мы получим точность около 50%. Можно подумать, что ей нехватает данных, поэтому я пробовал сгенерить для неё большой датасет, но результат такой же.

Возможно дело в линейности. Возьмем KNN, нелинейнее некуда. Но он не умеет экстраполировать. Если ему подать на вход датасет с повторами, то он получит точность 100% на трейн сете и 0% на тестовом сете. Если же без повторов, то просто 0% на обоих. Аналогично ведет себя RandomForest.

Последним я мучал перцептрон. В теории глубокая нейронная сеть способна выучить любую функцию, и наверняка sum(x) % 2 == 0 ей по силам. Однако на практике оказывается, что он моментально переобучается под трейн сет. То есть он выучивает какую-то зависимость, возможно просто запоминает весь трейн сет, но выдает полную чушь на тестовом сете. Я так и не придумал, как ему объяснить, что надо учить вот эту вот истиную зависимость, а не что-то там супер-сложное. Получается, что у DL проблема не такая как у остальных алгоритмов: перцептрон способен выучить нужную функцию, но он не способен понять, какой она должна быть.

Короче говоря я не нашел ни одной модели, которая могла бы хотя бы обучиться на первых трех строках из таблицы выше и потом правильно классицифировать следующую. И это уровень плинтуса. В действительности хочется получить модель, которая смогла бы экспраполировать зависимость при добавлении нового x. Для человека это не составляет ни малейшего труда, но для наших ML инструментов это тупик. Можно заключить, что текущие ML инструменты это машинки для поиска корреляций и только, они не способны к логике.

Приглашаю всех желающих потыкать примеры в коллабе:
https://colab.research.google.com/drive/1Lb7cuVcPTcDPSzBT5NBC6IuN-FSK9gXS?usp=sharing

Теперь вопрос к умным ребятам: не я первый это придумал, поэтому наверняка кто-то уже пытался научить нейросетку функции модуля. Может вы знаете статью, где кому-то удалось? Наверняка есть какой-то трюк, который решает проблему. Если же нет, то звучит как вызов: если научить нейросетку работать бинарными векторами, это будет почти способность к построению логических конструкций, а там и до ИИ недалеко.
👍2😁1
Борис опять pinned «# Унижаем Deep Learning Всё время слышим про чудеса машинлернинга, но сегодня всё по-другому. В эфире велосипеды от Бориса и сегодня мы будем ощущать своё превосходство. Итак, задача бинарной классификации. Даны признаки X и ответы Y и нужно понять, какая…»
Выучить функцию модуло, кстати, возможно, если всё свести к регрессии:
https://github.com/HStrand/modulo/blob/master/modulo.ipynb

Однако это не тоже самое. Одно дело выучить прикидку функции по 8000 примерам. Другое дело "вот тебе три примера, зависимость на них очевидна второкласснику, что будет в следующем примере?". И вот для решения такой задачи у нас нет ни одного инструмента, а значит скайнет пока даже не в зародыше
👍1
Forwarded from 🏆 Data Feeling | AIeron (Алерон Миленькин)
pTZKz.png
29.8 KB
#Трюк №16

Вы же тоже часто смотрите на важность признаков в вашей модели? Иначе как понять, на что обращает внимание ваша модель?!

И вот вы смотрите на гистограмму важности признаков, и что дальше?) Что с этим делать?) Ничего?


Вот вам трюк🏂 - заранее генерируем случайный признак и далее смело выбрасываем все признаки, которые рандомный признак отсек. Взлет скора модели гарантирован✈️


Почему это работает? Если случайных признак оказался важнее имеющихся, то скорее всего в них нет никакой полезной информации - разумнек их убрать из модели.
Внезапно лекцию про метрики ML моделей, которую я читал в Иннополисе, выложили в открытый доступ:
https://www.youtube.com/watch?v=R4hbxLDsEJo
# Я присоединился к команде Яндекс.Толоки в качестве ML исследователя.

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

Скажу только, что ковидная статья неождианно быстро окупилась и действительно повлияла на получение трех офферов, один из которых я в итоге принял.

Until we meet again
Мемес года
Лайфхак: как не быть чертовой мразью.

Появилась отличная идея по работе? Хочется написать её коллеге, но близится конец рабочего дня? Напиши долбанное отложенное сообщение на следующее утро, мать твою.

Набираешь текст, зажимаешь кнопочку "отправить", в выпадающем меню выбираешь "отложенное сообщение" и выставляешь следующее утро. Вуаля, ты восхитителен: не продлил себе с коллегой рабочий день на два часа!
👍1
Да, черт возьми, да. Бекендеры давно изобрели эту схему: пишешь код локально, исполняешь всегда в докере.
Forwarded from STACK MORE LAYERS (Alexander Mamaev)
🐍 Мысли в слух про Enviroment и Conda 📦

Я пользуюсь Anaconda достаточно долгое время, примерно с того дня, когда я заинтересовался Data Science как таковым.
Мне его представили как удобный инструмент, чтобы устанавливать библиотеки на рабочую машину.
Я пользовался windows и тогда мне это показалось безумно удобным инструментом, ведь многие пакеты не хотели просто так устанавливаться под виндой.
Шли годы, я оброс бородой и опытом, давно променял windows на более удобные платформы, но по прежнему продолжал пользоваться conda.
Я спрашивал себя - а что есть действительно наилучший способ организации рабочего окружения? Почему я должен отказаться от conda?
Внятного ответа в интернете я найти так и не смог, везде были свои за и против. Кто-то находится в лагере venv, кто-то в virtualenv.

Но недавно мне пришло осознание и я понял как сделать лучше, а самое главное - зачем.

Главная особенность conda заключается в том, что в отличие от pip оно так же поставляет собранные бинарники под любые задачи, то есть вы можете устновить ffmpeg, openblas, openfst и другие вещи прямо из конды, хотя сами эти пакеты могут быть совсем не связаны с питоном. В то же время pip и средства виртуализации venv и ему подобные позволяют вам "изолировать" именно ваше питоновское окружение, это означат, что проблемы с конфликтами бинарных пакетов все еще остаются.

Во многом виртуализация conda меня устраивала, но недавно произошло важное событие - я перешел на macbook m1, соответсвенно архитектура процессора полностью поменялась, больше никаких x86, только arm. И соответсвенно мои попытки скачать какие-то бинарные пакеты из conda не увенчались успехом. Их просто не существует, нет никаких вариантов поставить их от туда. Придется скачивать source code и собирать их самостоятельно с помощью cmake и gcc. Естественно делать это просто на тачке - глупо. Завтра я перееду на другой ноут - придется вспоминать все инструкции и процесс инсталяции, что не есть хорошо.

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

Какие плюсы из этого есть?
- Реальная изоляция окружения, то есть у вас по умолчанию проекты никогда не будут конфликтовать между собой, вы не забудете поменять env, ведь у каждого проекта он свой, а если и забудете, будет не проблематично откатить его назад.
- Фиксация всех изменений окружения. В dockerfile вы сами прописываете все инструкции того, куда что скачать, как что распаковать и это не забудется, и не придется писать отдельную инструкцию в confluence и любую другую систему вики.
- Легкая переносимость между устройствами - если вы меняете рабочую станцию или просто хотите создать аналогичное окружение на сервере, вы просто пуллите последнюю версию dockerfile и делаете билд
- Прозрачное понимание проблем сборки - если что-то не собралось под вашу платформу, вы не попадаете в патовую ситуацию, что раз уж нет бинарника - вы ничего не можете сделать, вы можете просто прописать свои "правильные" инструкции для сборки под эту платформу.