TransCoder: Революция в автоматическом переводе кода без обучения на парах 0:00
Исследователи из Facebook AI Research представили TransCoder — систему для unsupervised (неконтролируемого) машинного перевода между языками программирования. В отличие от классических компиляторов и правил преобразования, эта модель способна конвертировать код (например, из Python в C++) без предварительного обучения на парах «один и тот же код на разных языках». Автор канала, Янник Килчер, отмечает, что это значительный шаг вперед, позволяющий автоматизировать поддержку устаревших кодовых баз.
Проблематика традиционных систем 1:13
Традиционные инструменты (транскомпиляторы), такие как 2to3 для Python, работают на основе жестко прописанных правил, изменяющих абстрактное синтаксическое дерево (AST). У такого подхода есть существенные недостатки:
- Человеческий фактор: Правила должны быть созданы людьми, что требует времени и глубоких знаний обоих языков.
- Ограниченность: Покрытие всех возможных случаев крайне затруднительно, что приводит к генерации «криптического» или трудночитаемого кода.
- Сложность миграции: Если для Python 2/3 различия минимальны, то при переходе от COBOL к современным языкам типа Java разрыв в конструкциях становится непреодолимым для ручных правил.
По словам Янника Килчера, решение заключается в использовании методов машинного перевода, но основной проблемой здесь выступает дефицит параллельных корпусов данных — больших объемов кода, где один и тот же алгоритм реализован на двух языках.
Как работает TransCoder: архитектурные хитрости 8:44
В отсутствие размеченных данных TransCoder опирается на unsupervised-подход, обучаясь на больших массивах кода на разных языках, не имеющих прямой связи. Основные компоненты системы:
- Общее векторное пространство (Shared Embedding Space): Модель использует один кодировщик (encoder) для всех языков, сопоставляя похожие конструкции в единое пространство. Это достигается благодаря использованию общей токенизации (word pieces), которая «видит» сходства в именах функций или ключевых словах (например,
ifв разных языках). - Маскированное языковое моделирование (Masked Language Modeling): В духе BERT, модель учится восстанавливать пропущенные фрагменты кода. Это заставляет кодировщик понимать структурные зависимости и статистические связи между токенами.
- Denoising Auto-encoder (шумоподавляющий автокодировщик): Декодер обучается восстанавливать исходный код из «зашумленного» (перемешанного, с пропущенными элементами) представления. При этом в начале подается специальный токен языка, указывающий, на каком языке нужно выдать результат.
- Back-translation (обратный перевод): Позволяет дообучать систему «на лету». Модель переводит код из языка A в B, а затем обратно в A. Сравнивая результат с оригиналом, система получает сигнал для улучшения перевода, даже не имея ground truth (истинного ответа).
Оценка качества и результаты 33:03
Для тестирования авторы использовали платформу GeeksforGeeks, где представлены решения одной и той же задачи на разных языках. Качество перевода проверялось не через метрику BLEU (которая плохо работает с кодом), а через unit-тесты.
- Если сгенерированный код проходит те же тесты, что и исходный (на случайных входных данных), он считается верным.
- Использование метода beam search (сохранение нескольких гипотез перевода) позволило модели превзойти существующие коммерческие и open-source системы, основанные на правилах.
- Янник Килчер отмечает, что система «улавливает» контекст: например, если переменная называется
str, модель понимает, что это строка, и использует соответствующие методы, а если имя изменить наerr, модель начнет обрабатывать это как массив символов.
Тем не менее, модель не идеальна. В транскрипте упоминается, что она может ошибаться при переводе перегруженных функций (например, min() в Python против ограниченной Math.min() в Java), что указывает на необходимость контекстного обучения для сложных случаев.