惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
Simon Willison's Weblog
Simon Willison's Weblog
B
Blog
V
Visual Studio Blog
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
S
SegmentFault 最新的问题
博客园 - 司徒正美
博客园 - 【当耐特】
T
Tenable Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
宝玉的分享
宝玉的分享
N
Netflix TechBlog - Medium
S
Secure Thoughts
Hugging Face - Blog
Hugging Face - Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
IT之家
IT之家
Google DeepMind News
Google DeepMind News
Last Week in AI
Last Week in AI
大猫的无限游戏
大猫的无限游戏
PCI Perspectives
PCI Perspectives
H
Hackread – Cybersecurity News, Data Breaches, AI and More
阮一峰的网络日志
阮一峰的网络日志
P
Privacy International News Feed
N
News and Events Feed by Topic
H
Hacker News: Front Page
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
F
Full Disclosure
Google Online Security Blog
Google Online Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
H
Heimdal Security Blog
Project Zero
Project Zero
C
CERT Recently Published Vulnerability Notes
MyScale Blog
MyScale Blog
AI
AI
月光博客
月光博客
C
Cyber Attacks, Cyber Crime and Cyber Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
TaoSecurity Blog
TaoSecurity Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
CXSECURITY Database RSS Feed - CXSecurity.com
Spread Privacy
Spread Privacy
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
SecWiki News
SecWiki News
C
Cisco Blogs
The Last Watchdog
The Last Watchdog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром T-TOPS: Как распутать гордиев узел проекта после выхода в прод (меч не понадобится) Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать
2026-04-15 · via Все публикации подряд на Хабре

Уровень сложностиСложный

Время на прочтение11 мин

Охват и читатели9.7K

Кейс

Привет, Хабр! На связи Олег и Камилла из команды применения больших языковых моделей ecom.tech. Сейчас мы разрабатываем сервис по генерации кода с учетом внутренних конвенций и правил. В процессе работы над этим сервисом мы часто сталкиваемся с ситуацией, когда агент сначала генерирует код, а затем пишет к нему тесты, которые хоть и выглядят правильно, но не всегда соответствуют внутренним конвенциям и покрывают необходимый функционал исходного кода.

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

Мы задались вопросом: можно ли адаптировать маленькую LLM, например  Qwen3-4B-Instruct, для генерации качественных unit-тестов для разработки бэкенда на Kotlin с учетом внутренней специфики наших котлинистов? И решили мы это сделать с помощью весьма экзотического способа дообучения LLM – эволюционного алгоритма. А потом ещё и сравнить этот алгоритм со ставшими уже классикой методами дообучения LLM: SFT и GRPO.

Как можно дообучать LLM?

Когда говорят о дообучении модели, часто смешивают цель обучения и технику обновления параметров. Порой можно услышать: «Я дообучаю модель с помощью LoRA», но это не совсем корректно. SFT и RL – это разные способы оптимизировать модель. А LoRA – это эффективный метод снижения числа обучаемых параметров при дообучении, который можно использовать, например, вместе с SFT.

RL-подходы вроде GRPO (по сути, основная рабочая лошадка для обучения всех современных LLM) имеет смысл рассматривать, когда хочется оптимизировать модель не только по эталонным ответам, но и по функции вознаграждения (reward). 

Демонстрация отличия PPO от GRPO (взято из статьи)

Демонстрация отличия PPO от GRPO (взято из статьи)

В нашем случае это особенно актуально, потому что качество unit-теста нельзя полностью свести к «похожести на эталон»: нас интересует не только форма кода, но и его практическая полезность. При этом RL-сценарии чувствительны к настройке системы поощрений (reward shaping): если награда (reward) слабо связана с реальной полезностью теста, оптимизация может становиться нестабильной.

Эволюционные алгоритмы или голодные игры начинаются

В стандартных RL-методах мы исследуем пространство действий – фактически прощупываем ландшафт целевой функции через призму одной точки в пространстве параметров. А что если попробовать нечто совсем иное? Исследовать сам ландшафт параметров напрямую – сразу множеством точек и как-то агрегировать полученную информацию от каждой из них? Как раз это и предлагает сделать алгоритм Evolution Strategies (далее ES). Чтобы лучше понять разницу, стоит взглянуть на рис. 2, где θ обозначает параметры модели, которые оптимизируются в процессе обучения.

 Слева: RL исследует через действия, справа: ES через возмущения параметров

 Слева: RL исследует через действия, справа: ES через возмущения параметров

