Zanikające i eksplodujące gradienty

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Michal Oleszak

Machine Learning Engineer

Zanikające gradienty

  • Gradienty maleją podczas propagacji wstecznej
  • Wcześniejsze warstwy otrzymują małe aktualizacje parametrów
  • Model nie uczy się

Wykresy przedstawiające rozmiar gradientu w zależności od indeksu warstwy: dla wcześniejszych warstw gradienty są mniejsze

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Eksplodujące gradienty

  • Gradienty rosną podczas propagacji wstecznej
  • Aktualizacje parametrów są zbyt duże
  • Trenowanie traci stabilność

Wykresy przedstawiające rozmiar gradientu w zależności od indeksu warstwy: dla wcześniejszych warstw gradienty są większe

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Rozwiązanie problemu niestabilnych gradientów

  1. Właściwa inicjalizacja wag
  2. Odpowiednie funkcje aktywacji
  3. Normalizacja wsadowa

 

 

Trzy kroki

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Inicjalizacja wag

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]])
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Inicjalizacja wag

Dobra inicjalizacja zapewnia:

  • Wariancja wejść = wariancja wyjść warstwy
  • Wariancja gradientów taka sama przed i po warstwie

 

Zależy to od funkcji aktywacji:

  • Dla ReLU i podobnych – inicjalizacja He/Kaiming
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Inicjalizacja wag

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]])
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Inicjalizacja He / Kaiming

init.kaiming_uniform_(self.fc1.weight)
init.kaiming_uniform_(self.fc2.weight)
init.kaiming_uniform_(
  self.fc3.weight,
  nonlinearity="sigmoid",
)
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Inicjalizacja He / Kaiming

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







Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Funkcje aktywacji

Wykres funkcji ReLU. Poniżej zera linia jest pozioma; powyżej zera ma dodatnie nachylenie.

  • Często stosowana jako domyślna aktywacja
  • nn.functional.relu()
  • Zero dla ujemnych wejść – problem obumierających neuronów

Wykres funkcji ELU. Podobna do ReLU, lecz z gładkim przejściem dla wartości ujemnych.

  • nn.functional.elu()
  • Niezerowe gradienty dla wartości ujemnych – ogranicza problem obumierających neuronów
  • Średnie wyjście bliskie zeru – pomaga przy zanikających gradientach
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Normalizacja wsadowa

Po każdej warstwie:

  1. Normalizacja wyjść warstwy przez:

    • Odjęcie średniej
    • Podzielenie przez odchylenie standardowe
  2. Skalowanie i przesunięcie znormalizowanych wyjść – parametry wyuczone

Model uczy się optymalnego rozkładu wejść dla każdej warstwy:

  • Szybszy spadek funkcji straty
  • Pomaga przy niestabilnych gradientach
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Normalizacja wsadowa

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) ...
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Czas na ćwiczenia!

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Preparing Video For Download...