Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Perceptron-Lagen | Neuraal Netwerk Vanaf Nul
Introductie tot Neurale Netwerken

bookPerceptron-Lagen

Perceptron verwijst naar het eenvoudigste type neuraal netwerk, dat bestaat uit slechts één neuron. Voor het oplossen van complexere problemen wordt een model gebruikt dat bekend staat als een multilayer perceptron (MLP). Een multilayer perceptron bevat één of meer verborgen lagen die het netwerk in staat stellen om complexe patronen in gegevens te leren.

De structuur van een multilayer perceptron omvat:

  1. Invoerlaag: ontvangt de invoergegevens;
  2. Verborgen lagen: verwerken de gegevens en extraheren betekenisvolle patronen;
  3. Uitvoerlaag: levert de uiteindelijke voorspelling of classificatie.

Elke laag bestaat uit meerdere neuronen, en de uitvoer van de ene laag fungeert als de invoer voor de volgende laag.

Laaggewichten en Biases

Voordat een laag wordt geïmplementeerd, is het belangrijk te begrijpen hoe de gewichten en biases van elke neuron daarin worden opgeslagen. In het vorige hoofdstuk heb je geleerd hoe je de gewichten van een enkel neuron als een vector opslaat en de bias als een scalar (enkel getal).

Aangezien een laag uit meerdere neuronen bestaat, is het logisch om de gewichten als een matrix weer te geven, waarbij elke rij overeenkomt met de gewichten van een specifiek neuron. Bijgevolg kunnen biases worden weergegeven als een vector, waarvan de lengte gelijk is aan het aantal neuronen.

Gegeven een laag met 33 ingangen en 22 neuronen, worden de gewichten opgeslagen in een 2×32 \times 3 matrix WW en de biases in een 2×12 \times 1 vector bb, die er als volgt uitzien:

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}

Hier stelt element WijW_{ij} het gewicht voor van een jj-de ingang naar het ii-de neuron, dus de eerste rij bevat de gewichten van het eerste neuron en de tweede rij bevat de gewichten van het tweede neuron. Element bib_i stelt de bias voor van het ii-de neuron (twee neuronen – twee biases).

Voorwaartse propagatie

Het uitvoeren van voorwaartse propagatie voor elke laag betekent het activeren van elk van zijn neuronen door het gewogen totaal van de inputs te berekenen, de bias toe te voegen en de activatiefunctie toe te passen.

Eerder, voor een enkele neuron, implementeerde je het gewogen totaal van de inputs door een dotproduct te berekenen tussen de inputvector en de gewichtsvector en de bias toe te voegen.

Aangezien elke rij van de gewichtenmatrix de gewichtsvector voor een specifiek neuron bevat, hoef je nu alleen maar een dotproduct uit te voeren tussen elke rij van de matrix en de inputvector. Gelukkig is dit precies wat matrixvermenigvuldiging doet:

Om de biases toe te voegen aan de outputs van de respectievelijke neuronen, moet ook een vector van biases worden toegevoegd:

Ten slotte wordt de activatiefunctie toegepast op het resultaat — sigmoid of ReLU, in ons geval. De resulterende formule voor voorwaartse propagatie in de laag is als volgt:

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

waarbij aa de vector van neuronactivaties (outputs) is.

Laagklasse

De fundamentele bouwstenen van de perceptron zijn de lagen, daarom is het logisch om een aparte Layer-klasse te creëren. De attributen hiervan zijn:

  • inputs: een vector van inputs (n_inputs is het aantal inputs);
  • outputs: een vector van ruwe outputwaarden (voordat de activatiefunctie wordt toegepast) van de neuronen (n_neurons is het aantal neuronen);
  • weights: een gewichtenmatrix;
  • biases: een biasvector;
  • activation_function: de activatiefunctie die in de laag wordt gebruikt.

Net als bij de implementatie van een enkele neuron worden weights en biases geïnitialiseerd met willekeurige waarden tussen -1 en 1 uit een uniforme verdeling.

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

De attributen inputs en outputs zullen later worden gebruikt bij backpropagation, dus het is logisch om deze te initialiseren als NumPy-arrays gevuld met nullen.

Note
Opmerking

Het initialiseren van inputs en outputs als met nullen gevulde NumPy-arrays voorkomt fouten bij het uitvoeren van berekeningen in voorwaartse en achterwaartse propagatie. Het zorgt ook voor consistentie tussen lagen, waardoor soepele matrixbewerkingen mogelijk zijn zonder extra controles.

Voorwaartse propagatie kan worden geïmplementeerd in de forward()-methode, waarbij outputs worden berekend op basis van de inputs-vector met behulp van NumPy, volgens de bovenstaande formule:

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

Het herschikken van inputs naar een kolomvector zorgt voor correcte matrixvermenigvuldiging met de gewichtenmatrix tijdens de voorwaartse propagatie. Dit voorkomt vormfouten en maakt naadloze berekeningen over alle lagen mogelijk.

1. Wat maakt een multilayer perceptron (MLP) krachtiger dan een eenvoudige perceptron?

2. Waarom is het noodzakelijk om deze code toe te passen voordat inputs met de gewichtenmatrix wordt vermenigvuldigd?

question mark

Wat maakt een multilayer perceptron (MLP) krachtiger dan een eenvoudige perceptron?

Select the correct answer

question mark

Waarom is het noodzakelijk om deze code toe te passen voordat inputs met de gewichtenmatrix wordt vermenigvuldigd?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 3

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

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