Давайте возьмём несколько (допустим, 30) экземпляров модели. Затем к каждому параметру модели независимо добавим гауссовский шум. Проделаем это с каждым экземпляром. Грубо говоря, получим 30 вариантов «возмущенной» базовой модели. Получаем то самое множество точек в пространстве.

Сэмплирование окрестности параметров и формирование направлений обновления

Сэмплирование окрестности параметров и формирование направлений обновления

Попросим каждую возмущенную модель дать ответ и вычислим награду. Отнормируем награды и используем их как веса при соответствующих шумах: чем выше награда, тем больший вклад данного шума в обновление. Введем константы α и σ для контроля силы и масштаба шума – аналоги механизма learning rate. Обновляем параметры базовой модели, прибавляя взвешенную сумму возмущений. Обновлённая модель становится «базовой» для следующей итерации t. Таким образом, агрегируем информацию от того самого множества точек на каждом шаге цикла обучения. Вот и все, собственно. 

Псевдокод алгоритма представлен на рис. 4. Интуитивно алгоритм работает следующим образом: мы создаем несколько случайно возмущенных версий текущей модели, оцениваем их качество и сдвигаем параметры в сторону тех изменений, которые привели к лучшим результатам. Таким образом, вместо вычисления градиента, ES использует усреднение информации от множества случайных направлений в пространстве параметров.

Эволюционный алгоритм (взято из статьи)

Эволюционный алгоритм (взято из статьи)

К слову, этот класс алгоритмов вовсе не нов. Он был освещен в оригинальной работе ещё в далёком 1973 году. Затем его воскресили уже в эпоху deep learning – статья от OpenAI в 2017 году. С помощью ES они обучали роботов в среде MuJoCo, решали задачи Atari и при этом достигли результатов, сопоставимых с популярным тогда RL-методом TRPO. Размер моделей в тех экспериментах достигал всего лишь 1 млн параметров.

Авторы отметили, что ES позволяет не тащить тяжёлый груз в виде градиентов, активаций и состояния оптимизатора в памяти, что значительно снижает потребление ресурсов. Кроме того, алгоритм легко поддается распараллеливанию. 

И вот настала эра LLM... и очередной этап воскрешения! На этот раз Cognizant AI Lab в 2025 году решила стряхнуть пыль с ES-алгоритмов. В статье авторы рассказывают, как с помощью ES дообучали LLM, размеры которых (в отличие от экспериментальных моделей OpenAI) достигали порядка 10 млрд параметров. При этом авторы показывают своими экспериментами, что ES позволяет успешно дообучить LLM при крайне небольшой популяции «возмущенных моделей» – всего 30 особей (для сравнения: в ранних реализациях ES использовались популяции от 10 000 и выше). Такой вот своеобразный «парадокс благословения размерности» в эволюционных алгоритмах (подробнее в этой статье).

Если говорить про практические плюсы ES, то они выходят за рамки банальной экономии ресурсов и удобной параллелизации. Во-первых, метод оказывается менее чувствительным к выбору базовой модели: там, где RL может просто не сойтись без аккуратного подбора стартовой точки, ES даёт стабильный прогресс. Во-вторых, он заметно реже страдает от reward hacking. Вместо того, чтобы находить один «читерский» способ максимизировать награду (как это часто делает RL), ES оптимизирует распределение решений, которое сложнее взломать. В-третьих, он не деградирует на длинных последовательностях. Наконец, ES проще в использовании и даёт более воспроизводимые результаты без бесконечного тюнинга и дорогих перезапусков.

В статье наиболее подробно освещаются эксперименты по задаче Countdown, где необходимо составить арифметическое выражение из заданных чисел и операций. Использовались instruct-модели от 0.5B до 7B параметров из семейств Qwen и Llama. Алгоритм ES смог обойти лучшие варианты RL на 10–20 % по accuracy.

 Эксперимент по задаче Countdown

 Эксперимент по задаче Countdown

