Есть ли в Haskell работающая реализация автоматического дифференцирования в обратном режиме? - PullRequest
13 голосов
/ 30 апреля 2010

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

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

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

Ответы [ 4 ]

54 голосов
/ 16 мая 2010

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

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

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

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

5 голосов
/ 30 апреля 2010

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

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

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

2 голосов
/ 01 мая 2010

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

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

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

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

2 голосов
/ 30 апреля 2010

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

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

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

...