Переводчик учится на каждом слове. Он сидит в зале совещаний и переводит. Но вместо того, чтобы просто переводить, он запоминает, какие фразы вызвали непонимание, и меняет их. Через час его перевод становится точнее. Так и здесь: интерпретатор языка Scheme, скомпилированный один раз, может исполнять любые программы, переданные ему как данные, и при этом вычислять градиенты, чтобы улучшать эти программы.
Раньше каждую научную модель приходилось вручную переписывать в дифференцируемом виде, чтобы применять градиентную оптимизацию. Это как если бы для каждого нового текста нужно было нанимать нового переводчика. Теперь же сам переводчик становится обучаемым: он не просто переводит, но и понимает, как изменить текст, чтобы он стал лучше. Авторы работы создали компилятор, который переводит исходный код на Scheme в промежуточное представление ComputeGraph, а затем в модули PyTorch или JAX. Ключевая особенность в том, что дифференцируемым становится сам интерпретатор, а не отдельные программы.
Переводчик теперь не просто переводит, а учится на каждом слове. Он может автоматически калибровать параметры моделей, генерируемых языковыми моделями, в научных и инженерных задачах. Это как если бы переводчик, получив черновик от писателя, сам доводил его до совершенства, не требуя переписывания с нуля.
Интерпретатор Scheme, написанный на самом Scheme, занимает всего 288 строк кода. При этом он поддерживает замыкания, рекурсию, списки и хвостовые вызовы, достаточные для самоприменимости.
Идея программы, которая может изменять и улучшать саму себя через градиенты, перекликается с концепцией гёделевских машин Юргена Шмидхубера, описанной в его работах по универсальному самоулучшению.