Автоматическое дифференцирование

Переключение режимов AD

Turing поддерживает четыре пакета автоматического дифференцирования (AD) в бэкенде во время выборки. Бэкендом AD по умолчанию является ForwardDiff для AD с прямым режимом. Также поддерживаются три бэкенда AD с обратным режимом, а именно Tracker, Zygote и ReverseDiff. Zygote и ReverseDiff поддерживаются при необходимости, если они явным образом загружены пользователем с помощью using Zygote или using ReverseDiff рядом с using Turing.

Для переключения между различными бэкендами AD можно вызвать функцию Turing.setadbackend(backend_sym), где backend_sym может быть :forwarddiff (ForwardDiff), :tracker (Tracker), :zygote (Zygote) или :reversediff (ReverseDiff.jl). При использовании ReverseDiff, чтобы скомпилировать ленту только один раз и кэшировать ее для последующего использования, пользователь должен вызвать Turing.setrdcache(true). Однако учтите, что использование кэширования в некоторых типах моделей может привести к некорректным результатам и (или) ошибкам. Скомпилированную ленту можно кэшировать для моделей с циклами фиксированного размера и без операторов if времени выполнения. Операторы if времени выполнения являются отличными вариантами.

Композиционная выборка с различными режимами AD

Turing поддерживает смешанные методы автоматического дифференцирования для различных пространств переменных. В приведенном ниже фрагменте показано использование ForwardDiff для выборки параметра среднего (m) и использование основанного на Tracker автоматического дифференцирования TrackerAD для параметра дисперсии (s):

using Turing

# Определим простую нормальную модель с неизвестными средним и дисперсией.
@model function gdemo(x, y)
    s² ~ InverseGamma(2, 3)
    m ~ Normal(0, sqrt(s²))
    x ~ Normal(m, sqrt(s²))
    y ~ Normal(m, sqrt(s²))
end

# Проведем выборку с использованием сэмплера Гиббса и различных бэкендов автоматического дифференцирования.
c = sample(
	gdemo(1.5, 2),
  	Gibbs(
    	HMC{Turing.ForwardDiffAD{1}}(0.1, 5, :m),
        HMC{Turing.TrackerAD}(0.1, 5, :s)
    ),
    1000,
)

Как правило, TrackerAD быстрее при выборке из переменных высокой размерности (больше 20), а ForwardDiffAD эффективнее для переменных меньшей размерности. Эта функция позволяет пользователям, уделяющим большое значение производительности, точно настраивать автоматическое дифференцирование для своих конкретных моделей.

Если метод дифференцирования не указан таким образом, Turing по умолчанию будет использовать любой глобальный бэкенд AD. Сейчас по умолчанию используется ForwardDiff.