bookPerceptron-Lagen

Veeg om het menu te tonen

Perceptron verwijst naar het eenvoudigste type neuraal netwerk, dat bestaat uit slechts één neuron. Voor het oplossen van complexere problemen wordt een model gebruikt dat bekend staat als een multilayer perceptron (MLP). Een multilayer perceptron bevat één of meer verborgen lagen die het netwerk in staat stellen om complexe patronen in gegevens te leren.

De structuur van een multilayer perceptron omvat:

  1. Invoerlaag: ontvangt de invoergegevens;
  2. Verborgen lagen: verwerken de gegevens en extraheren betekenisvolle patronen;
  3. Uitvoerlaag: levert de uiteindelijke voorspelling of classificatie.

Elke laag bestaat uit meerdere neuronen, en de uitvoer van de ene laag fungeert als de invoer voor de volgende laag.

Laaggewichten en Biases

Voordat een laag wordt geïmplementeerd, is het belangrijk te begrijpen hoe de gewichten en biases van elke neuron daarin worden opgeslagen. In het vorige hoofdstuk heb je geleerd hoe je de gewichten van een enkel neuron als een vector opslaat en de bias als een scalar (enkel getal).

Aangezien een laag uit meerdere neuronen bestaat, is het logisch om de gewichten als een matrix weer te geven, waarbij elke rij overeenkomt met de gewichten van een specifiek neuron. Bijgevolg kunnen biases worden weergegeven als een vector, waarvan de lengte gelijk is aan het aantal neuronen.

Gegeven een laag met 33 ingangen en 22 neuronen, worden de gewichten opgeslagen in een 2×32 \times 3 matrix WW en de biases in een 2×12 \times 1 vector bb, die er als volgt uitzien:

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}

Hier stelt element WijW_{ij} het gewicht voor van een jj-de ingang naar het ii-de neuron, dus de eerste rij bevat de gewichten van het eerste neuron en de tweede rij bevat de gewichten van het tweede neuron. Element bib_i stelt de bias voor van het ii-de neuron (twee neuronen – twee biases).

Voorwaartse propagatie

Het uitvoeren van voorwaartse propagatie voor elke laag betekent het activeren van elk van zijn neuronen door het gewogen totaal van de inputs te berekenen, de bias toe te voegen en de activatiefunctie toe te passen.

Eerder, voor een enkele neuron, implementeerde je het gewogen totaal van de inputs door een dotproduct te berekenen tussen de inputvector en de gewichtsvector en de bias toe te voegen.

Aangezien elke rij van de gewichtenmatrix de gewichtsvector voor een specifiek neuron bevat, hoef je nu alleen maar een dotproduct uit te voeren tussen elke rij van de matrix en de inputvector. Gelukkig is dit precies wat matrixvermenigvuldiging doet:

Om de biases toe te voegen aan de outputs van de respectievelijke neuronen, moet ook een vector van biases worden toegevoegd:

Ten slotte wordt de activatiefunctie toegepast op het resultaat — sigmoid of ReLU, in ons geval. De resulterende formule voor voorwaartse propagatie in de laag is als volgt:

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

waarbij aa de vector van neuronactivaties (outputs) is.

Laagklasse

De fundamentele bouwstenen van de perceptron zijn de lagen, daarom is het logisch om een aparte Layer-klasse te creëren. De attributen hiervan zijn:

  • inputs: een vector van inputs (n_inputs is het aantal inputs);
  • outputs: een vector van ruwe outputwaarden (voordat de activatiefunctie wordt toegepast) van de neuronen (n_neurons is het aantal neuronen);
  • weights: een gewichtenmatrix;
  • biases: een biasvector;
  • activation_function: de activatiefunctie die in de laag wordt gebruikt.

Net als bij de implementatie van een enkele neuron worden weights en biases geïnitialiseerd met willekeurige waarden tussen -1 en 1 uit een uniforme verdeling.

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

De attributen inputs en outputs zullen later worden gebruikt bij backpropagation, dus het is logisch om deze te initialiseren als NumPy-arrays gevuld met nullen.

Note
Opmerking

Het initialiseren van inputs en outputs als met nullen gevulde NumPy-arrays voorkomt fouten bij het uitvoeren van berekeningen in voorwaartse en achterwaartse propagatie. Het zorgt ook voor consistentie tussen lagen, waardoor soepele matrixbewerkingen mogelijk zijn zonder extra controles.

Voorwaartse propagatie kan worden geïmplementeerd in de forward()-methode, waarbij outputs worden berekend op basis van de inputs-vector met behulp van NumPy, volgens de bovenstaande formule:

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

Het herschikken van inputs naar een kolomvector zorgt voor correcte matrixvermenigvuldiging met de gewichtenmatrix tijdens de voorwaartse propagatie. Dit voorkomt vormfouten en maakt naadloze berekeningen over alle lagen mogelijk.

1. Wat maakt een multilayer perceptron (MLP) krachtiger dan een eenvoudige perceptron?

2. Waarom is het noodzakelijk om deze code toe te passen voordat inputs met de gewichtenmatrix wordt vermenigvuldigd?

question mark

Wat maakt een multilayer perceptron (MLP) krachtiger dan een eenvoudige perceptron?

Select the correct answer

question mark

Waarom is het noodzakelijk om deze code toe te passen voordat inputs met de gewichtenmatrix wordt vermenigvuldigd?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 3
some-alt