Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Perceptronlager | Neuronnätverk Från Grunden
Introduktion till neurala nätverk

bookPerceptronlager

Perceptron avser den enklaste typen av neuralt nätverk, som består av endast en neuron. För att hantera mer komplexa problem används en modell som kallas multilagerperceptron (MLP). En multilagerperceptron innehåller ett eller flera dolda lager som gör det möjligt för nätverket att lära sig invecklade mönster i data.

Strukturen för en multilagerperceptron inkluderar:

  1. Ingångslager: tar emot indata;
  2. Dolda lager: bearbetar data och extraherar meningsfulla mönster;
  3. Utgångslager: producerar den slutliga prediktionen eller klassificeringen.

Varje lager består av flera neuroner, och utgången från ett lager fungerar som indata till nästa lager.

Lagerns vikter och bias

Innan implementering av ett lager är det viktigt att förstå hur man lagrar vikterna och bias för varje neuron i lagret. I föregående kapitel lärde du dig hur man lagrar vikterna för en enskild neuron som en vektor och dess bias som en skalar (enskilt tal).

Eftersom ett lager består av flera neuroner är det naturligt att representera vikterna som en matris, där varje rad motsvarar vikterna för en specifik neuron. Följaktligen kan bias representeras som en vektor, vars längd är lika med antalet neuroner.

Givet ett lager med 33 indata och 22 neuroner, lagras dess vikter i en 2×32 \times 3 matris WW och dess bias lagras i en 2×12 \times 1 vektor bb, vilket ser ut så här:

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}

Här representerar elementet WijW_{ij} vikten för en jj:e indata till den ii:e neuronen, så den första raden innehåller vikterna för den första neuronen och den andra raden innehåller vikterna för den andra neuronen. Elementet bib_i representerar bias för den ii:e neuronen (två neuroner – två biasvärden).

Framåtriktad Propagering

Att utföra framåtriktad propagering för varje lager innebär att aktivera varje av dess neuroner genom att beräkna den viktade summan av indata, addera bias, och tillämpa aktiveringsfunktionen.

Tidigare, för en enskild neuron, implementerades den viktade summan av indata genom att beräkna en skalärprodukt mellan indatavektorn och viktvektorn samt addera bias.

Eftersom varje rad i viktmatrisen innehåller viktvektorn för en specifik neuron, behöver du nu endast utföra en skalärprodukt mellan varje rad i matrisen och indatavektorn. Lyckligtvis är det precis detta som matrismultiplikation gör:

För att addera bias till utdata från respektive neuron ska även en biasvektor adderas:

Slutligen tillämpas aktiveringsfunktionen på resultatet — sigmoid eller ReLU i vårt fall. Den resulterande formeln för framåtriktad propagering i lagret är följande:

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

där aa är vektorn av neuronaktiveringar (utdata).

Lagerklass

Perceptronens grundläggande byggstenar är dess lager, därför är det logiskt att skapa en separat Layer-klass. Dess attribut inkluderar:

  • inputs: en vektor av indata (n_inputs är antalet indata);
  • outputs: en vektor av råa utgångsvärden (innan aktiveringsfunktionen tillämpas) för neuronerna (n_neurons är antalet neuroner);
  • weights: en viktmatris;
  • biases: en bias-vektor;
  • activation_function: aktiveringsfunktionen som används i lagret.

Precis som i implementeringen av en enskild neuron kommer weights och biases att initialiseras med slumpmässiga värden mellan -1 och 1 dragna från en likformig fördelning.

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

Attributen inputs och outputs kommer att användas senare vid backpropagering, så det är logiskt att initiera dem som NumPy-arrayer fyllda med nollor.

Note
Notering

Att initiera inputs och outputs som nollfyllda NumPy-arrayer förhindrar fel vid beräkningar under framåt- och bakåtpropagering. Det säkerställer också konsekvens mellan lager, vilket möjliggör smidiga matrisoperationer utan behov av ytterligare kontroller.

Framåtpropagering kan implementeras i metoden forward(), där outputs beräknas baserat på inputs-vektorn med hjälp av NumPy, enligt formeln ovan:

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

Omformning av inputs till en kolumnvektor säkerställer korrekt matrismultiplikation med viktmatrisen under framåtriktad propagiering. Detta förhindrar formfel och möjliggör smidiga beräkningar över alla lager.

1. Vad gör en flerskiktsperceptron (MLP) mer kraftfull än en enkel perceptron?

2. Varför är det nödvändigt att använda denna kod innan inputs multipliceras med viktmatrisen?

question mark

Vad gör en flerskiktsperceptron (MLP) mer kraftfull än en enkel perceptron?

Select the correct answer

question mark

Varför är det nödvändigt att använda denna kod innan inputs multipliceras med viktmatrisen?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

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

