Esclarecimento da intuição por trás da retropropagação


7

Estou demorando um pouco para tentar entender os cálculos e a mecânica dos algoritmos de aprendizado de máquina que uso no meu dia-a-dia.

Estudando a literatura de retropropagação no curso CS231n, quero ter certeza de que entendi a regra da cadeia corretamente antes de continuar meu estudo.

Digamos que tenho a função sigmóide:

σ(x)=11+ex

neste caso,x=w0x0+w1x1+w2

Podemos escrever esta função como um gráfico computacional (ignorando os valores coloridos por enquanto): insira a descrição da imagem aqui

Podemos agrupar os nós modularizados para calcular o gradiente do sigmóide e sua entrada em uma única derivação:w.r.t.

dσ(x)dx=(1σ(x))σ(x)

Primeiro, realizamos a propagação direta para obter as saídas em cada unidade:

w = [2,-3,-3] 
x = [-1, -2]

# Compute the forward pass 
product = [w[0]*x[0]+w[1]*x[1]+w[2]]
activation = 1 / 1 + math.exp(-product)

Para calcular o gradiente da ativação, podemos usar a fórmula acima:

grad_product = (1 - activation) * activation 

Onde eu sinto que posso estar ficando confuso, ou, pelo menos menos intuitivo, é calcular o gradiente para xe w:

grad_x = [w[0] * activation + w[2] * activation]
grad_w = [x[0] * activation + x[1] * activation + 1 * activation]

Mais concretamente, estou confuso sobre o motivo pelo qual aplicamos 1 * activationao calcular o gradiente w.w.r.t.

Pode ajudar o leitor a identificar minha dificuldade teórica se tentar raciocinar os cálculos dos gradientes de x e de w ...

O gradiente de cada é dado pelo correspondente sob a regra da multiplicação: se então . Em seguida, usando a regra da cadeia, multiplicamos esses gradientes locais pelo gradiente do nó sucessivo (para cada caminho de ) para obter seu gradiente na saída da função. Isso explica o cálculo da computação .xiwif(x,y)=f(xy)fx=yxx

O gradiente de é dado exatamente da mesma maneira (inversa), como explicado acima, com o adicional . Eu acredito que esta expressão adicional é proveniente de ? O gradiente local de uma unidade de adição é sempre 1 para todas as entradas e a multiplicação com é o resultado de encadear o gradiente à saída da função?wi1 * activationw2activation

Estou parcialmente confiante com meu entendimento atual, mas gostaria que alguém esclarecesse minha intuição atual sobre os cálculos envolvidos nos gradientes de computação.

Respostas:


0

O que você deseja calcular é

σ(x^)x=[σ(x^)x0,σ(x^)x1]

e

σ(x^)w=[σ(x^)w0,σ(x^)w1,σ(x^)w2]

sabendo que é de fato uma função dessas variáveis, como .x^x^=w0x0+w1x1+w2

Você pode usar a regra da cadeia para calcular isso como:

σ(x^)x0=σ(x^)x^x^x0

Você já conheceσ(x^)x^

como

σ(x^)x^=(1σ(x^))σ(x^)

e a segunda derivada é trivial (é apenas um polinômio! ). Agora você só precisa calcular as 5 derivadas parciais. Em resumo:x^x0=w0

σ(x^)x=[σ(x^)x^w0,σ(x^)x^w1]

σ(x^^)w=[σ(x^)x^x0,σ(x)x^x1,σ(x^)x^]

2

A melhor maneira de entender a retropropagação para um programador é em termos da regra da cadeia como uma recursão.

Aqui está a regra da cadeia. Você tem uma expressão de função aninhada . Primeiro, você a vê como duas funções diferentes: Quando você encaminha a propagação, nada mais é do que esse código psudo: y=f(g(x))

f(x)g(x)
t=g(x)y=f(t)

Agora, se você deseja obter uma derivada, aplica uma regra de cadeia: onde e Isso é basicamente uma recursão em uma estrutura aninhada. Se , basta aplicar a regra da cadeia novamente e continuar fazendo isso até chegar ao fundo, ou seja, a camada de entrada no caso de NN.

y=f(g(x))=fg
f=df(t)/dt
g=dg(x)/dx
g(x)=g(h(x))

Aqui está um exemplo, um neurônio: Você tem duas funções aqui: e .

a=sigmoid(Wx+b)
sigmoid(x)Wx+b

Se você tem duas camadas de neurônios, não é muito diferente: então você retrocede:

sigmoid(W1sigmoid(Wx+b)+b1)
z=Wx+ba1=sigmoid(z)z1=W1a1+b1a2=sigmoid(z1)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.