Ячейки LSTM и GRU

Глубокое обучение на PyTorch: средний уровень

Michal Oleszak

Machine Learning Engineer

Проблема краткосрочной памяти

  • Ячейки RNN хранят память в скрытом состоянии
  • Эта память очень краткосрочная
  • Две более мощные ячейки решают эту проблему:
    • Ячейка LSTM (Long Short-Term Memory)
    • Ячейка GRU (Gated Recurrent Unit)

Схема рекуррентного нейрона. На шаге 2 он получает входы h2 и x2, и выдаёт выходы y2 и h3.

Глубокое обучение на PyTorch: средний уровень

Ячейка RNN

Схема ячейки RNN.

  • Два входа:
    • текущие входные данные x
    • предыдущее скрытое состояние h
  • Два выхода:
    • текущий выход y
    • следующее скрытое состояние h
Глубокое обучение на PyTorch: средний уровень

Ячейка LSTM

Схема ячейки LSTM.

  • Выходы h и y совпадают
  • Три входа и выхода (два скрытых состояния):

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

    • Вентиль забывания: что удалить из долгосрочной памяти
    • Входной вентиль: что сохранить в долгосрочной памяти
    • Выходной вентиль: что вернуть на текущем шаге
Глубокое обучение на 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
Глубокое обучение на PyTorch: средний уровень

Ячейка GRU

Схема ячейки GRU.

  • Упрощённая версия ячейки LSTM
  • Только одно скрытое состояние
  • Нет выходного вентиля
Глубокое обучение на 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
Глубокое обучение на PyTorch: средний уровень

Что выбрать: RNN, LSTM или GRU?

  • RNN практически не используется
  • GRU проще LSTM — меньше вычислений
  • Относительная производительность зависит от задачи
  • Попробуйте оба и сравните

Схемы ячеек LSTM и GRU.

Глубокое обучение на PyTorch: средний уровень

Давайте потренируемся!

Глубокое обучение на PyTorch: средний уровень

Preparing Video For Download...