В задаче Math reasoning ES (дообучали Qwen2.5-Math-7B) также демонстрирует сопоставимые  результаты с 7B-SOTA решениями (на момент написания оригинальной статьи) или даже превосходит их.

 Эксперимент по задаче Math reasoning

 Эксперимент по задаче Math reasoning

Неплохо ES справляется и со сложными задачами-головоломками (Судоку, ARC-AGI бенчмарк).

Эксперимент с Судоку

Эксперимент с Судоку

Теперь немного о деталях реализации данного алгоритма:

1) Тензоры шума, прибавляемые к параметрам LLM, не хранятся целиком – сохраняется лишь random seed, из которого тензор можно детерминировано восстановить. Это существенно экономит память. 

2) Шум добавляют и вычитают (для восстановления исходных весов) на лету, слой за слоем. Поэтому пиковое потребление GPU-памяти определяется операцией с самым большим слоем (размер тензора шума = размеру слоя). 

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

4) Все «возмущенные модели» генерируют ответы в детерминированном (greedy decoding) режиме. Случайность при генерации исключена. Любое различие в качестве ответов между моделями в популяции объясняется исключительно различием весов.

Детали реализации

Детали реализации

Отдельно стоит отметить, что хранение шума через random seed в сочетании с greedy decoding позволяет гибко манипулировать артефактами обучения. Забыли включить сохранение чекпоинтов? Не хватило места на диске? Не беда: если логировать награды, полученные от каждой модели в популяции, можно восстановить веса дообученной ES-модели на любой итерации. Правда, для этого придётся навайбкодить написать свой код. Репозиторий авторов пока не предоставляет такой возможности «из коробки». 

Важно также отметить, что исследование ES, представленное в статье, ориентировано исключительно на модели, уже прошедшие стадии pretrain. Насколько ES-методы эффективны для обучения LLM с нуля, исследователям ещё предстоит выяснить (очень на это надеемся).

Описание данных

После всей этой теории нам захотелось ответить на прикладной вопрос: что вообще произойдет в реальной задаче генерации unit-тестов для разработки бэкенда на Kotlin, если мы будем использовать ES для дообучения LLM? 

На вход модель получала не просто код тестируемого класса, а полный контекст, необходимый для осмысленной генерации тестов. Предположим, нам нужно написать unit-тест для класса CarService (пример полного контекста представлен на рис. 9).

Полный контекст (на примере класса CarService)

Полный контекст (на примере класса CarService)

На выходе мы хотели получать готовый файл с unit-тестами. Датасет собирался в два этапа. Сначала из репозитория выделяли unit-тесты по naming patterns. Затем LLM-agent на базе qwen-code с доступом к репозиторию собрал вокруг тестируемого класса весь контекст, который нужен для корректной генерации тестов. В итоге формировались пары вида: контекст → файл с тестами. Всего удалось собрать 1500 примеров (1300 train, 200 test). Для оценки использовали две метрики: Coverage и CodeBLEU. Подробнее о них. 

Метрики

Первая метрика - Coverage. В нашем эксперименте Coverage - это не runtime coverage, а functional coverage: пересечение публичных функций, покрытых в эталонном и сгенерированном тестовом файле.
То есть метрика отвечает не на вопрос «сколько строк кода реально исполнилось», а на вопрос «насколько генерация вообще попала в тот же публичный функционал, что и эталонный тестовый файл». Именно это различие для нас было критичным. 

Пример расчета coverage

Пример расчета coverage

Вторая метрика - CodeBLEU, предложенная в 2020 году исследователями из Microsoft Research. В отличие от классического BLEU, который сравнивает тексты на уровне n-грамм, CodeBLEU учитывает специфику кода. Итоговый скор – это взвешенная сумма четырёх компонент: стандартного n-gram match (BLEU), взвешенного n-gram match, syntax match и dataflow match.

CodeBLEU частично наследует BLEU и учитывает совпадение n-грамм между сгенерированным кодом и эталоном. Но в отличие от стандартного BLEU, различные токены имеют разные веса: ключевые слова языка программирования (например, return, if, int) получают больший вес.

Таким образом, метрика учитывает не только совпадение токенов, но и их важность для корректности кода, см. рис. ниже:

CodeBLEU N-gram match (взято из статьи)

CodeBLEU N-gram match (взято из статьи)

