Есть ли работающая реализация автоматического дифференцирования обратного режима для 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 для получения хорошего ускорения в сложной численной оптимизации.


person Ian Fiske    schedule 30.04.2010    source источник
comment
Возможная альтернатива: я добился немалых успехов в оптимизации больших систем (например, 10000-мерных) с прямым AD. (Код был C++, но в основном написан в чисто функциональном стиле.) Хитрость заключалась в том, чтобы использовать разреженность моей проблемы, чтобы я мог использовать разреженный тип для представления производных. Это было быстрее, чем обратная версия AD для моей задачи (опять же написанная на C++, но совсем не чистая).   -  person sigfpe    schedule 30.04.2010
comment
Действительно? Мне интересно, как выполнить такую ​​​​вещь. Есть зацепки?   -  person Ian Fiske    schedule 01.05.2010


Ответы (4)


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

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

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

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

person Edward KMETT    schedule 16.05.2010
comment
Внедрение целой библиотеки для того, чтобы дать правильный ответ на этот вопрос — теперь это самоотверженность! - person C. A. McCann; 17.05.2010
comment
И я это ценю!! Хотя я надеюсь, что вклад Эдварда будет полезен и другим людям, кроме меня. - person Ian Fiske; 21.05.2010
comment
Я сейчас собираю большую библиотеку, включающую как прямой, так и обратный режимы, а также смешанные режимы для гессиана. Я буду держать вас в курсе. - person Edward KMETT; 25.05.2010
comment
С тех пор я добавил более новый пакет с более широким охватом, hackage.haskell.org/package/ad , который обеспечивает как прямой, так и обратный режим, а также комбинаторы, которые интеллектуальны при переключении вперед и назад. - person Edward KMETT; 06.06.2010

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

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

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

person Edward KMETT    schedule 30.04.2010
comment
Что вы имеете в виду под всем Haskell? Вы не можете ожидать различения всех функций. Вы хотите различать только функции, написанные для определенного интерфейса, такого как Num. Перлмуттер указал на некоторые проблемы с вложенными производными, но это не препятствие для реализации обратного AD, которое можно использовать для решения реальных проблем. Проблемы, которые я обнаружил с обратным AD в Haskell, были другими. Для эффективности вам нужно явное совместное использование в деревьях и сохранение состояния в дереве по мере того, как вы просматриваете его. Все это можно реализовать на чистом Haskell, но это неэффективно. - person sigfpe; 30.04.2010
comment
Я согласен с тем, что мне не нужно различать какие-либо возможные программы на Haskell — только более типичные числовые целевые функции. Вы где-нибудь делитесь своим EDSL онлайн? Какие подпроблемы он может различать? - person Ian Fiske; 30.04.2010
comment
@Ian: Я позабочусь о том, чтобы отполировать его и опубликовать, когда у меня будет время простоя. @ user207442: Вы можете сделать общий доступ видимым с помощью ряда средств, я обычно использую StableNames, что позволяет мне избежать многих уродств, связанных с использованием чего-то явно монадического или использования явных привязок let_ в стиле oleg. Возможно, я попробую еще раз, так как мне приходилось решать эти проблемы в других настройках с тех пор, как я в последний раз смотрел на AD в обратном режиме. - person Edward KMETT; 02.05.2010

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

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

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

person C. A. McCann    schedule 30.04.2010
comment
Спасибо за ваш ответ в любом случае. По крайней мере, вы меня успокоили, что я ничего не упустил ;) - person Ian Fiske; 01.05.2010

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

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

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

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

person luqui    schedule 01.05.2010
comment
Спасибо, но ключевое преимущество обратного режима — дешевый градиент. Это очень важно в моих приложениях, которые требуют градиентов функций тысяч переменных. Я посмотрю на прямой режим и посмотрю, соответствует ли он моим потребностям, но я не оптимистичен. - person Ian Fiske; 01.05.2010
comment
Хорошо, я просмотрел газету и посмотрел видео по адресу vimeo.com/6622658, и я думаю, что вектор- космос может быть многообещающим. Но я до сих пор не понимаю, как использовать его для вычисления производных функций. Документации, кажется, не хватает, или я медленный. Может быть, я открою еще один вопрос для этого. - person Ian Fiske; 01.05.2010
comment
Для плотных многомерных задач прямой режим не подходит. Если вы оптимизируете гибкую симуляцию со 100 000 переменных, это просто невозможно в прямом режиме. Но это только умножает сложность моделирования жидкости на небольшой постоянный коэффициент в обратном режиме. Даже для 100 000 переменных! (Если у вас достаточно памяти для хранения дерева выполнения.) - person sigfpe; 01.05.2010