Дальше авторы начали делать разные эксперименты над Qwen-2.5-Math-7B, OLMo-2 и Llama-3.1-8B. Чтобы выделить бенчмарки, на которых проверять результаты, они стали смотреть на PPE на разных бенчах и выделили три штуки: MATH-500 и MinervaMath как контаминированные (+23-25% после Spurious RL), LiveMathBench как неконтаминированные (улучшения нет). Первым делом, авторы посмотрели на перплексию ответов и промпта с ответом на четырёх чекпах во время Spurious RL. Выяснился интересный факт — по мере обучения, у Qwen-2.5-Math-7B перплексия ответов падает (модель считает их более вероятными), но перплексия промптов растёт (модель считает промпты менее вероятными). У Llama и OLMo — перплексия везде растёт. Вывод: во время spurious RL с рандомными ревардами модель __разучается__ генерить текст, но если модель уже видела ответы, то хоть модель и разучается генерить, метрики всё равно растут. Получается, что Spurious RL обучает не генерализации, а меморизации, вспоминая полузабытые факты из сфт/претрейна. В статье они это называют memorization shortcut. Затем берут две модели — до и после spurious RL — и, используя path patching, заменяют активации базовой модели активации модели после RLVR. Там два интересных файндинга — во первых, замена активаций из аттеншна вытягивает меньше скора, чем замена активаций MLP (то есть, MLP действительно хранит в себе знания), а во-вторых, на 18-20 слоях есть пик по восстановлению качества. Эти слои авторами назвали Functional Anchor — почему так, скажу позднее. Дальше на модели после RLVR накладывают Logit Lens и смотрят на Jensen-Shannon Divergence (как KLD, но симметричная — в математику не вникал :)) между финальными логитами после полного форварда и промежуточными логитами из Logit Lens. Это позволяет нам посмотреть, насколько модель определилась в генерации конкретного токена и как много конкретный блок докидывает в резидуал стрим трансформера, чтобы сгенерировать финальный токен*. Здесь появляется ещё одно различие между Llama и Qwen — у лламы увеличение JSD монотонное, а у квена есть конкретные слои, на которых JSD максимальное (21-22). Эти слои авторы назвали Structural Adapters — они, грубо говоря, поворачивают пространство эмбеддингов в сторону генерации конкретного токена, то есть там хранятся знания модели, необходимые для генерации токена. Что же такое Functional Anchors и Structural Adapters? Первое — это те слои, в которых модель решает, какую конкретно задачу модель будет делать. Это как Task Vectors, только у них находили слои, где кодировалась математика, перевод и прочие прикладные задачи, а тут FA выбирают между меморизацией и генерацией, которая происходит в слоях Structural Adapter. То есть, если простыми словами — FA нужны для решения, вспоминать или генерить, А SA нужны, чтобы вспоминать, что генерить. *Примерно как в Do Llamas Work in English. Вторая статья, которую я разобрал у себя в канале, между прочим.