Граница между исполнением программ и градиентной оптимизацией долго ограничивала использование кода как обучаемой научной модели. Обычно каждую модель приходилось вручную переписывать в дифференцируемом фреймворке. Данная работа стоит рядом с исследованиями по дифференцируемым интерпретаторам и нейросимвольному программированию, но отличается тем, что дифференцируемым становится сам интерпретатор, а не отдельные программы. Это открывает путь к автоматической калибровке любых программ, генерируемых, например, языковыми моделями.
Авторы разработали компилятор, который переводит исходный код на Scheme в промежуточное представление ComputeGraph, а затем в модули PyTorch или JAX. Ключевой особенностью является дифференцируемый метациркулярный интерпретатор: интерпретатор Scheme, написанный на самом Scheme, компилируется один раз и затем может исполнять произвольные программы, переданные как данные. Все значения представляются 14-мерными векторами: 10-мерный one-hot тег типа и 4-мерная полезная нагрузка. Куча реализована как словарь с однократной записью, что сохраняет корректность градиентов. Для хвостовых вызовов используется трамплин.
Градиенты, вычисленные через скомпилированный интерпретатор, совпадают с прямым компилированием с точностью до 7×10⁻⁷ по функции потерь на 171 паре (программа, начальное значение). На реальных данных по деградации батарей совместный поиск структуры и параметров восстановил коленообразную структуру деградации из гладкого начального приближения и улучшил экстраполяцию на отложенных данных. В задаче обратного моделирования Эль-Ниньо дифференцируемый интерпретатор позволил оптимизировать функцию правдоподобия фильтра Калмана с 611 параметрами, где безградиентный поиск не справился. Пакетная обработка дала ускорение до 875 раз по пропускной способности.
Работа отличается от соседних подходов тем, что дифференцируемым становится сам интерпретатор, а не отдельные программы. Это снимает необходимость переписывать каждую новую модель в дифференцируемом виде. По сравнению с языково-уровневым автоматическим дифференцированием (как в JAX или Zygote) и с вручную созданными дифференцируемыми интерпретаторами (как TerpreT), здесь достигается комбинация самоприменимости, обратного режима и компиляции. Это расширяет символическую регрессию и нейросимвольный поиск с замкнутых выражений до исполняемых программ с состоянием.
Возможные направления включают перенос интерпретатора на JAX через переписывание трамплина в виде фиксированной длины lax.scan с маскированием. Также перспективно использование MLIR и Enzyme для снижения накладных расходов на одиночные вычисления. Исследование сглаживания ветвлений (smooth interpretation или DiscoGrad) может решить проблему нулевых градиентов для параметров, влияющих только на условия ветвлений. В более широком плане это открывает путь к градиентному самоулучшению программ.
Метод может повлиять на автоматизированное научное моделирование, где языковые модели генерируют гипотезы в виде кода, а дифференцируемый интерпретатор калибрует их параметры. Также он полезен для задач символической регрессии и нейросимвольного синтеза программ.
Следующие шаги включают реализацию дифференцируемого интерпретатора на JAX для использования jit-компиляции и vmap. Также стоит исследовать масштабирование на более крупные программные пространства и проверку устойчивости при неправильной спецификации моделей.
Работа напрямую связана с нерешённой проблемой автоматического синтеза программ: как эффективно искать в дискретном пространстве структур, используя градиентный сигнал. Она показывает, что дифференцирование интерпретатора решает проблему калибровки параметров, но не проблему дискретного поиска структуры, которая остаётся сложной.
Этот раздел адресован автору работы и его коллегам. Соседние работы нашёл смысловой поиск по нашему архиву — не по совпадению слов, а по смыслу. Мы не рецензируем: мы показываем поле вокруг.
Что сделано в работе
Работа представляет компилятор, переводящий подмножество Scheme в дифференцируемые вычислительные графы. Ключевая идея — компилируется сам интерпретатор, а не отдельные программы, что позволяет любой программе, поданной как данные, автоматически получать обратное распространение градиентов. Авторы доказывают корректность градиентов почти всюду и демонстрируют применение для совместного поиска структуры программ и их параметров на реальных научных задачах.
В чём сила
Сила работы в самоприменимом дифференцируемом интерпретаторе, который снимает необходимость вручную переписывать каждую модель в дифференцируемом виде. Это открывает путь к автоматической калибровке любых программ, в том числе генерируемых языковыми моделями.
Куда можно двигаться
Что можно попробовать
Почему это может быть важно
Работа расширяет автоматическое дифференцирование на уровень исполняемых программ с состоянием, что может ускорить научное моделирование и сделать его более гибким, особенно в сочетании с генерацией кода языковыми моделями.
Работы рядом в нашем архиве
Вокруг этой работы в архиве пусто: ближайший разбор всего на 0.50, при обычных 0.64. Похоже, рядом почти не бурили.
Интерпретатор Scheme, написанный на самом Scheme, занимает всего 288 строк кода. При этом он поддерживает замыкания, рекурсию, списки и хвостовые вызовы, достаточные для самоприменимости.
Идея программы, которая может изменять и улучшать саму себя через градиенты, перекликается с концепцией гёделевских машин Юргена Шмидхубера, описанной в его работах по универсальному самоулучшению.