Eu estava tentando implementar uma rede neural do zero para entender a matemática por trás dela. Meu problema está completamente relacionado à retropropagação quando adotamos derivada em relação ao viés) e deduzi todas as equações usadas na retropropagação. Agora, toda equação está de acordo com o código da rede neural, exceto a derivada em relação aos vieses.
z1=x.dot(theta1)+b1
h1=1/(1+np.exp(-z1))
z2=h1.dot(theta2)+b2
h2=1/(1+np.exp(-z2))
dh2=h2-y
#back prop
dz2=dh2*(1-dh2)
H1=np.transpose(h1)
dw2=np.dot(H1,dz2)
db2=np.sum(dz2,axis=0,keepdims=True)
Procurei on-line o código e quero saber por que adicionamos a matriz e, em seguida, o escalar db2=np.sum(dz2,axis=0,keepdims=True)
é subtraído do viés original, por que não a matriz como um todo é subtraída. Alguém pode me ajudar a dar alguma intuição por trás disso. Se eu der uma derivada parcial da perda em relação ao viés, isso me dará um gradiente superior apenas que é dz2 porque z2=h1.dot(theta2)+b2
h1 e teta serão 0 e b2 será 1. Portanto, o termo superior será deixado.
b2+=-alpha*db2
fonte
theta1=theta1-alpha*dw1 theta2=theta2-alpha*dw2
ainda não entendi. dessa maneira, o mesmo termo será adicionado a todos os termos diferentes do vetor 'b' que, de outra forma, teriam pesos diferentes para cada um dos termos. isso faria uma diferença significativa para a rede neural atingir mínimos.Eu gostaria de explicar o significado de
db2=np.sum(dz2,axis=0,keepdims=True)
, pois também me confundiu uma vez e não foi respondido.A derivada de∂eu∂b=∂eu∂Z∂Z∂b
L
(perda) wrtb
é a derivada a montante multiplicada pelo derivado local :Se tivermos várias amostras
Z
eL
forem ambas matrizes. b ainda é um vetor.A derivada local é simplesmente um vetor de uns :∂Z∂b=∂∂bW× X+ b = 1
Isso significa que nossa derivada completa é uma multiplicação de matrizes, com a seguinte aparência (por exemplo, 2 amostras com 3 saídas) :∂eu∂Z× 1 = [......]⎡⎣⎢1 11 11 1⎤⎦⎥
Observe que esta é a soma das linhas .
E é
db2=np.sum(dz2, axis=0, keepdims=True)
daí que vem. É simplesmente uma abreviação para a multiplicação de matrizes das derivadas local e a montante.fonte
primeiro, você deve corrigir sua fórmula para o gradiente da função sigmóide.
A primeira derivada da função sigmóide é:
(1−σ(x))σ(x)
Sua fórmula para dz2 se tornará:
dz2 = (1-h2)*h2 * dh2
Você deve usar a saída da função sigmóide para
σ(x)
não o gradiente.Você deve somar o gradiente para o viés, pois esse gradiente vem de muitas entradas únicas (o número de entradas = tamanho do lote). Portanto, devemos acumulá-los para atualizar os vieses da camada 2. No entanto, para os gradientes chegarem à camada 1, uma vez que vêm de muitos nós da camada 2, é necessário somar todo o gradiente para atualizar os vieses e pesos da camada 1 Este caso é diferente da soma dos vieses na camada 2.
Meu implemento para duas camadas totalmente conectadas com as funções de ativação são funções sigmóides:
fonte