Verwijnende en exploderende gradiënten

Gevorderde Deep Learning met PyTorch

Michal Oleszak

Machine Learning Engineer

Verwijnende gradiënten

  • Gradiënten worden steeds kleiner tijdens backprop
  • Vroege lagen krijgen kleine parameterupdates
  • Model leert niet

Grafieken met gradiëntgrootte versus laagindex: voor vroege lagen zijn de gradiënten kleiner

Gevorderde Deep Learning met PyTorch

Exploderende gradiënten

  • Gradiënten worden steeds groter
  • Parameterupdates zijn te groot
  • Training divergeert

Grafieken met gradiëntgrootte versus laagindex: voor vroege lagen zijn de gradiënten groter

Gevorderde Deep Learning met PyTorch

Oplossing voor onstabiele gradiënten

  1. Juiste gewichtsinitialisatie
  2. Goede activaties
  3. Batch-normalisatie

 

 

Drie stappen

Gevorderde Deep Learning met PyTorch

Initialisatie van gewichten

layer = nn.Linear(8, 1)
print(layer.weight)
Parameter containing:
tensor([[-0.0195,  0.0992,  0.0391,  0.0212,
         -0.3386, -0.1892, -0.3170,  0.2148]])
Gevorderde Deep Learning met PyTorch

Initialisatie van gewichten

Goede initialisatie zorgt voor:

  • Varianties van laaginputs = varianties van laagoutputs
  • Varianties van gradiënten gelijk vóór en na een laag

 

Hoe je dit bereikt hangt af van de activatie:

  • Voor ReLU en vergelijkbare: gebruik He/Kaiming-initialisatie
Gevorderde Deep Learning met PyTorch

Initialisatie van gewichten

import torch.nn.init as init

init.kaiming_uniform_(layer.weight)
print(layer.weight)
Parameter containing:
tensor([[-0.3063, -0.2410,  0.0588,  0.2664,
          0.0502, -0.0136,  0.2274,  0.0901]])
Gevorderde Deep Learning met PyTorch

He-/Kaiming-initialisatie

init.kaiming_uniform_(self.fc1.weight)
init.kaiming_uniform_(self.fc2.weight)
init.kaiming_uniform_(
  self.fc3.weight,
  nonlinearity="sigmoid",
)
Gevorderde Deep Learning met PyTorch

He-/Kaiming-initialisatie

import torch.nn as nn
import torch.nn.init as init

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(9, 16)
        self.fc2 = nn.Linear(16, 8)
        self.fc3 = nn.Linear(8, 1)


init.kaiming_uniform_(self.fc1.weight) init.kaiming_uniform_(self.fc2.weight) init.kaiming_uniform_( self.fc3.weight, nonlinearity="sigmoid", )




    def forward(self, x):
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = nn.functional.sigmoid(self.fc3(x))
        return x







Gevorderde Deep Learning met PyTorch

Activatiefuncties

Een grafiek van de ReLU-functie. Onder nul is de lijn horizontaal op nul; boven nul heeft de lijn een positieve helling.

  • Vaak de standaardactivatie
  • nn.functional.relu()
  • Nul voor negatieve inputs – dode neuronen

Een grafiek van de ELU-functie. Lijkt op ReLU maar met een vloeiende, kromme overgang van negatieve naar positieve waarden.

  • nn.functional.elu()
  • Niet-nul gradiënten voor negatieve waarden – helpt tegen dode neuronen
  • Gemiddelde output rond nul – helpt tegen verdwijnende gradiënten
Gevorderde Deep Learning met PyTorch

Batch-normalisatie

Na een laag:

  1. Normaliseer de outputs door:

    • Het gemiddelde af te trekken
    • Te delen door de standaarddeviatie
  2. Schaal en verschuif genormaliseerde outputs met geleerde parameters

Model leert de optimale inputverdeling per laag:

  • Snellere verliesdaling
  • Helpt tegen onstabiele gradiënten
Gevorderde Deep Learning met PyTorch

Batch-normalisatie

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(9, 16)
        self.bn1 = nn.BatchNorm1d(16)

        ...


def forward(self, x): x = self.fc1(x) x = self.bn1(x) x = nn.functional.elu(x) ...
Gevorderde Deep Learning met PyTorch

Laten we oefenen!

Gevorderde Deep Learning met PyTorch

Preparing Video For Download...