Функция PyTorch torch.nn.LSTM
Справочное руководство PyTorch torch.nn
torch.nn.LSTMЭто модуль в PyTorch для сетей долгой краткосрочной памяти.
LSTM — это особый тип рекуррентной нейронной сети, который может изучать долгосрочные зависимости и широко используется в задачах моделирования последовательностей.
Определение функции
torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True, batch_first=True, dropout=0, bidirectional=False)
Описание параметров:
input_size(int): Размерность входных признаков.hidden_size(int): Размерность скрытого состояния.num_layers(int): Количество слоёв LSTM. По умолчанию 1.bias(bool): Использовать ли смещение. По умолчанию True.batch_first(bool): Если True, форма входа и выхода — (batch, seq, feature). По умолчанию True.dropout(float): Dropout, применяемый для не последних слоёв. По умолчанию 0.bidirectional(bool): Использовать ли двунаправленный LSTM. По умолчанию False.
Входы и выходы
Входы:
input: Тензор формы (batch, seq_len, input_size)h_0: Начальное скрытое состояние, форма (num_layers * num_directions, batch, hidden_size)c_0: Начальное состояние ячейки, форма (num_layers * num_directions, batch, hidden_size)
Выходы:
output: Выход последнего скрытого слоя, форма (batch, seq_len, num_directions * hidden_size)h_n: Последнее скрытое состояние всех слоёвc_n: Последнее состояние ячейки всех слоёв
Примеры использования
Пример 1: Базовое использование
Создание и использование LSTM:
Пример
import torch.nn as nn
# Создать LSTM: размер входа 256, размер скрытого состояния 512, 2 слоя
lstm = nn.LSTM(input_size=256, hidden_size=512, num_layers=2, batch_first=True)
# Создать вход: batch=4, длина последовательности=10, размер входа=256
input_tensor = torch.randn(4, 10, 256)
# Прямой проход
output, (h_n, c_n) = lstm(input_tensor)
print("Размер входа:", input_tensor.shape)
print("Форма выхода:", output.shape) # (4, 10, 512)
print("Размер скрытого состояния:", h_n.shape) # (2, 4, 512)
print("Размер состояния ячейки:", c_n.shape) # (2, 4, 512)
Пример 2: двунаправленная LSTM
Используйте двунаправленную LSTM для захвата двунаправленного контекста:
Пример
import torch.nn as nn
# Двунаправленная LSTM
bilstm = nn.LSTM(input_size=256, hidden_size=256, num_layers=2, batch_first=True, bidirectional=True)
input_tensor = torch.randn(4, 10, 256)
output, (h_n, c_n) = bilstm(input_tensor)
print("Размер выхода двунаправленной LSTM:", output.shape) # (4, 10, 512) = 256*2
print("Размер скрытого состояния:", h_n.shape) # (4, 4, 256) = 2 слоя * 2 направления
print("Скрытое состояние последнего слоя:", h_n[-2:, :, :].shape) # Прямой и обратный проход
Пример 3: Инициализация скрытого состояния
Инициализировать скрытое состояние вручную:
Пример
import torch.nn as nn
lstm = nn.LSTM(input_size=256, hidden_size=512, batch_first=True)
# Вручную создать начальное скрытое состояние
batch_size = 4
num_layers = 2
hidden_size = 512
h_0 = torch.zeros(num_layers, batch_size, hidden_size)
c_0 = torch.zeros(num_layers, batch_size, hidden_size)
# Передать начальное состояние
input_tensor = torch.randn(4, 10, 256)
output, (h_n, c_n) = lstm(input_tensor, (h_0, c_0))
print("Завершено с пользовательским начальным состоянием")
print("Форма выхода:", output.shape)
Пример 4: Полная модель классификации тональности
Классификация текста на основе LSTM:
Пример
import torch.nn as nn
class LSTMClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes=2):
super(LSTMClassifier, self).__init__()
# Слой эмбеддингов
self.embedding = nn.Embedding(vocab_size, embed_dim, padding_idx=0)
# Слой LSTM
self.lstm = nn.LSTM(
input_size=embed_dim,
hidden_size=hidden_dim,
num_layers=2,
batch_first=True,
bidirectional=True,
dropout=0.3
)
# Полносвязный слой классификации
self.fc = nn.Linear(hidden_dim * 2, num_classes)
def forward(self, x):
# x: (batch, seq_len)
embedded = self.embedding(x) # (batch, seq_len, embed_dim)
# Выход LSTM
output, (hidden, cell) = self.lstm(embedded)
# Конкатенировать скрытые состояния последнего двунаправленного слоя
# hidden: (4, batch, hidden_dim) - 2 слоя * 2 направления
hidden = torch.cat([hidden[-2], hidden[-1]], dim=1) # (batch, hidden_dim*2)
# Классификация
logits = self.fc(hidden)
return logits
# Создать экземпляр модели
vocab_size = 10000
model = LSTMClassifier(vocab_size=vocab_size, embed_dim=128, hidden_dim=128, num_classes=2)
# Тестовый вход: batch=8, длина последовательности=50
input_ids = torch.randint(1, vocab_size, (8, 50))
output = model(input_ids)
print("Структура модели:")
print(model)
print("nФорма входных данных:", input_ids.shape)
print("Форма выхода:", output.shape) # (8, 2)
Пример 5: Многослойная стекированная LSTM
Глубокая LSTM-сеть:
Пример
import torch.nn as nn
# 4-слойная составная LSTM с dropout
deep_lstm = nn.LSTM(
input_size=256,
hidden_size=512,
num_layers=4,
batch_first=True,
dropout=0.4 # Dropout между слоями
)
input_tensor = torch.randn(2, 20, 256)
output, (h_n, c_n) = deep_lstm(input_tensor)
print("Форма выхода 4-слойной LSTM:", output.shape)
print("Форма скрытого состояния (4 слоя):", h_n.shape)
print("Форма состояния ячейки (4 слоя):", c_n.shape)
Понятие вентилей LSTM
LSTM управляет потоком информации через три вентиля:
- Вентиль забывания: Определяет, сколько информации из предыдущего временного шага сохранить
- Входной вентиль: Определяет, сколько новой информации добавить
- Выходной вентиль: Определяет, сколько информации выводить
ЧАВО
Вопрос 1: Что означает batch_first=True?
Первое измерение входных и выходных тензоров — это batch_size. Если False, первое измерение — это длина последовательности.
Вопрос 2: Когда следует использовать двунаправленный LSTM?
Задачи, требующие двунаправленного контекста, такие как разметка последовательностей и анализ тональности. В машинном переводе часто используется архитектура encoder-decoder.
Вопрос 3: Как выбрать размер скрытого слоя?
Обычно 128-512, корректируется в зависимости от сложности задачи и объёма данных. Слишком маленький приводит к недообучению, слишком большой — к переобучению.
Сценарии использования
nn.LSTMОсновные сценарии применения включают:
- Обработка естественного языка: Классификация текста, распознавание именованных сущностей
- Прогнозирование временных рядов: Прогнозирование курса акций, распознавание речи
- Задачи sequence-to-sequence: Машинный перевод, генерация текста
Совет: При использовании bidirectional=True размерность выхода становится hidden_size * 2.
Другие расширения