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 är namnet på det enklaste neurala nätverket, bestående av endast en neuron. För att kunna lösa mer komplexa problem kommer vi dock att skapa en modell som kallas multilagerperceptron (MLP). En multilagerperceptron består av ett eller flera dolda lager. Strukturen för en multilagerperceptron ser ut så här:

  1. Ett inmatningslager: tar emot indata;
  2. Dolda lager: dessa lager bearbetar data och extraherar mönster.
  3. Utmatningslager: producerar den slutliga prediktionen eller klassificeringen.

Generellt består varje lager av flera neuroner, och utdata från ett lager blir indata till nästa lager.

Lagerns vikter och bias

Innan vi implementerar 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, kommer dess vikter att lagras 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å bias).

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, lägga till bias, och tillämpa aktiveringsfunktionen.

Tidigare, för en enskild neuron, implementerade du viktad summa av indata genom att beräkna en skalärprodukt mellan indatavektorn och viktvektorn samt lägga till 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 detta exakt vad matrismultiplikation gör:

För att lägga till bias till utdata från respektive neuron, ska en biasvektor också 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 utdata (innan aktiveringsfunktionen tillämpas) från 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 enskilda neuroner 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 lämpligt 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
Notering

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 genom alla lager.

1. Vad gör ett flerskiktsperceptron (MLP) mer kraftfullt än ett enkelt perceptron?

2. Varför använder vi denna kod innan vi multiplicerar inputs med viktmatrisen?

question mark

Vad gör ett flerskiktsperceptron (MLP) mer kraftfullt än ett enkelt perceptron?

Select the correct answer

question mark

Varför använder vi denna kod innan vi multiplicerar inputs 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

Awesome!

Completion rate improved to 4

bookPerceptronlager

Svep för att visa menyn

Perceptron är namnet på det enklaste neurala nätverket, bestående av endast en neuron. För att kunna lösa mer komplexa problem kommer vi dock att skapa en modell som kallas multilagerperceptron (MLP). En multilagerperceptron består av ett eller flera dolda lager. Strukturen för en multilagerperceptron ser ut så här:

  1. Ett inmatningslager: tar emot indata;
  2. Dolda lager: dessa lager bearbetar data och extraherar mönster.
  3. Utmatningslager: producerar den slutliga prediktionen eller klassificeringen.

Generellt består varje lager av flera neuroner, och utdata från ett lager blir indata till nästa lager.

Lagerns vikter och bias

Innan vi implementerar 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, kommer dess vikter att lagras 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å bias).

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, lägga till bias, och tillämpa aktiveringsfunktionen.

Tidigare, för en enskild neuron, implementerade du viktad summa av indata genom att beräkna en skalärprodukt mellan indatavektorn och viktvektorn samt lägga till 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 detta exakt vad matrismultiplikation gör:

För att lägga till bias till utdata från respektive neuron, ska en biasvektor också 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 utdata (innan aktiveringsfunktionen tillämpas) från 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 enskilda neuroner 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 lämpligt 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
Notering

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 genom alla lager.

1. Vad gör ett flerskiktsperceptron (MLP) mer kraftfullt än ett enkelt perceptron?

2. Varför använder vi denna kod innan vi multiplicerar inputs med viktmatrisen?

question mark

Vad gör ett flerskiktsperceptron (MLP) mer kraftfullt än ett enkelt perceptron?

Select the correct answer

question mark

Varför använder vi denna kod innan vi multiplicerar inputs 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