Não tenho certeza se essa pergunta pertence aqui, mas está intimamente relacionada aos métodos de gradiente na otimização, que parecem estar no tópico aqui. De qualquer forma, sinta-se à vontade para migrar se você achar que alguma outra comunidade possui uma melhor experiência no tópico.
Em resumo, estou procurando um exemplo passo a passo da diferenciação automática no modo reverso . Não há muita literatura sobre o assunto e a implementação existente (como a do TensorFlow ) é difícil de entender sem conhecer a teoria por trás disso. Assim, eu ficaria muito grato se alguém pudesse mostrar em detalhes o que passar , como podemos processá-lo e o que tirar do gráfico computacional.
Algumas perguntas com as quais tenho mais dificuldade:
- sementes - por que precisamos delas?
- regras de diferenciação reversa - eu sei como fazer diferenciação para a frente, mas como vamos para trás? Por exemplo, no exemplo desta seção , como sabemos que ?
- trabalhamos apenas com símbolos ou passamos por valores reais ? Por exemplo , no mesmo exemplo , são os símbolos ou valores e ?
Respostas:
Digamos que temos a expressão e queremos encontrar derivadas e . O AD de modo reverso divide essa tarefa em 2 partes, a saber, passes para frente e para trás.z=x1x2+sin(x1) dzdx1 dzdx2
Passar para a frente
Primeiro, decompomos nossa expressão complexa em um conjunto de expressões primitivas, ou seja, expressões que consistem em, no máximo, uma chamada de função. Observe que eu também renomeio variáveis de entrada e saída para obter consistência, embora não seja necessário:
A vantagem dessa representação é que as regras de diferenciação para cada expressão separada já são conhecidas. Por exemplo, sabemos que a derivada de é e, portanto, . Usaremos esse fato no passe inverso abaixo.sin cos dw4dw1=cos(w1)
Essencialmente, o encaminhamento consiste em avaliar cada uma dessas expressões e salvar os resultados. Digamos, nossas entradas são: e . Então nós temos:x1=2 x2=3
Passagem reversa
Aqui é onde a mágica começa, e começa com a regra da cadeia . Em sua forma básica, a regra da cadeia declara que, se você tiver a variável que depende de que, por sua vez, depende de , então:t(u(v)) u v
ou, se depende de através de vários caminhos / variáveis , por exemplo:t v ui
então (veja a prova aqui ):
Em termos de gráfico de expressão, se temos um nó final e nós de entrada , e o caminho de para passa pelos nós intermediários (ou seja, onde ), podemos encontrar derivativos comoz wi z wi wp z=g(wp) wp=f(wi) dzdwi
Em outras palavras, para calcular a derivada da variável de saída qualquer variável intermediária ou de entrada , precisamos apenas conhecer as derivadas de seus pais e a fórmula para calcular a derivada da expressão primitiva .z wi wp=f(wi)
A passagem reversa começa no final (ou seja, ) e se propaga para trás para todas as dependências. Aqui temos (expressão para "semente"):dzdz
Isso pode ser lido como "mudança em resulta exatamente na mesma mudança em ", o que é bastante óbvio.z z
Então sabemos que e assim:z=w5
A partir da definição e das regras de derivadas parciais, descobrimos que . Portanto:w3=w1w2 dw3dw2=w1
Que, como já sabemos do passe para frente, é:
Finalmente, contribui para via e . Mais uma vez, pelas regras das derivadas parciais, sabemos que e . Portanto:w1 z w3 w4 dw3dw1=w2 dw4dw1=cos(w1)
E, novamente, dadas as entradas conhecidas, podemos calculá-lo:
Como e são apenas aliases para e , obtemos nossa resposta:w1 w2 x1 x2
E é isso!
Esta descrição refere-se apenas a entradas escalares, ou seja, números, mas na verdade também pode ser aplicada a matrizes multidimensionais, como vetores e matrizes. Duas coisas que devemos ter em mente ao diferenciar expressões com esses objetos:
O poder da diferenciação automática é que ele pode lidar com estruturas complicadas de linguagens de programação como condições e loops. No entanto, se tudo o que você precisa são expressões algébricas e você possui uma estrutura boa o suficiente para trabalhar com representações simbólicas, é possível construir expressões totalmente simbólicas. De fato, neste exemplo, podemos produzir a expressão e calcular essa derivada para quaisquer entradas que desejemos.dzdw1=w2+cos(w1)=x2+cos(x1)
fonte