Комірки LSTM і GRU

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

Michal Oleszak

Machine Learning Engineer

Проблема короткої памʼяті

  • Комірки RNN зберігають памʼять через прихований стан
  • Ця памʼять дуже короткочасна
  • Дві потужніші комірки розвʼязують проблему:
    • комірка LSTM (Long Short-Term Memory)
    • комірка GRU (Gated Recurrent Unit)

Схема рекурентного нейрона. На кроці часу 2 він отримує вхідні h2 та x2 і видає виходи y2 та h3.

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

Комірка RNN

Схема комірки RNN.

  • Два входи:
    • поточні вхідні дані x
    • попередній прихований стан h
  • Два виходи:
    • поточний вихід y
    • наступний прихований стан h
Середній рівень Deep Learning з PyTorch

Комірка LSTM

Схема комірки LSTM.

  • Виходи h і y ті самі
  • Три входи й виходи (два приховані стани):

    • h: короткочасний стан
    • c: довготривалий стан
  • Три «ворота»:

    • Forget gate: що прибрати з довготривалої памʼяті
    • Input gate: що зберегти в довготривалій памʼяті
    • Output gate: що видати на поточному кроці
Середній рівень Deep Learning з PyTorch

LSTM у PyTorch

class Net(nn.Module):
    def __init__(self, input_size):
        super().__init__()

self.lstm = nn.LSTM( input_size=1, hidden_size=32, num_layers=2, batch_first=True, ) self.fc = nn.Linear(32, 1)
def forward(self, x): h0 = torch.zeros(2, x.size(0), 32) c0 = torch.zeros(2, x.size(0), 32)
out, _ = self.lstm(x, (h0, c0))
out = self.fc(out[:, -1, :]) return out
  • __init__():
    • Замініть nn.RNN на nn.LSTM
  • forward():
    • Додайте ще один прихований стан c
    • Ініціалізуйте c і h нулями
    • Передайте обидва стани до шару lstm
Середній рівень Deep Learning з PyTorch

Комірка GRU

Схема комірки GRU.

  • Спрощена версія комірки LSTM
  • Лише один прихований стан
  • Немає вихідних воріт
Середній рівень Deep Learning з PyTorch

GRU у PyTorch

class Net(nn.Module):
    def __init__(self, input_size):
        super().__init__()

self.gru = nn.GRU( input_size=1, hidden_size=32, num_layers=2, batch_first=True, ) self.fc = nn.Linear(32, 1)
def forward(self, x): h0 = torch.zeros(2, x.size(0), 32) out, _ = self.gru(x, h0) out = self.fc(out[:, -1, :]) return out
  • __init__():
    • Замініть nn.RNN на nn.GRU
  • forward():
    • Використайте шар gru
Середній рівень Deep Learning з PyTorch

Використовувати RNN, LSTM чи GRU?

  • RNN майже не використовують
  • GRU простіша за LSTM = менше обчислень
  • Відносна ефективність залежить від задачі
  • Спробуйте обидва та порівняйте

Схеми комірок LSTM і GRU.

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

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

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

Preparing Video For Download...