TransCoder: Как обучить ИИ переводить код без примеров?

Yannic Kilcher 147 тыс. 48 мин 3 мин 09.06.2020
Главное

TransCoder: Революция в автоматическом переводе кода без обучения на парах 0:00

Исследователи из Facebook AI Research представили TransCoder — систему для unsupervised (неконтролируемого) машинного перевода между языками программирования. В отличие от классических компиляторов и правил преобразования, эта модель способна конвертировать код (например, из Python в C++) без предварительного обучения на парах «один и тот же код на разных языках». Автор канала, Янник Килчер, отмечает, что это значительный шаг вперед, позволяющий автоматизировать поддержку устаревших кодовых баз.

Проблематика традиционных систем 1:13

Традиционные инструменты (транскомпиляторы), такие как 2to3 для Python, работают на основе жестко прописанных правил, изменяющих абстрактное синтаксическое дерево (AST). У такого подхода есть существенные недостатки:

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

Как работает TransCoder: архитектурные хитрости 8:44

В отсутствие размеченных данных TransCoder опирается на unsupervised-подход, обучаясь на больших массивах кода на разных языках, не имеющих прямой связи. Основные компоненты системы:

  1. Общее векторное пространство (Shared Embedding Space): Модель использует один кодировщик (encoder) для всех языков, сопоставляя похожие конструкции в единое пространство. Это достигается благодаря использованию общей токенизации (word pieces), которая «видит» сходства в именах функций или ключевых словах (например, if в разных языках).
  2. Маскированное языковое моделирование (Masked Language Modeling): В духе BERT, модель учится восстанавливать пропущенные фрагменты кода. Это заставляет кодировщик понимать структурные зависимости и статистические связи между токенами.
  3. Denoising Auto-encoder (шумоподавляющий автокодировщик): Декодер обучается восстанавливать исходный код из «зашумленного» (перемешанного, с пропущенными элементами) представления. При этом в начале подается специальный токен языка, указывающий, на каком языке нужно выдать результат.
  4. Back-translation (обратный перевод): Позволяет дообучать систему «на лету». Модель переводит код из языка A в B, а затем обратно в A. Сравнивая результат с оригиналом, система получает сигнал для улучшения перевода, даже не имея ground truth (истинного ответа).

Оценка качества и результаты 33:03

Для тестирования авторы использовали платформу GeeksforGeeks, где представлены решения одной и той же задачи на разных языках. Качество перевода проверялось не через метрику BLEU (которая плохо работает с кодом), а через unit-тесты.

Тем не менее, модель не идеальна. В транскрипте упоминается, что она может ошибаться при переводе перегруженных функций (например, min() в Python против ограниченной Math.min() в Java), что указывает на необходимость контекстного обучения для сложных случаев.

💬 Цитаты

«В программировании важно не только то, что код делает, но и то, как называются вещи.»

Янник Килчер 46:18

«Даже если вы можете написать правила, результат часто получается криптическим и трудным для понимания.»

Янник Килчер 3:19
👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
Transcompiler
Инструмент для конвертации исходного кода из одного высокоуровневого языка в другой.
Unsupervised Translation
Машинный перевод, обучающийся на неразмеченных данных без прямой связи между парами текстов.
Beam Search
Алгоритм поиска, который при генерации последовательности сохраняет несколько наиболее вероятных вариантов.
Back-translation
Метод обучения, при котором модель переводит данные в целевой язык, а затем обратно, чтобы оценить точность.
📊 Цифры
⚖️ Другая сторона
Искусственный интеллект TransCoder Yannic Kilcher Unsupervised Learning