Назад к блогу

AlphaCode: как ИИ-система решила задачи соревновательного уровня и что она оставила после себя

AlphaCode: как ИИ-система решила задачи соревновательного уровня и что она оставила после себя

DeepMind создала систему, которая генерирует код на уровне участников реальных соревнований по программированию — это первый такой результат в истории ИИ. Разбираем, как устроен этот конвейер, что содержит открытый датасет CodeContests и почему для инженеров это важнее, чем может показаться на первый взгляд.

DeepMind представила AlphaCode — систему, которая пишет программы на уровне участников соревнований по программированию. По итогам оценки система достигла предполагаемого ранга в пределах верхних 54% участников и заняла уровень примерно медианного участника. Это первый случай, когда система генерации кода на базе ИИ достигла соревновательного уровня производительности.

Вместе с системой DeepMind выпустила набор данных CodeContests на GitHub — задачи, решения и тесты для проверки корректности программ. Ниже — как устроен механизм, откуда он вырос и что из этого следует для инженеров.

Что именно сделала AlphaCode

AlphaCode решает новые задачи, требующие сочетания критического мышления, логики, алгоритмов, программирования и понимания естественного языка. Типичные задачи — например, поиск способов разместить дороги и здания в заданных ограничениях или построение стратегии для нестандартных настольных игр.

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

На этапе оценки для каждой задачи создаётся большое количество программ на C++ и Python — на порядки больше, чем в предыдущих работах. Дальше эти решения фильтруются до 10 кандидатов, которые отправляются на внешнюю проверку. Этот автоматизированный конвейер заменяет собой пробный метод участника: отладку, компиляцию, прохождение тестов и отправку.

Оценка проводилась на 10 недавних контестах Codeforces, каждый из которых новее обучающих данных. Codeforces — платформа, которая привлекает десятки тысяч участников со всего мира.

Как обучалась модель

Модель предобучается на выбранном публичном коде GitHub, а затем дообучается на относительно небольшом собственном наборе соревновательных задач. Ключевое отличие от предыдущих подходов — сочетание крупномасштабных трансформерных моделей с масштабной генерацией и фильтрацией.

Что внутри CodeContests

Датасет содержит задачи и решения по соревновательному программированию, а также обширные тесты, проверяющие корректность проходящих их программ. Задачи собраны с нескольких сайтов: Aizu, AtCoder, CodeChef, Codeforces и HackerEarth. Включены тестовые случаи в виде пар входных и выходных данных, а также правильные и неправильные человеческие решения на разных языках.

Данные представлены в виде протокольный буферов в формате Riegeli; определение и документация полей — в contest_problem.proto. Датасет разделён на три части: Training, Validation и Test. Полный объём — около 3 ГиБ, скачивается утилитой gsutil из Cloud SDK.

Для запуска решений и проверки, решает ли программа задачу, в репозитории есть подкаталог execution: он позволяет прогнать приложенное решение на тестах задачи и получить вердикт о том, решена ли она. Демонстрирует его работу пример solve_example, запускаемый через bazel run. По умолчанию код исполнения использует Python 3.9 и 2.7 по путям /usr/bin/python3.9 и /usr/bin/python2.7 со стандартными библиотеками в /usr/lib/python3.9 и /usr/lib/python2.7. Пути можно изменить флагами, определёнными в py_locations.cc: это нужно, чтобы запускать решения под другой установленной версией Python, если стандартные пути не подходят.

При корректной работе ожидается один вывод Compilation failed и два Compilation succeeded; три Compilation failed указывают на вероятную проблему с версией Python.

Предыстория

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

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

Почему это сделали

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

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

Что это меняет на практике

Датасет даёт исследователям открытый набор задач и решений для машинного обучения. Разделение на Training, Validation и Test позволяет стандартизированно сравнивать модели. Предоставленный код для выполнения решений и проверки корректности упрощает воспроизведение результатов и разработку новых методов.

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

Ограничения и открытые вопросы

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

Отдельное ограничение касается данных и песочницы. Приложенные к задачам решения — и верные, и неверные — не гарантированно компилируются и исполняются так же, как на исходном сайте конкурса: возможны различия версий компилятора, флагов или версий библиотек. Часть решений может не скомпилироваться или вызвать нарушения песочницы, особенно если они неверны. Python, используемый для сборки через bazel и для исполнения внутри песочницы, может различаться. Это значит, что результаты исполнения в песочнице не стоит интерпретировать как точное воспроизведение конкурсной среды.

Поддерживаемой платформой для репозитория CodeContests заявлен Linux с компиляцией через clang. Пользователи MacOS и Windows сообщали об ошибках. Для установки конкретных версий Python в Debian/Ubuntu предлагается команда sudo apt install python3.9 python3.10 python3.11, проверить наличие версии можно через which python3.11.

Источники

Похожее