Функция PyTorch torch.nn.LSTM

PyTorch torch.nn 参考手册Справочное руководство 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
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
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
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
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
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.


PyTorch torch.nn 参考手册Справочное руководство PyTorch torch.nn

Другие расширения