Sönen ve taşan gradyanlar

PyTorch ile Orta Düzey Deep Learning

Michal Oleszak

Machine Learning Engineer

Sönen gradyanlar

  • Geri yayılımda gradyanlar giderek küçülür
  • Erken katmanlar küçük parametre güncellemeleri alır
  • Model öğrenemez

Gradyan boyutu ve katman indeksi grafikleri: erken katmanlarda gradyanlar daha küçüktür

PyTorch ile Orta Düzey Deep Learning

Taşan gradyanlar

  • Gradyanlar giderek büyür
  • Parametre güncellemeleri aşırı büyüktür
  • Eğitim ıraksar

Gradyan boyutu ve katman indeksi grafikleri: erken katmanlarda gradyanlar daha büyüktür

PyTorch ile Orta Düzey Deep Learning

Dengesiz gradyanlara çözüm

  1. Doğru ağırlık başlatma
  2. Uygun aktivasyonlar
  3. Batch normalization

 

 

Üç adım

PyTorch ile Orta Düzey Deep Learning

Ağırlık başlatma

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]])
PyTorch ile Orta Düzey Deep Learning

Ağırlık başlatma

İyi başlangıç şunları sağlar:

  • Katman girdi varyansı = katman çıktı varyansı
  • Katmandan önce/sonra gradyan varyansı aynı

 

Bunu sağlama yöntemi aktivasyona bağlıdır:

  • ReLU ve benzerleri için He/Kaiming başlangıcı kullanılır
PyTorch ile Orta Düzey Deep Learning

Ağırlık başlatma

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]])
PyTorch ile Orta Düzey Deep Learning

He / Kaiming başlatma

init.kaiming_uniform_(self.fc1.weight)
init.kaiming_uniform_(self.fc2.weight)
init.kaiming_uniform_(
  self.fc3.weight,
  nonlinearity="sigmoid",
)
PyTorch ile Orta Düzey Deep Learning

He / Kaiming başlatma

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







PyTorch ile Orta Düzey Deep Learning

Aktivasyon fonksiyonları

ReLU fonksiyonunu gösteren grafik. Sıfırın altında çizgi sıfırda yatay; sıfırın üstünde pozitif eğimli.

  • Sıklıkla varsayılan aktivasyon
  • nn.functional.relu()
  • Negatif girdilerde sıfır — ölen nöronlar

ELU fonksiyonunu gösteren grafik. ReLU'ya benzer, ancak negatiften pozitife yumuşak geçişlidir.

  • nn.functional.elu()
  • Negatif değerler için sıfır olmayan gradyanlar — ölen nöronlara karşı yardımcı
  • Ortalama çıktı sıfır civarı — sönen gradyanlara karşı yardımcı
PyTorch ile Orta Düzey Deep Learning

Batch normalization

Bir katmandan sonra:

  1. Çıktıları şu şekilde normalize edin:

    • Ortalamayı çıkarın
    • Standart sapmaya bölün
  2. Normalize çıktıları öğrenilen parametrelerle ölçekleyip kaydırın

Model her katman için en iyi girdi dağılımını öğrenir:

  • Kayıp daha hızlı düşer
  • Dengesiz gradyanlara karşı yardımcıdır
PyTorch ile Orta Düzey Deep Learning

Batch normalization

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) ...
PyTorch ile Orta Düzey Deep Learning

Haydi pratik yapalım!

PyTorch ile Orta Düzey Deep Learning

Preparing Video For Download...