Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Camadas de Perceptron | Rede Neural do Zero
Introdução às Redes Neurais

bookCamadas de Perceptron

Perceptron refere-se ao tipo mais simples de rede neural, que consiste em apenas um neurônio. Para lidar com problemas mais complexos, utiliza-se um modelo conhecido como perceptron multicamadas (MLP). Um perceptron multicamadas contém uma ou mais camadas ocultas que permitem à rede aprender padrões complexos nos dados.

A estrutura de um perceptron multicamadas inclui:

  1. Camada de entrada: recebe os dados de entrada;
  2. Camadas ocultas: processam os dados e extraem padrões relevantes;
  3. Camada de saída: produz a previsão ou classificação final.

Cada camada é composta por múltiplos neurônios, e a saída de uma camada serve como entrada para a próxima camada.

Pesos e Bias das Camadas

Antes de implementar uma camada, é importante entender como armazenar os pesos e bias de cada neurônio nela. No capítulo anterior, foi mostrado como armazenar os pesos de um único neurônio como um vetor e seu bias como um escalar (número único).

Como uma camada é composta por múltiplos neurônios, é natural representar os pesos como uma matriz, onde cada linha corresponde aos pesos de um neurônio específico. Consequentemente, os bias podem ser representados como um vetor, cujo comprimento é igual ao número de neurônios.

Dada uma camada com 33 entradas e 22 neurônios, seus pesos serão armazenados em uma matriz 2×32 \times 3 WW e seus bias serão armazenados em um vetor 2×12 \times 1 bb, que ficam assim:

W=[W11W12W13W21W22W23]b=[b1b2]W = \begin{bmatrix} W_{11} & W_{12} & W_{13}\\ W_{21} & W_{22} & W_{23} \end{bmatrix} \qquad b = \begin{bmatrix} b_1\\ b_2 \end{bmatrix}

Aqui, o elemento WijW_{ij} representa o peso da jj-ésima entrada para o ii-ésimo neurônio, então a primeira linha contém os pesos do primeiro neurônio e a segunda linha contém os pesos do segundo neurônio. O elemento bib_i representa o bias do ii-ésimo neurônio (dois neurônios – dois bias).

Propagação Direta

Realizar a propagação direta para cada camada significa ativar cada um de seus neurônios calculando a soma ponderada das entradas, adicionando o viés e aplicando a função de ativação.

Anteriormente, para um único neurônio, você implementou a soma ponderada das entradas calculando o produto escalar entre o vetor de entrada e o vetor de pesos e adicionando o viés.

Como cada linha da matriz de pesos contém o vetor de pesos para um neurônio específico, tudo o que você precisa fazer agora é simplesmente realizar um produto escalar entre cada linha da matriz e o vetor de entrada. Felizmente, isso é exatamente o que a multiplicação de matrizes faz:

Para adicionar os vieses às saídas dos respectivos neurônios, um vetor de vieses também deve ser adicionado:

Por fim, a função de ativação é aplicada ao resultado — sigmoid ou ReLU, neste caso. A fórmula resultante para a propagação direta na camada é a seguinte:

a=activation(Wx+b)a = activation(Wx + b)

onde aa é o vetor de ativações dos neurônios (saídas).

Classe Layer

Os blocos fundamentais do perceptron são suas camadas, portanto, faz sentido criar uma classe Layer separada. Seus atributos incluem:

  • inputs: um vetor de entradas (n_inputs é o número de entradas);
  • outputs: um vetor de valores de saída brutos (antes de aplicar a função de ativação) dos neurônios (n_neurons é o número de neurônios);
  • weights: uma matriz de pesos;
  • biases: um vetor de bias;
  • activation_function: a função de ativação utilizada na camada.

Assim como na implementação de um único neurônio, weights e biases serão inicializados com valores aleatórios entre -1 e 1 extraídos de uma distribuição uniforme.

class Layer:
    def __init__(self, n_inputs, n_neurons, activation_function):
        self.inputs = np.zeros((n_inputs, 1))
        self.outputs = np.zeros((n_neurons, 1))
        self.weights = ...
        self.biases = ...
        self.activation = activation_function

Os atributos inputs e outputs serão utilizados posteriormente na retropropagação, portanto faz sentido inicializá-los como arrays NumPy preenchidos com zeros.

Note
Nota

Inicializar inputs e outputs como arrays NumPy preenchidos com zeros previne erros ao realizar cálculos na propagação direta e reversa. Isso também garante consistência entre as camadas, permitindo operações matriciais sem a necessidade de verificações adicionais.

Propagação direta pode ser implementada no método forward(), onde os outputs são calculados com base no vetor inputs utilizando NumPy, seguindo a fórmula acima:

def forward(self, inputs):
    self.inputs = np.array(inputs).reshape(-1, 1)
    # Raw outputs
    self.outputs = ...
    # Applying the activation function
    return ...
Note
Nota

Redimensionar inputs para um vetor coluna garante a multiplicação de matrizes correta com a matriz de pesos durante a propagação direta. Isso evita incompatibilidades de formato e permite cálculos contínuos em todas as camadas.

1. O que torna um perceptron multicamadas (MLP) mais poderoso do que um perceptron simples?

2. Por que é necessário aplicar este código antes de multiplicar inputs pela matriz de pesos?

question mark

O que torna um perceptron multicamadas (MLP) mais poderoso do que um perceptron simples?

Select the correct answer

question mark

Por que é necessário aplicar este código antes de multiplicar inputs pela matriz de pesos?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 3

Pergunte à IA

expand

Pergunte à IA

ChatGPT

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

Suggested prompts:

Can you explain how the matrix multiplication works in forward propagation?

