Em relação à diferenciação automática, o STC (código-fonte-transformação) é mais eficiente do que a sobrecarga de operador (OO)?

12

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.f:RnR

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?

Matthew Emmett
fonte

Respostas:

9

A transformação fonte a fonte é considerada o padrão ouro em termos de desempenho. As abordagens de OO parecem quase tão boas, pois há mais pacotes de OO por aí, e o desempenho não é mencionado como uma desvantagem significativa. Se você encontrar uma biblioteca OO que você gosta para o idioma em que está trabalhando, eu a usaria primeiro e depois descobriria mais tarde se você absolutamente precisa de transformação de fonte a fonte e se existe uma ferramenta que atenda às suas necessidades. O custo típico de uma derivada gerada pela diferenciação automática é aproximadamente três a cinco vezes o valor de uma avaliação de função, para colocar as coisas em contexto.

Existem mais pacotes OO por aí, porque é mais fácil implementar ferramentas de diferenciação automática usando sobrecarga de operador do que usar tradução de fonte para fonte. Implementar um tradutor fonte a fonte é o mesmo que escrever um compilador: o código-fonte deve ser analisado e tokenizado, e as regras de transformação devem ser aplicadas à árvore de expressão resultante. O livro de Andreas Griewank, Avaliando Derivadas: Princípios e Técnicas de Diferenciação Algorítmica, Segunda Edição, entra em mais detalhes sobre as compensações.

Geoff Oxberry
fonte
Obrigado Geoff, isso ajuda muito, especialmente sua estimativa dos custos típicos.
Matthew Emmett
1

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.

Lutz Lehmann
fonte