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

Источник: https://www.youtube.com/watch?v=xTzFJIknh7E
Канал: Yannic Kilcher
Опубликовано: 09.06.2020

---

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

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

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

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

*   **Человеческий фактор:** Правила должны быть созданы людьми, что требует времени и глубоких знаний обоих языков.
*   **Ограниченность:** Покрытие всех возможных случаев крайне затруднительно, что приводит к генерации «криптического» или трудночитаемого кода.
*   **Сложность миграции:** Если для Python 2/3 различия минимальны, то при переходе от COBOL к современным языкам типа Java разрыв в конструкциях становится непреодолимым для ручных правил.

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

### Как работает TransCoder: архитектурные хитрости
[[JUMP: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 (истинного ответа).

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

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

*   Если сгенерированный код проходит те же тесты, что и исходный (на случайных входных данных), он считается верным.
*   Использование метода beam search (сохранение нескольких гипотез перевода) позволило модели превзойти существующие коммерческие и open-source системы, основанные на правилах.
*   Янник Килчер отмечает, что система «улавливает» контекст: например, если переменная называется `str`, модель понимает, что это строка, и использует соответствующие методы, а если имя изменить на `err`, модель начнет обрабатывать это как массив символов.

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