Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Desafio: Treinamento do Perceptron | Seção
Fundamentos de Redes Neurais
Seção 1. Capítulo 17
single

single

bookDesafio: Treinamento do Perceptron

Deslize para mostrar o menu

Antes de prosseguir com o treinamento do perceptron, lembre-se de que ele utiliza a função de perda de entropia cruzada binária discutida anteriormente. O último conceito-chave antes de implementar o backpropagation é a fórmula para a derivada dessa função de perda em relação às ativações de saída, $a^n$. Abaixo estão as fórmulas para a função de perda e sua derivada:

L=(ylog(y^)+(1y)log(1y^))dan=y^yy^(1y^)\begin{aligned} L &= -(y \log(\hat{y}) + (1-y) \log(1 - \hat{y}))\\ da^n &= \frac {\hat{y} - y} {\hat{y}(1 - \hat{y})} \end{aligned}

onde an=y^a^n = \hat{y}

Para verificar se o perceptron está sendo treinado corretamente, o método fit() também exibe a perda média em cada época. Isso é calculado pela média da perda em todos os exemplos de treinamento naquela época:

for epoch in range(epochs):
    loss = 0

    for i in range(training_data.shape[0]):
        loss += -(target * np.log(output) + (1 - target) * np.log(1 - output))

average_loss = loss[0, 0] / training_data.shape[0]
print(f'Loss at epoch {epoch + 1}: {average_loss:.3f}')
L=1Ni=1N(yilog(y^i)+(1yi)log(1y^i))L = -\frac1N \sum_{i=1}^N (y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i))

Por fim, as fórmulas para calcular os gradientes em cada camada são as seguintes:

dzl=dalfl(zl)dWl=dzl(al1)Tdbl=dzldal1=(Wl)Tdzl\begin{aligned} dz^l &= da^l \odot f'^l(z^l)\\ dW^l &= dz^l \cdot (a^{l-1})^T\\ db^l &= dz^l\\ da^{l-1} &= (W^l)^T \cdot dz^l \end{aligned}

Detalhes de Implementação para Lembrar

Ao traduzir essas fórmulas para código Python no método backward(), lembre-se das operações NumPy discutidas nos capítulos anteriores:

  • O operador \odot denota multiplicação elemento a elemento, que é feita usando o operador padrão * em Python.
  • O operador \cdot denota o produto escalar, implementado usando a função np.dot().
  • O sobrescrito TT denota a transposição de matriz, tratada pelo atributo .T.
  • Para calcular fl(zl)f'^l(z^l), é possível chamar dinamicamente a derivada da função de ativação da camada usando self.activation.derivative(self.outputs).

Isso faz com que a estrutura geral do método backward() seja assim:

def backward(self, da, learning_rate):
    dz = ... # using da and self.activation.derivative()
    d_weights = ... # using np.dot() and .T
    d_biases = ...
    da_prev = ...

    self.weights -= learning_rate * d_weights
    self.biases -= learning_rate * d_biases

    return da_prev

Da mesma forma, ao reunir tudo no método fit(), lembre-se de que é necessário iterar pela rede de trás para frente para propagar o erro. A estrutura geral é a seguinte:

def fit(self, training_data, labels, epochs, learning_rate):
    # ... (Epoch loop and data shuffling) ...
            # Forward propagation
            output = ...

            # Computing the gradient of the loss function w.r.t. output (da^n)
            da = ...

            # Backward propagation through all layers
            for layer in self.layers[::-1]:
                da = ... # Call the backward() method of the layer

Os dados de treinamento de exemplo (X_train) juntamente com os rótulos correspondentes (y_train) estão armazenados como arrays NumPy no arquivo utils.py. Além disso, as instâncias das funções de ativação também estão definidas lá:

relu = ReLU()
sigmoid = Sigmoid()
Tarefa

Deslize para começar a programar

Seu objetivo é completar o processo de treinamento para um perceptron multicamadas implementando o backpropagation e atualizando os parâmetros do modelo.

Siga estes passos cuidadosamente:

  1. Implemente o método backward() na classe Layer:
  • Calcule os seguintes gradientes:
    • dz: derivada da função de perda em relação aos valores pré-ativação, utilizando a derivada da função de ativação;
  • d_weights: gradiente da perda em relação aos pesos, calculado como o produto escalar de dz e o vetor de entrada transposto;
  • d_biases: gradiente da perda em relação aos vieses, igual a dz;
  • da_prev: gradiente da perda em relação às ativações da camada anterior, obtido multiplicando a matriz de pesos transposta por dz.
  • Atualize os pesos e vieses utilizando a taxa de aprendizado.
  1. Complete o método fit() na classe Perceptron:
  • Calcule a saída do modelo chamando o método forward();
  • Calcule a função de perda utilizando a fórmula da entropia cruzada;
  • Calcule danda^n — a derivada da perda em relação às ativações de saída;
  • Faça um loop reverso pelas camadas, realizando o backpropagation ao chamar o método backward() de cada camada.
  1. Verifique o comportamento do treinamento:
  • Se tudo estiver implementado corretamente, a perda deve diminuir de forma constante a cada época ao utilizar uma taxa de aprendizado de 0.01.

Solução

Switch to desktopMude para o desktop para praticar no mundo realContinue de onde você está usando uma das opções abaixo
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 17
single

single

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

some-alt