Gráficos Computacionais
A retropropagação é implementada em frameworks de aprendizado profundo como Tensorflow, Torch, Theano, etc., usando gráficos computacionais. Mais significativamente, entender a propagação de volta em gráficos computacionais combina vários algoritmos diferentes e suas variações, como backprop através do tempo e backprop com pesos compartilhados. Uma vez que tudo é convertido em um gráfico computacional, eles ainda são o mesmo algoritmo - apenas retropropagação em gráficos computacionais.
O que é gráfico computacional
Um gráfico computacional é definido como um gráfico direcionado onde os nós correspondem a operações matemáticas. Os gráficos computacionais são uma forma de expressar e avaliar uma expressão matemática.
Por exemplo, aqui está uma equação matemática simples -
$$ p = x + y $$
Podemos desenhar um gráfico computacional da equação acima como segue.
O gráfico computacional acima tem um nó de adição (nó com sinal "+") com duas variáveis de entrada xey e uma saída q.
Tomemos outro exemplo, um pouco mais complexo. Temos a seguinte equação.
$$ g = \ left (x + y \ right) \ ast z $$
A equação acima é representada pelo seguinte gráfico computacional.
Gráficos computacionais e retropropagação
Grafos computacionais e retropropagação, ambos são conceitos centrais importantes no aprendizado profundo para o treinamento de redes neurais.
Passar para a frente
A passagem para frente é o procedimento para avaliar o valor da expressão matemática representada por gráficos computacionais. Fazer a passagem direta significa que estamos passando o valor das variáveis na direção direta da esquerda (entrada) para a direita onde está a saída.
Vamos considerar um exemplo dando algum valor a todas as entradas. Suponha que os seguintes valores sejam dados a todas as entradas.
$$ x = 1, y = 3, z = −3 $$
Ao fornecer esses valores às entradas, podemos realizar a passagem direta e obter os seguintes valores para as saídas em cada nó.
Primeiro, usamos o valor de x = 1 ey = 3, para obter p = 4.
Então usamos p = 4 e z = -3 para obter g = -12. Vamos da esquerda para a direita, para a frente.
Objetivos do passe para trás
Na passagem para trás, nossa intenção é calcular os gradientes para cada entrada em relação à saída final. Esses gradientes são essenciais para treinar a rede neural usando gradiente descendente.
Por exemplo, desejamos os seguintes gradientes.
Gradientes desejados
$$ \ frac {\ parcial x} {\ parcial f}, \ frac {\ parcial y} {\ parcial f}, \ frac {\ parcial z} {\ parcial f} $$
Passe para trás (retropropagação)
Começamos a passagem para trás encontrando a derivada da saída final em relação à saída final (em si!). Assim, resultará na derivação da identidade e o valor é igual a um.
$$ \ frac {\ partial g} {\ partial g} = 1 $$
Nosso gráfico computacional agora se parece com o mostrado abaixo -
A seguir, faremos a passagem para trás por meio da operação "*". Vamos calcular os gradientes em pe z. Como g = p * z, sabemos que -
$$ \ frac {\ partial g} {\ partial z} = p $$
$$ \ frac {\ partial g} {\ partial p} = z $$
Já sabemos os valores de zep do passe para frente. Portanto, obtemos -
$$ \ frac {\ partial g} {\ partial z} = p = 4 $$
e
$$ \ frac {\ partial g} {\ partial p} = z = -3 $$
Queremos calcular os gradientes em x e y -
$$ \ frac {\ partial g} {\ partial x}, \ frac {\ partial g} {\ partial y} $$
No entanto, queremos fazer isso de forma eficiente (embora xeg estejam a apenas dois saltos de distância neste gráfico, imagine-os realmente distantes um do outro). Para calcular esses valores de forma eficiente, usaremos a regra da cadeia de diferenciação. Da regra da cadeia, temos -
$$ \ frac {\ parcial g} {\ parcial x} = \ frac {\ parcial g} {\ parcial p} \ ast \ frac {\ parcial p} {\ parcial x} $$
$$ \ frac {\ parcial g} {\ parcial y} = \ frac {\ parcial g} {\ parcial p} \ ast \ frac {\ parcial p} {\ parcial y} $$
Mas já sabemos que dg / dp = -3, dp / dx e dp / dy são fáceis, pois p depende diretamente de x e y. Nós temos -
$$ p = x + y \ Rightarrow \ frac {\ parcial x} {\ parcial p} = 1, \ frac {\ parcial y} {\ parcial p} = 1 $$
Portanto, obtemos -
$$ \ frac {\ partial g} {\ partial f} = \ frac {\ partial g} {\ partial p} \ ast \ frac {\ partial p} {\ partial x} = \ left (-3 \ right) .1 = -3 $$
Além disso, para a entrada y -
$$ \ frac {\ partial g} {\ partial y} = \ frac {\ partial g} {\ partial p} \ ast \ frac {\ partial p} {\ partial y} = \ left (-3 \ right) .1 = -3 $$
A principal razão para fazer isso ao contrário é que, quando tivemos que calcular o gradiente em x, usamos apenas valores já calculados e dq / dx (derivada da saída do nó em relação à entrada do mesmo nó). Usamos informações locais para calcular um valor global.
Etapas para treinar uma rede neural
Siga estas etapas para treinar uma rede neural -
Para o ponto de dados x no conjunto de dados, fazemos a passagem direta com x como entrada e calculamos o custo c como saída.
Fazemos o retrocesso começando em c, e calculamos gradientes para todos os nós no gráfico. Isso inclui nós que representam os pesos da rede neural.
Em seguida, atualizamos os pesos fazendo W = W - gradientes da taxa de aprendizagem.
Repetimos esse processo até que os critérios de parada sejam atendidos.