Переводчик сидит в зале совещаний и переводит каждое слово. Но вот он замечает, что его перевод можно улучшить, если он будет учиться на своих ошибках. Он начинает записывать, какие фразы вызвали непонимание, и корректирует их. Через час его перевод становится точнее, а совещание проходит быстрее. Так и здесь: интерпретатор языка Scheme, скомпилированный один раз, может исполнять любые программы, переданные ему как данные, и при этом вычислять градиенты, чтобы улучшать эти программы.
Раньше каждую научную модель приходилось вручную переписывать в дифференцируемом виде, чтобы применять градиентную оптимизацию. Это как если бы для каждого нового текста нужно было нанимать нового переводчика. Теперь же сам переводчик становится обучаемым: он не просто переводит, но и понимает, как изменить текст, чтобы он стал лучше. Авторы работы создали компилятор, который переводит исходный код на Scheme в промежуточное представление ComputeGraph, а затем в модули PyTorch или JAX. Ключевая особенность в том, что дифференцируемым становится сам интерпретатор, а не отдельные программы.
Внутри интерпретатора все значения представляются 14-мерными векторами: 10-мерный one-hot тег типа и 4-мерная полезная нагрузка. Куча реализована как словарь с однократной записью, что сохраняет корректность градиентов. Для хвостовых вызовов используется трамплин, то есть цикл, который заменяет глубокую рекурсию и не даёт стеку расти. Благодаря этому градиенты, вычисленные через скомпилированный интерпретатор, совпадают с прямым компилированием с точностью до 7×10⁻⁷ по функции потерь на 171 паре (программа, начальное значение).
На реальных данных по деградации батарей совместный поиск структуры и параметров восстановил коленообразную структуру деградации из гладкого начального приближения и улучшил экстраполяцию на отложенных данных. В задаче обратного моделирования Эль-Ниньо дифференцируемый интерпретатор позволил оптимизировать функцию правдоподобия фильтра Калмана с 611 параметрами, где безградиентный поиск не справился. Пакетная обработка дала ускорение до 875 раз по пропускной способности.
Переводчик теперь не просто переводит, а учится на каждом слове. Он может автоматически калибровать параметры моделей, генерируемых языковыми моделями, в научных и инженерных задачах. Это как если бы переводчик, получив черновик от писателя, сам доводил его до совершенства, не требуя переписывания с нуля. Возвращаясь к началу: переводчик, который учится на каждом слове, превращает час совещания в минуты, а науку делает быстрее и точнее.
Интерпретатор Scheme, написанный на самом Scheme, занимает всего 288 строк кода. При этом он поддерживает замыкания, рекурсию, списки и хвостовые вызовы, достаточные для самоприменимости.
Идея программы, которая может изменять и улучшать саму себя через градиенты, перекликается с концепцией гёделевских машин Юргена Шмидхубера, описанной в его работах по универсальному самоулучшению.