Quais os conceitos matematicos por baixo dos panos?
Ontem eu tava lendo a documentação do TensorFlow, e o código fonte do GitHub, no link https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/eager/backprop.py
A descrição em ingles desse arquivo do GitHub diz o seguinte: """Code for backpropagation using the tape utilities.""", ou """Código para retropropagação usando os utilitários de fita.""" em portugues.
O ChatGPT me disse que a função "gradient"(da classe GradientTape) é a função responsavel por calcular os gradientes. Porém essa resposta do chat gpt ainda não me ajudou a entender como o GradientTape funciona. Então eu fui mais a fundo, na busca de metódos com comentários que pudessem ser uteis para eu entender mais a fundo, e ver como ele calcula os gradientes. E encontrei essa classe principal, que é o "class GradientTape" na linha 705 do arquivo do GitHub. E essa classe principal contem um exemplo mais teórico da documentação.
Eu vou reescrever esse exemplo aqui abaixo com minhas palavras, focando mais na matematica:
Exemplo 1 comentado na classe GradientTape na linha 705 do arquivo do GitHub:
Registra operações para diferenciação automática.
Por exemplo, considere a função `y = x * x`.
O gradiente dessa função quando `x = 3.0` pode ser calculado da seguinte forma:
x = 3.0;
y = x * x;
dy_dx = 6.0;
Ou seja, Então isso significa que a derivada de y em relação a x é 6.0. Ou seja, o gradiente de X é 6.0. Pois a cada passo que eu dou em X, eu ando 6.0 em Y.
Ai a documentação dá um outro comentário dando um outro exemplo de GradientTape:
Exemplo 2(derivadas de primeiro e segundo grau), comentado na classe GradientTape da linha 705 do arquivo do GitHub:
GradientTapes pode ser aninhado para calcular derivadas de ordem superior. Por exemplo,
x = 5.0;
y = x * x;
dy_dx = 2 * x
Calculando a primeira derivada, Então, substitundo isso temos:
dy_dx = 2 * 5
dy_dx = 10.0;
Isso por que a cada um passo em X, eu ando 2 em Y. Então, a taxa de variação foi 2, conforme descrito em "dy_dx = 2 * x"
Essa é a primeira derivada da função Y
Depois, podemos calcular a segundo derivada da função Y:
d2y_dx2 = 2.0
Ou seja, nesse segundo exemplo, a derivada de primeiro grau de Y em relação a X é 10.0. Ou seja o gradiente de X é 10.0. Isso por que a cada um passo em X, eu ando 2 em Y. Então, a taxa de variação foi 2, conforme descrito em "dy_dx = 2 * x".
E também, a derivada de segundo grau de Y em relação a X é 2.0. Nesse caso foi 2.0 por que não variou, foi constante.
Também tem um outro exemplo da documentação do TensorFlow:
Exemplo 3(Operando com X e Y sendo uma matriz)
x = [
[1.0, 2.0],
[3.0]
]
y = x * x
Então o resultado da função Y é:
y = [
[1.0, 4.0],
[9.0]
]
Agora calculando o gradiente de Y em relação aos elementos de X
dy/dx = [
[2.0, 4.0],
[6.0]
]
Como X e Y são matrizes, então dy/dx também vai ser uma matriz. Ou seja, os valores [ [2.0, 4.0], [6.0] ] são as derivadas de Y em relação a cada elemento de X, ou seja são os gradientes de X. Elemento a elemento.
Exemplo 4(Calcular a derivada de Z em relação a X), comentado na classe GradientTape da linha 705 do arquivo do GitHub:
x = 3.0
y = x * x
z = y * y
dz_dx = (4 * (x ^ 3) )
Então substituindo isso temos:
dz_dx = (4 * (3 ^ 3) )
dz_dz = 108.0;
Também podemos calcular dy em relação a dx:
dy_dx = 6.0
Ou seja, nesse terceito exemplo, a derivada de Z em relação a X é igual a 108.0. Isso significa que a cada passo que eu der em X, irá causar uma variação de 108.0 no resultado final da função Z. Ou seja, a taxa de variação foi 108.0.
NOTA: As explicações de todos esses 4 exemplos que eu dei foram de minha interpretação pessoal.
PERGUNTAS:
Por favor, poderiam analisar esses 4 exemplos que eu dei. E me corrigir pra eu ver se meu conhecimento de Regra da cadeira e cálculo está correto? Se eu apliquei corretamente as formulas da diferenciação?
Como o GradientTape funciona ? Se eu aplicar a regra da cadeira para calcular a derivada de uma função composta(no caso uma rede neural), manualmente, do jeito que eu fiz nesses 4 exemplos que dei, eu iria estar fazendo algo equivalente ao que o GradientTape faz? porém manualmente?
Se eu aplicar a regra da cadeia manualmente, eu vou estar fazendo uma diferenciação ? E eu chegaria no mesmo resultado que o GradientTape ? Qual a diferença da diferenciação normal pra diferenciação automática que o TensorFlow faz?
Esses calculos que eu fiz manualmente nos exemplos que dei são equivalente ao que o GradientTape faz ?
E mais importante: Eu apliquei corretamente as fórmulas da regra da cadeia? Meu conhecimento e minhas explicações de cada exemplo que dei estão corretas?