Для учета синтаксической структуры код сначала преобразуется в абстрактное синтаксическое дерево (AST). Затем из дерева извлекаются все поддеревья, которые представляются в виде S-выражений. Сравнение проводится на уровне структуры: имена переменных и конкретные значения игнорируются, а учитывается только форма конструкции. Например, выражения return a + b и return x + y считаются эквивалентными с точки зрения синтаксиса. Синтаксический скор определяется как доля поддеревьев эталона, найденных в сгенерированном коде, см. рисунок:

CodeBLEU Syntactic AST Match (взято из статьи)

CodeBLEU Syntactic AST Match (взято из статьи)

Для учета семантики используется граф потока данных (Data Flow Graph, DFG), в котором вершины соответствуют переменным, а рёбра показывают, откуда переменная получает своё значение. Например, в выражении x = a + b переменная x зависит от a и b. Такие зависимости формируют структуру вычислений программы. Чтобы избежать влияния имён переменных, они нормализуются (например, var_0, var_1). Далее сравниваются зависимости между переменными в эталонном и сгенерированном коде.

Семантический скор определяется как доля совпадающих зависимостей:

CodeBLEU Semantic Data-flow Match (взято из статьи)

CodeBLEU Semantic Data-flow Match (взято из статьи)

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

Одна загвоздка: оригинальный фреймворк поддерживает лишь ограниченный набор языков. Kotlin в этот клуб, увы, не приняли. К счастью, вайбокодинг в наше время помогает решить многие проблемы быстро и безболезненно! С помощью tree-sitter-kotlin внедрили поддержку Kotlin для компонент Syntax Match, Dataflow Match и добавили список ключевых слов языка.

Итак, метрика CodeBLEU отвечает на вопрос «Насколько код похож на хороший тест по форме?», а метрика Coverage: «Насколько этот тест вообще касается нужной логики?».

Для эксперимента мы использовали довольно простую reward-функцию - взвешенную сумму CodeBLEU и Coverage с весами 0.6 и 0.4 соответственно. Больший вес дали CodeBLEU, потому что он лучше отражал качество самой генерации. Coverage оставили как важную компоненту практической полезности тестов. 

Запускаем эксперимент

Код проекта “Evolution Strategies at Scale” полностью открыт - эксперименты авторов можно воспроизвести и гибко адаптировать под свои нужды. Авторы активно поддерживают репозиторий и развивают решение. В частности, доступна версия с инференсом на vLLM (узкое место классического ES), которая ускоряет обучение в 10 раз по сравнению с оригинальной реализацией. Именно эту версию мы взяли за основу.

Что по железу: мы использовали кластер из 8 H100.  

ES-алгоритмы только набирают популярность и пока рассматриваются скорее как экспериментальные  - специализированных фреймворков и оптимизированных пайплайнов для них ещё нет. На одном GPU в процессе дообучения можно эффективно использовать лишь одну копию LLM.

Стоит отметить, что авторы на каждой итерации проходились по всему обучающему датасету (для Countdown у них было всего 200 примеров). Наш датасет содержит ~1300 примеров, поэтому ждать ответы от 30 моделей для  каждого из них на 1000 итераций было невероятно затратно по времени (даже при максимальной утилизации каждого GPU).  В силу этих ограничений - мы внедрили батчинг: на каждой итерации случайным образом выбирались 32 примера из обучающей выборки. Уже после 500 итераций был заметен устойчивый прирост по всем метрикам на валидационном датасете. Далее темп роста стал скромнее, но тренд на валидации продолжал идти вверх. К концу обучения CodeBLEU вырос на +21.3%, а Coverage - на +18.6% относительно базовой модели. 

Неплохие результаты для экспериментального метода, правда?

Результаты

Результаты

Лучший результат показал ES-алгоритм: максимальный coverage (0.7381) и лучший итоговый reward. 

Результаты метрик оказались выше показателей даже для Qwen3-Coder-480B! 

SFT демонстрирует высокий CodeBLEU, но крайне низкий coverage - модель генерирует синтаксически корректные тесты, которые практически не покрывают логику. GRPO приводит к деградации обеих метрик, что указывает на нестабильность оптимизации в данном сетапе.

Катастрофическое забывание

