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

Просто потому, что файл WAV не означает, что он поддерживается JavaSound. WAV-файл представляет собой формат контейнера, а фактические необработанные данные (образцы) могут быть в разных форматах, включая подписанный / неподписанный PCM на разных битовых глубинах или может быть в сжатом формате. Я не могу найти таблицу совместимости для JavaSound, но таблица совместимости для JMF (которая даст вам хорошую идею) здесь:

http://www.oracle.com/technetwork /java/javase/formats-138492.html

Решение состоит в том, чтобы преобразовать WAV-файл в более общий формат, например 16-разрядный PCM, с помощью программы преобразования, которая может читать ваш текущий файл (SoX, Adacity, QuickTime, ProTools и т. Д.).

Чтобы быть более точным, вы можете захотеть создать WAV-файл с глубиной до 16 бит (маленький конец - это значение по умолчанию, поэтому, если вы не видите, не волнуйтесь), стерео или моно должны работать. Вы также можете рассмотреть общие частоты дискретизации, такие как 44,100 Гц или 48 000 Гц (большинство компьютеров в настоящее время должны поддерживать обе скорости, но первая является более распространенной).

13
задан Ian Fiske 30 April 2010 в 13:53
поделиться

4 ответа

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

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

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

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

55
ответ дан 1 December 2019 в 17:19
поделиться

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

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

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

5
ответ дан 1 December 2019 в 17:19
поделиться

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

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

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

2
ответ дан 1 December 2019 в 17:19
поделиться

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

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

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

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

2
ответ дан 1 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: