Существует ли какая-либо работающая автоматическая дифференциация в обратном режиме для Haskell?

Ближайшая реализация в Haskell, которую я видел, - это прямой режим в http://hackage.haskell.org/packages/archive/fad/1.0/doc/html/Numeric-FAD.html.

Ближайшие связанные исследования, похоже, являются обратным режимом для другого функционального языка, связанного с Схемой, в http://www.bcl.hamilton.ie/~qobi/stalingrad/.

Я вижу обратный режим в Haskell как вид святого грааля для множества задач, надеясь, что он сможет использовать вложенные данные Haskell parallelism, чтобы получить хорошее ускорение при сильной численной оптимизации.

Ответ 1

В ответ на этот вопрос я загрузил пакет с именем ad в Hackage для обработки автоматической дифференциации в обратном режиме в Haskell.

Внутри он использует трюк от Энди Гилла Канзаса Лавы, чтобы наблюдать за совместным использованием ленты, которую он записывает для целей обратной пропаганды, и использует брендинг типа уровня, чтобы избежать путаницы чувствительности.

Я пытался поддерживать API относительно близко к пакету Barak Pearlmutter и Jeffrey Mark Siskind fad, но я не мог удержаться от нескольких незначительных трюков здесь и там для общности.

Мне все равно нужно пройти и закончить оставшиеся нереализованные компиляторы fad, выяснить, как создать обратную схему AD башни, подтвердите, что я не испортил свое воспоминание об основном исчислении и обеспечил приятный API для использования этого подхода для получения локальных контрольных точек в обратном режиме в другой AD-программе в прямом режиме, но я вполне доволен тем, как все продвигалось до сих пор.

Ответ 2

У нас есть куча реализаций AD в прямом режиме (у меня даже есть одна в моей библиотеке моноидов!), но обратный режим AD для всего Haskell кажется неразрешимым.

К сожалению, в то время как Pearlmutter и Siskind дают перевод для лямбда-исчисления, он не отображает того, что вы можете сделать для произвольных ящериц Haskell, вы не получаете правильных свойств самоанализа и не учитываете способ изменения формы типов в переводе вы не получаете что-то, что поддается тому, чтобы быть упакованным в монаду, стрелу или другую структуру управления.

У меня был доступ к нему через ряд обменов электронной почтой с Pearlmutter, но в конечном итоге лучшее, что я смог получить, это решение AD с обратным режимом для небольшого EDSL в Haskell, а не решение для самого Haskell.

Ответ 3

Не то, чтобы я знал. Я знаю, что some Haskell люди заинтересованы в автоматической дифференциации, но некоторые быстрые копания нашли немного больше, чем короткие, указав обратный режим; Я ожидаю, что вы уже нашли тот же материал, что и я.

Я также отмечаю, что пакет fad и проект Stalingrad, который вы нашли, на самом деле являются работой того же два люди, и по крайней мере профессор Перлмуттер отправил в haskell-cafe список рассылки. Возможно, вам захочется обратиться к нему напрямую за его работой - возможно, что у него что-то происходит или на него нанесли серьезные препятствия, пытаясь реализовать обратный режим AD.

Извините, я не смог найти ничего полезного; если кто-то еще хочет копать дальше, по крайней мере, ссылки, приведенные выше, являются отправной точкой.

Ответ 4

Я думаю, что вперед - это путь в Хаскелл. Вы не должны делать обратный режим на произвольных функциях, как указал Эдвард. Но вы ответили, что сможете сделать это на определенных ограниченных функциях. И указанные ограничения могут привести к легкому переходу. Например. если у вас есть функция:

foo :: Num a => a -> a -> a

Затем вы можете создать экземпляр a с дифференцируемым типом и таким образом дифференцировать foo в прямом режиме.

Смотрите библиотеку vector-space в Hackage для очень элегантной автоматической дифференциации прямого режима. Возможно, не совсем ясно, как использовать его вначале. Прочтите статью об этом, Красивая дифференциация от Коналла Эллиотта.