Увы, за всё приходится платить... Буквально пару месяцев назад вышла статья от исследователей UC Berkeley, посвящённая побочным эффектам ES-дообучения LLM - в частности, проблеме катастрофического забывания (catastrophic forgetting) ранее усвоенных навыков. Авторы воспроизвели эксперименты с дообучением из оригинальной работы “Evolution Strategies at Scale: LLM Fine-Tuning Beyond Reinforcement Learning”, а также провели аналогичное обучение стандартным GRPO  для моделей масштаба 1B и 1.5B параметров.

Цель была простой: проверить для двух методов, как изменились общие способности дообученных моделей по сравнению с базовой. Для оценки использовали бенчмарк HellaSwag - задачу на выбор логичного продолжения описания бытовой ситуации. Результаты оказались удручающими: с каждой новой итерацией ES accuracy модели на HellaSwag падала - наблюдалась значительная деградация. В то же время при обучении GRPO модель лишь немного колебалась, сохраняя свои показатели на бенчмарке. При этом accuracy на целевой задаче дообучения у GRPO была сопоставима с ES.

Визуализация деградации

Визуализация деградации

В чём причина? Авторы указывают на «плотный» характер обновления весов в ES.

Уже из самой формулы ES-алгоритма

Формула обновления параметров в ES-алгоритме

Формула обновления параметров в ES-алгоритме

видно, что на каждой итерации ненулевое изменение получает буквально каждый параметр модели. Для подтверждения своей гипотезы они анализировали разреженность и норму Фробениуса (или l2-норму) для матриц обновлений весов. 

Расчет нормы Фробениуса и разреженности 

Расчет нормы Фробениуса и разреженности 

Выяснилось, что разреженность обновлений ES на каждой итерации крайне низкая (почти все веса имеют дельту обновления >10-6), а масштаб нормы изменений на несколько порядков больше, чем у GRPO. По мнению авторов, это подтверждает гипотезу о том, что градиентные методы оптимизации концентрируют изменения в подпространствах, непосредственно связанных с целевой задачей, минимизируя влияние на остальные навыки. ES же вносит глобальное смещение весов, существенно отклоняя дообученную модель от базовой, что и приводит к катастрофическому забыванию.

Катастрофическое забывание

Катастрофическое забывание

Мы решили проверить эти выводы на собственном эксперименте и оценили нашу ES-дообученную модель на бенчмарке GPQA - наборе научных вопросов аспирантского уровня сложности (Graduate-Level Google-Proof Q&A).

К сожалению (или к счастью), выводы подтвердились: в формате zero-shot снижение accuracy относительно базовой модели в среднем составило  2.1%, а с Five-shot CoT - 5.3%. 

Катастрофическое забывание на нашем qwen3-4b-Instruct-2507

Катастрофическое забывание на нашем qwen3-4b-Instruct-2507

Причём наблюдался характерный паттерн: деградация в five-shot chain-of-thought режиме прослеживалась заметно активнее (польза от five-shot упала на 41–72%), что указывает на частичное ухудшение способности модели к in-context learning. Специализация на генерации структурированного кода, по всей видимости, сместила внутренние представления модели, ослабив способность к лаконичному и точному научному рассуждению.

Evolution Strategies – мощная альтернатива традиционному RL


И мы убедились в этом лично! На нашей собственной задаче ES показал отличный прирост метрик и те же закономерности, что и в оригинальной статье. Это доказывает главное: подход реально работает и отлично переносится на новые кейсы. Да, пока есть шероховатости, но темпы развития AI таковы, что элегантные решения текущих проблем - лишь вопрос ближайшего времени.

Конечно, если вычислительные ресурсы для вас не проблема, а малейшая деградация общих способностей модели недопустима - старый добрый RL в лице того же GRPO остается непоколебим и выдает качественные результаты. В общем, эволюция эволюционных (простите за тавтологию) алгоритмов разворачивается прямо на наших глазах. Запасаемся попкорном - самое интересное в мире AI только начинается!

А пока можно почитать статью о применении ES в alignment, в соавторах которой Xin Qiu из Cognizant AI Labs, и посмотреть стрим с ним - где он подробнее расскажет об экспериментах и поделится планами по дальнейшим исследованиям ES.