Зникаючі та вибухові градієнти

Середній рівень Deep Learning з PyTorch

Michal Oleszak

Machine Learning Engineer

Зникаючі градієнти

  • Градієнти зменшуються під час зворотного проходу
  • Ранні шари отримують малі оновлення параметрів
  • Модель не навчається

Графіки «розмір градієнта vs індекс шару»: для ранніх шарів градієнти менші

Середній рівень Deep Learning з PyTorch

Вибухові градієнти

  • Градієнти дедалі більші
  • Оновлення параметрів надто великі
  • Навчання розходиться

Графіки «розмір градієнта vs індекс шару»: для ранніх шарів градієнти більші

Середній рівень Deep Learning з PyTorch

Розв'язання нестабільних градієнтів

  1. Правильна ініціалізація ваг
  2. Вдалі активації
  3. Batch normalization

 

 

Три кроки

Середній рівень Deep Learning з PyTorch

Ініціалізація ваг

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 з PyTorch

Ініціалізація ваг

Гарна ініціалізація забезпечує:

  • Дисперсія входів шару = дисперсії виходів
  • Дисперсія градієнтів однакова до й після шару

 

Як цього досягти залежить від активації:

  • Для ReLU та подібних — He/Kaiming ініціалізація
Середній рівень Deep Learning з PyTorch

Ініціалізація ваг

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 з PyTorch

He / Kaiming ініціалізація

init.kaiming_uniform_(self.fc1.weight)
init.kaiming_uniform_(self.fc2.weight)
init.kaiming_uniform_(
  self.fc3.weight,
  nonlinearity="sigmoid",
)
Середній рівень Deep Learning з PyTorch

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 з PyTorch

Функції активації

Графік функції ReLU. Для значень нижче нуля лінія горизонтальна на нулі; для значень вище нуля — пряма з додатним нахилом.

  • Часто використовується як типова активація
  • nn.functional.relu()
  • Нуль для від'ємних входів — «вмираючі» нейрони

Графік функції ELU. Подібна до ReLU, але має плавний перехід із від'ємних значень у додатну область.

  • nn.functional.elu()
  • Ненульові градієнти для від'ємних значень — допомагає проти «вмираючих» нейронів
  • Середній вихід близько нуля — допомагає проти зникаючих градієнтів
Середній рівень Deep Learning з PyTorch

Batch normalization

Після шару:

  1. Нормалізуйте виходи шару:

    • Відніміть середнє
    • Поділіть на стандартне відхилення
  2. Масштабуйте й зсуньте нормалізовані виходи за навчуваними параметрами

Модель вчиться оптимальному розподілу входів для кожного шару:

  • Швидше зменшується втрата
  • Допомагає проти нестабільних градієнтів
Середній рівень Deep Learning з 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 з PyTorch

Давайте потренуємось!

Середній рівень Deep Learning з PyTorch

Preparing Video For Download...