Estamos trabalhando em um modelo bayesiano para um processo de espaço-tempo e usando um amostrador No-U-Turn (NUTS) que requer um modelo para a probabilidade logarítmica e seu gradiente em relação aos parâmetros do modelo. Mais sucintamente, temos a função de probabilidade logarítmica bastante complicada , envolvendo distribuições estatísticas, produtos kronecker, exponenciais, proporções, declarações if-else etc., e precisamos fornecê-la e seu gradiente para NUTS. Vários pacotes ( MCMC de Stan e Julia ) usam sobrecarga de operador (tanto quanto sei) para obter o gradiente automaticamente.
Se pudéssemos criar nossa própria função de gradiente, talvez usando uma ferramenta de diferença automática de transformação de código-fonte, obteríamos melhor desempenho ou o OO é tão bom ou melhor?
fonte
Para computação gradiente, você usa o modo reverso do AD. Isso requer nos dois casos a construção de uma pilha de operandos, a versão OO também precisa criar uma pilha de operações, que deve ser interpretada no percurso inverso do código. O código transformado de origem grava as operações com ordem inversa como código-fonte adicional que é compilado. A sobrecarga de ter o intérprete de operações no código pode ser significativa. Existem comparações entre o código gerado pelo Tapenade e o Adol-C que são a favor do Tapenade.
fonte