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.