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

bookPerceptronlagen

Perceptron is de naam van het eenvoudigste neuraal netwerk, bestaande uit slechts één neuron. Om echter complexere problemen te kunnen oplossen, creëren we een model genaamd multilayer perceptron (MLP). Een multilayer perceptron bestaat uit één of meer verborgen lagen. De structuur van een multilayer perceptron ziet er als volgt uit:

  1. Een invoerlaag: ontvangt de invoergegevens;
  2. Verborgen lagen: deze lagen verwerken de gegevens en halen patronen eruit.
  3. Uitvoerlaag: produceert de uiteindelijke voorspelling of classificaties.

In het algemeen bestaat elke laag uit meerdere neuronen, en de uitvoer van de ene laag wordt de invoer voor de volgende laag.

Laaggewichten en Biases

Voordat we een laag implementeren, 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 enkele 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 te representeren, waarbij elke rij overeenkomt met de gewichten van een specifieke 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 input naar de ii-de neuron, dus de eerste rij bevat de gewichten van de eerste neuron en de tweede rij bevat de gewichten van de tweede neuron. Element bib_i stelt de bias voor van de 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 berekenen van de gewogen som van de inputs, het toevoegen van de bias, en het toepassen van de activatiefunctie.

Eerder, voor een enkele neuron, implementeerde je de gewogen som 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 uitgangen 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 (uitgangen) is.

Laagklasse

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

  • 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 getrokken 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 passen we deze code toe voordat we inputs met de gewichtenmatrix vermenigvuldigen?

question mark

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

Select the correct answer

question mark

Waarom passen we deze code toe voordat we inputs met de gewichtenmatrix vermenigvuldigen?

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.

Awesome!

Completion rate improved to 4

bookPerceptronlagen

Veeg om het menu te tonen

Perceptron is de naam van het eenvoudigste neuraal netwerk, bestaande uit slechts één neuron. Om echter complexere problemen te kunnen oplossen, creëren we een model genaamd multilayer perceptron (MLP). Een multilayer perceptron bestaat uit één of meer verborgen lagen. De structuur van een multilayer perceptron ziet er als volgt uit:

  1. Een invoerlaag: ontvangt de invoergegevens;
  2. Verborgen lagen: deze lagen verwerken de gegevens en halen patronen eruit.
  3. Uitvoerlaag: produceert de uiteindelijke voorspelling of classificaties.

In het algemeen bestaat elke laag uit meerdere neuronen, en de uitvoer van de ene laag wordt de invoer voor de volgende laag.

Laaggewichten en Biases

Voordat we een laag implementeren, 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 enkele 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 te representeren, waarbij elke rij overeenkomt met de gewichten van een specifieke 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 input naar de ii-de neuron, dus de eerste rij bevat de gewichten van de eerste neuron en de tweede rij bevat de gewichten van de tweede neuron. Element bib_i stelt de bias voor van de 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 berekenen van de gewogen som van de inputs, het toevoegen van de bias, en het toepassen van de activatiefunctie.

Eerder, voor een enkele neuron, implementeerde je de gewogen som 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 uitgangen 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 (uitgangen) is.

Laagklasse

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

  • 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 getrokken 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 passen we deze code toe voordat we inputs met de gewichtenmatrix vermenigvuldigen?

question mark

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

Select the correct answer

question mark

Waarom passen we deze code toe voordat we inputs met de gewichtenmatrix vermenigvuldigen?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 3
some-alt