bookPerceptronlager

Svep för att visa menyn

Perceptron avser den enklaste typen av neuralt nätverk, som består av endast en neuron. För att hantera mer komplexa problem används en modell som kallas multilagerperceptron (MLP). En multilagerperceptron innehåller ett eller flera dolda lager som gör det möjligt för nätverket att lära sig invecklade mönster i data.

Strukturen för en multilagerperceptron inkluderar:

  1. Ingångslager: tar emot indata;
  2. Dolda lager: bearbetar data och extraherar meningsfulla mönster;
  3. Utgångslager: producerar den slutliga prediktionen eller klassificeringen.

Varje lager består av flera neuroner, och utgången från ett lager fungerar som indata till nästa lager.

Lagerns vikter och bias

Innan implementering av ett lager är det viktigt att förstå hur man lagrar vikterna och bias för varje neuron i lagret. I föregående kapitel lärde du dig hur man lagrar vikterna för en enskild neuron som en vektor och dess bias som en skalar (enskilt tal).

Eftersom ett lager består av flera neuroner är det naturligt att representera vikterna som en matris, där varje rad motsvarar vikterna för en specifik neuron. Följaktligen kan bias representeras som en vektor, vars längd är lika med antalet neuroner.

Givet ett lager med 33 indata och 22 neuroner, lagras dess vikter i en 2×32 \times 3 matris WW och dess bias lagras i en 2×12 \times 1 vektor bb, vilket ser ut så här:

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}

Här representerar elementet WijW_{ij} vikten för en jj:e indata till den ii:e neuronen, så den första raden innehåller vikterna för den första neuronen och den andra raden innehåller vikterna för den andra neuronen. Elementet bib_i representerar bias för den ii:e neuronen (två neuroner – två biasvärden).

Framåtriktad Propagering

Att utföra framåtriktad propagering för varje lager innebär att aktivera varje av dess neuroner genom att beräkna den viktade summan av indata, addera bias, och tillämpa aktiveringsfunktionen.

Tidigare, för en enskild neuron, implementerades den viktade summan av indata genom att beräkna en skalärprodukt mellan indatavektorn och viktvektorn samt addera bias.

Eftersom varje rad i viktmatrisen innehåller viktvektorn för en specifik neuron, behöver du nu endast utföra en skalärprodukt mellan varje rad i matrisen och indatavektorn. Lyckligtvis är det precis detta som matrismultiplikation gör:

För att addera bias till utdata från respektive neuron ska även en biasvektor adderas:

Slutligen tillämpas aktiveringsfunktionen på resultatet — sigmoid eller ReLU i vårt fall. Den resulterande formeln för framåtriktad propagering i lagret är följande:

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

där aa är vektorn av neuronaktiveringar (utdata).

Lagerklass

Perceptronens grundläggande byggstenar är dess lager, därför är det logiskt att skapa en separat Layer-klass. Dess attribut inkluderar:

  • inputs: en vektor av indata (n_inputs är antalet indata);
  • outputs: en vektor av råa utgångsvärden (innan aktiveringsfunktionen tillämpas) för neuronerna (n_neurons är antalet neuroner);
  • weights: en viktmatris;
  • biases: en bias-vektor;
  • activation_function: aktiveringsfunktionen som används i lagret.

Precis som i implementeringen av en enskild neuron kommer weights och biases att initialiseras med slumpmässiga värden mellan -1 och 1 dragna från en likformig fördelning.

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

Attributen inputs och outputs kommer att användas senare vid backpropagering, så det är logiskt att initiera dem som NumPy-arrayer fyllda med nollor.

Note
Notering

Att initiera inputs och outputs som nollfyllda NumPy-arrayer förhindrar fel vid beräkningar under framåt- och bakåtpropagering. Det säkerställer också konsekvens mellan lager, vilket möjliggör smidiga matrisoperationer utan behov av ytterligare kontroller.

Framåtpropagering kan implementeras i metoden forward(), där outputs beräknas baserat på inputs-vektorn med hjälp av NumPy, enligt formeln ovan:

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

Omformning av inputs till en kolumnvektor säkerställer korrekt matrismultiplikation med viktmatrisen under framåtriktad propagiering. Detta förhindrar formfel och möjliggör smidiga beräkningar över alla lager.

1. Vad gör en flerskiktsperceptron (MLP) mer kraftfull än en enkel perceptron?

2. Varför är det nödvändigt att använda denna kod innan inputs multipliceras med viktmatrisen?

question mark

Vad gör en flerskiktsperceptron (MLP) mer kraftfull än en enkel perceptron?

Select the correct answer

question mark

Varför är det nödvändigt att använda denna kod innan inputs multipliceras med viktmatrisen?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 3
some-alt