Gradien menghilang dan meledak

Deep Learning Lanjutan dengan PyTorch

Michal Oleszak

Machine Learning Engineer

Gradien menghilang

  • Gradien makin kecil saat backward pass
  • Layer awal hanya dapat pembaruan parameter kecil
  • Model tidak belajar

Grafik ukuran gradien vs indeks layer: pada layer awal, gradien lebih kecil

Deep Learning Lanjutan dengan PyTorch

Gradien meledak

  • Gradien makin besar
  • Pembaruan parameter terlalu besar
  • Pelatihan menyimpang

Grafik ukuran gradien vs indeks layer: pada layer awal, gradien lebih besar

Deep Learning Lanjutan dengan PyTorch

Solusi untuk gradien tidak stabil

  1. Inisialisasi bobot yang tepat
  2. Aktivasi yang baik
  3. Batch normalization

 

 

Tiga langkah

Deep Learning Lanjutan dengan PyTorch

Inisialisasi bobot

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]])
Deep Learning Lanjutan dengan PyTorch

Inisialisasi bobot

Inisialisasi yang baik memastikan:

  • Varian input layer = varian output layer
  • Varian gradien sama sebelum dan sesudah layer

 

Cara mencapainya bergantung pada aktivasi:

  • Untuk ReLU dan sejenisnya, gunakan inisialisasi He/Kaiming
Deep Learning Lanjutan dengan PyTorch

Inisialisasi bobot

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]])
Deep Learning Lanjutan dengan PyTorch

Inisialisasi He / Kaiming

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

Inisialisasi 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







Deep Learning Lanjutan dengan PyTorch

Fungsi aktivasi

Plot fungsi ReLU. Untuk nilai di bawah nol, garis mendatar di nol; untuk nilai di atas nol, garis berlereng positif.

  • Sering jadi aktivasi default
  • nn.functional.relu()
  • Nol untuk input negatif — neuron mati

Plot fungsi ELU. Mirip ReLU namun transisi negatif ke positif mulus dan melengkung.

  • nn.functional.elu()
  • Gradien tidak nol untuk nilai negatif — mengatasi neuron mati
  • Rata-rata output sekitar nol — bantu cegah gradien menghilang
Deep Learning Lanjutan dengan PyTorch

Batch normalization

Setelah suatu layer:

  1. Normalisasi output layer dengan:

    • Mengurangkan mean
    • Membagi dengan standar deviasi
  2. Skala dan geser output ter-normalisasi pakai parameter terpelajar

Model mempelajari sebaran input optimal per layer:

  • Penurunan loss lebih cepat
  • Bantu atasi gradien tidak stabil
Deep Learning Lanjutan dengan PyTorch

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) ...
Deep Learning Lanjutan dengan PyTorch

Ayo berlatih!

Deep Learning Lanjutan dengan PyTorch

Preparing Video For Download...