What is the purpose of the activation function in a neural network layer?

Could you show an example of how to initialize the weights and biases in the Layer class?

Awesome!

Completion rate improved to 4

bookCamadas de Perceptron

Deslize para mostrar o menu

Perceptron refere-se ao tipo mais simples de rede neural, que consiste em apenas um neurônio. Para lidar com problemas mais complexos, utiliza-se um modelo conhecido como perceptron multicamadas (MLP). Um perceptron multicamadas contém uma ou mais camadas ocultas que permitem à rede aprender padrões complexos nos dados.

A estrutura de um perceptron multicamadas inclui:

  1. Camada de entrada: recebe os dados de entrada;
  2. Camadas ocultas: processam os dados e extraem padrões relevantes;
  3. Camada de saída: produz a previsão ou classificação final.

Cada camada é composta por múltiplos neurônios, e a saída de uma camada serve como entrada para a próxima camada.

Pesos e Bias das Camadas

Antes de implementar uma camada, é importante entender como armazenar os pesos e bias de cada neurônio nela. No capítulo anterior, foi mostrado como armazenar os pesos de um único neurônio como um vetor e seu bias como um escalar (número único).

Como uma camada é composta por múltiplos neurônios, é natural representar os pesos como uma matriz, onde cada linha corresponde aos pesos de um neurônio específico. Consequentemente, os bias podem ser representados como um vetor, cujo comprimento é igual ao número de neurônios.

Dada uma camada com 33 entradas e 22 neurônios, seus pesos serão armazenados em uma matriz 2×32 \times 3 WW e seus bias serão armazenados em um vetor 2×12 \times 1 bb, que ficam assim:

W=[W11W12W13W21W22W23]b=[b1b2]W = \begin{bmatrix} W_{11} & W_{12} & W_{13}\\ W_{21} & W_{22} & W_{23} \end{bmatrix} \qquad b = \begin{bmatrix} b_1\\ b_2 \end{bmatrix}

Aqui, o elemento WijW_{ij} representa o peso da jj-ésima entrada para o ii-ésimo neurônio, então a primeira linha contém os pesos do primeiro neurônio e a segunda linha contém os pesos do segundo neurônio. O elemento bib_i representa o bias do ii-ésimo neurônio (dois neurônios – dois bias).

Propagação Direta

Realizar a propagação direta para cada camada significa ativar cada um de seus neurônios calculando a soma ponderada das entradas, adicionando o viés e aplicando a função de ativação.

Anteriormente, para um único neurônio, você implementou a soma ponderada das entradas calculando o produto escalar entre o vetor de entrada e o vetor de pesos e adicionando o viés.

Como cada linha da matriz de pesos contém o vetor de pesos para um neurônio específico, tudo o que você precisa fazer agora é simplesmente realizar um produto escalar entre cada linha da matriz e o vetor de entrada. Felizmente, isso é exatamente o que a multiplicação de matrizes faz:

Para adicionar os vieses às saídas dos respectivos neurônios, um vetor de vieses também deve ser adicionado:

Por fim, a função de ativação é aplicada ao resultado — sigmoid ou ReLU, neste caso. A fórmula resultante para a propagação direta na camada é a seguinte:

a=activation(Wx+b)a = activation(Wx + b)

onde aa é o vetor de ativações dos neurônios (saídas).

Classe Layer

Os blocos fundamentais do perceptron são suas camadas, portanto, faz sentido criar uma classe Layer separada. Seus atributos incluem:

  • inputs: um vetor de entradas (n_inputs é o número de entradas);
  • outputs: um vetor de valores de saída brutos (antes de aplicar a função de ativação) dos neurônios (n_neurons é o número de neurônios);
  • weights: uma matriz de pesos;
  • biases: um vetor de bias;
  • activation_function: a função de ativação utilizada na camada.

Assim como na implementação de um único neurônio, weights e biases serão inicializados com valores aleatórios entre -1 e 1 extraídos de uma distribuição uniforme.

class Layer:
    def __init__(self, n_inputs, n_neurons, activation_function):
        self.inputs = np.zeros((n_inputs, 1))
        self.outputs = np.zeros((n_neurons, 1))
        self.weights = ...
        self.biases = ...
        self.activation = activation_function

Os atributos inputs e outputs serão utilizados posteriormente na retropropagação, portanto faz sentido inicializá-los como arrays NumPy preenchidos com zeros.

Note
Nota

Inicializar inputs e outputs como arrays NumPy preenchidos com zeros previne erros ao realizar cálculos na propagação direta e reversa. Isso também garante consistência entre as camadas, permitindo operações matriciais sem a necessidade de verificações adicionais.

Propagação direta pode ser implementada no método forward(), onde os outputs são calculados com base no vetor inputs utilizando NumPy, seguindo a fórmula acima:

def forward(self, inputs):
    self.inputs = np.array(inputs).reshape(-1, 1)
    # Raw outputs
    self.outputs = ...
    # Applying the activation function
    return ...
Note
Nota

Redimensionar inputs para um vetor coluna garante a multiplicação de matrizes correta com a matriz de pesos durante a propagação direta. Isso evita incompatibilidades de formato e permite cálculos contínuos em todas as camadas.

1. O que torna um perceptron multicamadas (MLP) mais poderoso do que um perceptron simples?

2. Por que é necessário aplicar este código antes de multiplicar inputs pela matriz de pesos?

question mark

O que torna um perceptron multicamadas (MLP) mais poderoso do que um perceptron simples?

Select the correct answer

question mark

Por que é necessário aplicar este código antes de multiplicar inputs pela matriz de pesos?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 3
some-alt