Post content
В современном агентском reinforcement learning with verifiable rewards (RLVR) есть ярко выраженная проблема credit assignment: допустим SWE агент пытается решить долгую и сложную задачу, тратит на это миллионы токенов и сотни шагов. В конце ему приходит сигнал от verifier-а, решена задача или нет. Проблема в том, что на протяжении предыдущих шагов могли быть как и очень хорошие действия, так и бесполезные и даже вредные. Классический GRPO считает Advantage для всей траектории целиком, и в итоге все токены у нас равнозначны, их вероятности во время обучения мы двигаем в одну сторону (Advantage здесь – это величина, показывающая, насколько мы хуже/лучше средней траектории, соответственно мы хотим закреплять поведение, если A > 0, и штрафовать, если A < 0). Проблема усугубляется, когда наград становится несколько, что на практике возникает часто. И действительно, легко придумать целое множество дополнительных сигналов, которое хотелось бы использовать: сделать reproduce бага; запустить тесты для проверки; линтер, чтобы соблюсти код стайл; избежать повторяющихся тул колов + кучу каких-то рубрик (Вот интересная работа DR Tulu: Reinforcement Learning with Evolving Rubrics for Deep Research, где рубрик много, и они меняются по ходу обучения). Пока что классические методы все равно дают невероятные результаты, которые мы с вами видим в SWE на протяжении последнего полугода, но все равно в будущем очень пригодятся методы увеличения количества сигнала из каждой траектории, ведь задачи будут становится все дольше и дольше, и для них получение ролаута будет занимать не минуты, а, скажем, часы. Мне это направление очень нравится и думаю, что в ближайшее время мы увидим не одну работу, направленную в эту сторону. Прежде чем сказать про нашу работу, расскажу еще про один стандартный подход, который позволяет оценивать Advantage для промежуточных шагов. Мы можем остановиться на промежуточном шаге и сделать из него K ролаутов до конца, таким образом получить оценку, а как в среднем мы решаем задачу из этого состояния, применив такое-то действие. Сделав такое для всех действий из траектории, можно получить очень точное понимание, какие действия хорошие, а какие – плохие (известная работа здесь – VinePPO). Но здесь есть другая большая проблема – нам нужно делать большое кол-во ролаутов только для того, чтобы точно оценить advantage, так еще и на многих шагах. Для сценариев, которые мы описывали выше это огромная трата компьюта. С другой стороны, можно делать всякие оптимизации, строить деревья состояний для группировки, определять состояния, из которых наиболее важно делать много ролаутов, а на остальные забить – вариантов довольно много. В статье Blockwise Advantage Estimation for Multi-Objective RL with Verifiable Rewards (BAE) мы попробовали вообще избежать дополнительных ролаутов и посмотреть на частный и довольно простой случай RLVR, когда у нас много наград, но за каждую отвечает отдельный кусок траектории. На самом деле, агентских задач подобного рода довольно много. Например, мы даем N попыток решить задачу, и генерация модели состоит из (analysis + answer)_1, (reflection + analysis + answer)_2 и тд до N. Или SWE агент, который сначала воспроизводит баг, потом ищет нужный файл для фикса, потом пишет правку, запускает тесты и тд. Мы предложили вместо того делать ролауты из одного стейта, объединить похожие из них из текущей группы. Если агент воспроизвел баг, так ли важно, как он это сделал? Добрался каким-то путем, в результате чего он видит трейс ошибки – отлично, давайте будем считать это за эквивалентные стейты. Думаю, что у подобного взгляда на задачу вполне может быть развитие и дальше в более агентские задачи. В статье есть всякие примеры для математики, насколько такая оценка смещена относительно истинной и много других замеров. В результате получилось +- сравняться с sota методом, который отдельно тюнил структуру награды под конкретную задачу, причем если эту структуру поменять, то метод может и развалиться в отличие от BAE.