Мне трудно оптимизировать программу, которая по большей части использует функцию ad
s conjugateGradientDescent
.
По сути, мой код представляет собой перевод кода старых документов, написанного на Matlab и C. Я не измерял, но этот код выполняется с частотой несколько итераций в секунду. У меня порядка минут на итерацию...
Код доступен в этих репозиториях:
Рассматриваемый код можно запустить, выполнив следующие команды:
$ cd aer-utils
$ cabal sandbox init
$ cabal sandbox add-source ../aer
$ cabal run learngabors
Используя средства профилирования GHC, я подтвердил, что спуск на самом деле является той частью, которая занимает большую часть времени:
(интерактивная версия здесь: https://dl.dropboxusercontent.com/u/2359191/learngabors.svg)
-s
говорит мне, что производительность довольно низкая:
Productivity 33.6% of total user, 33.6% of total elapsed
Из того, что я собрал, есть две вещи, которые могут привести к более высокой производительности:
Распаковка: в настоящее время я использую пользовательскую реализацию матрицы (в
src/Data/SimpleMat.hs
). Это был единственный способ заставитьad
работать с матрицами (см. выполнять автоматическое дифференцирование по hmatrix?). Я предполагаю, что использование матричного типа, такого какnewtype Mat w h a = Mat (Unboxed.Vector a)
, позволит добиться лучшей производительности за счет распаковки и слияния. Я нашел какой-то код, который имеетad
экземпляров для распакованных векторов, но до сих пор я не смог использовать их сconjugateGradientFunction
.Матричные производные: в письме, которое я просто не могу найти в данный момент, Эдвард упоминает, что было бы лучше использовать
Forward
экземпляров для типов матриц вместо того, чтобы матрицы заполнялисьForward
экземплярами. У меня есть смутное представление о том, как этого добиться, но мне еще предстоит выяснить, как реализовать это с точки зрения классов типовad
s.
Вероятно, это слишком широкий вопрос, чтобы на него можно было ответить на SO, поэтому, если вы хотите помочь мне здесь, не стесняйтесь обращаться ко мне на Github.
cabal run
запускает скомпилированный код. Запуск того же самого из GHCi (т.е. использование:main
) еще медленнее. - person fho   schedule 18.06.2015