Есть ли рабочая реализация автоматического дифференцирования обратного режима для Haskell?

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

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

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

4 ответов


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

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

Я пытался держать API относительно близко к тому, что Барак Перлмуттер и Джеффри Марк Сискинд пакет причуд, но я не мог устоять перед парой незначительных настроек здесь и там для общности.

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


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

к сожалению, пока Pearlmutter и Сискинд дать перевод на лямбда-исчисление, это не карту в что вы можете сделать для произвольного Хаскелл лямбды, вы не получите право самоанализ свойства и формы типы изменений в перевод вы не получите то, что поддается будучи упакованным в монаду, стрелку или другую структуру управления.

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


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

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

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


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

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

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

посмотреть векторном пространстве библиотека на Hackage для очень элегантного прямого режима автоматического дифференцирования. Сначала может быть не совсем ясно, как его использовать. Прочитать статью об этом!--10-->Красивые Дифференциации Конел Эллиот.