LSTM_AND_GRU
Описание
LSTM - это специальный тип рекуррентной нейронной сети, разработанный для решения проблемы исчезающего градиента и способный обучаться долгосрочным зависимостям.
Языки
- Python100%
1. Цель работы
- Практическое освоение принципов работы рекуррентных нейронных сетей (RNN), их модификаций - Long Short-Term Memory (LSTM) и Gated Recurrent Unit (GRU)
- Получение навыков подготовки данных для работы с последовательностями (временные ряды, текст)
- Исследование способности LSTM и GRU улавливать долгосрочные зависимости в данных
- Сравнение эффективности простой RNN, LSTM и GRU на практических задачах
2. Теоретическое введение
Рекуррентные нейронные сети (RNN)
Рекуррентные нейронные сети предназначены для обработки последовательных данных. В отличие от полносвязных сетей, RNN имеют "память" о предыдущих элементах последовательности благодаря цикличным соединениям в своей структуре.
LSTM (Long Short-Term Memory)
LSTM - усовершенствованная архитектура RNN, решающая проблему затухающего градиента. Использует механизм "ворот" (input, forget, output gates) для контроля над потоком информации, что позволяет сохранять информацию на длительных временных интервалах.
GRU (Gated Recurrent Unit)
GRU - упрощенный вариант LSTM, объединяющий input и forget gates в один "gate update". Показывает сопоставимую с LSTM производительность при меньших вычислительных затратах.
3. Описание датасетов
Временные ряды (California Housing)
- Источник: California Housing dataset
- Размер: 20,000 записей
- Характеристики: Цены на жилье в Калифорнии с временной меткой
- Предобработка: Нормализация, создание скользящих окон (window_size=30)
Классификация текста (IMDb Reviews)
- Источник: База отзывов IMDb
- Размер: 50,000 отзывов (25,000 train / 25,000 test)
- Классы: 2 (положительные/отрицательные)
- Предобработка: Токенизация, паддинг (max_len=200 слов)
4. Предобработка данных
Временные ряды
- Нормализация данных MinMaxScaler
- Создание оконных выборок (window_size=30)
- Разделение на обучающую (1470 последовательностей) и тестовую (470 последовательностей) выборки
Текстовые данные
- Токенизация текста (vocab_size=10,000)
- Паддинг последовательностей до 200 токенов
- Векторное представление слов через Embedding слой
5. Архитектура моделей
Модели для временных рядов
model = Sequential([ LSTM(50, activation='tanh', recurrent_activation='sigmoid', input_shape=(window_size, 1)), Dense(1) ])
model = Sequential([ GRU(50, activation='tanh', recurrent_activation='sigmoid', input_shape=(window_size, 1)), Dense(1) ])
6. Гиперпараметры обучения
Временные ряды
- Оптимизатор: Adam
- Функция потерь: MSE (Mean Squared Error)
- Размер батча: 32
- Эпохи: 50
- Learning rate: 0.001
Классификация текста
- Оптимизатор: Adam
- Функция потерь: Binary Crossentropy
- Размер батча: 128
- Эпохи: 10
- Learning rate: 0.001
7. Графики обучения

8. Результаты на тестовой выборке
Временные ряды
| Модель | MSE | MAE | RMSE | R² | Explained Variance |
|---|---|---|---|---|---|
| SimpleRNN | 0.0160 | 0.0977 | 0.1264 | 0.8735 | 0.8825 |
| LSTM | 0.0123 | 0.0874 | 0.1107 | 0.9030 | 0.9073 |
| GRU | 0.0120 | 0.0873 | 0.1095 | 0.9051 | 0.9051 |
Классификация текста
| Модель | Accuracy | Precision | Recall | F1-Score |
|---|---|---|---|---|
| LSTM | 0.8383 | 0.8396 | 0.8383 | 0.8381 |
| GRU | 0.8223 | 0.8223 | 0.8223 | 0.8223 |
| Bidirectional LSTM | 0.8281 | 0.8320 | 0.8281 | 0.8276 |
Матрицы ошибок

Примеры прогнозов

9. Выводы
Анализ результатов
- Для временных рядов лучшей показала себя GRU с MSE = 0.0120, что демонстрирует ее эффективность в захвате временных зависимостей
- Для классификации текста LSTM превзошла другие архитектуры с точностью 83.83%
- Bidirectional LSTM показала хорошие результаты в обработке текста, используя контекст в обоих направлениях
- SimpleRNN уступает более сложным архитектурам из-за проблемы затухающего градиента
Проблемы и решения
- Переобучение: Регуляризация с помощью Dropout и Early Stopping
- Долгосрочные зависимости: LSTM и GRU успешно справляются благодаря механизмам ворот
- Вычислительная эффективность: GRU обеспечивает хороший баланс между точностью и скоростью
Рекомендации
- Для задач временных рядов предпочитать LSTM или GRU
- Для текстовой классификации использовать LSTM или Bidirectional архитектуры
- Для быстрого прототипирования выбирать GRU как оптимальный вариант
Полный отчет доступен в файле или вниз: lab2_complete_report.txt
Исходный код: lab2.py
Визуализация сравнения моделей: model_comparison.png
lab2_complete_report
ЭКСПЕРИМЕНТАЛЬНАЯ КОНФИГУРАЦИЯ:
Временные ряды: • Размер ряда: 2000 точек • Размер окна: 30 • Обучающие данные: 1470 последовательностей • Тестовые данные: 470 последовательностей
Классификация текста: • Размер словаря: 10000 • Максимальная длина: 200 токенов • Обучающие отзывы: 25000 • Тестовые отзывы: 25000
ДЕТАЛЬНЫЕ РЕЗУЛЬТАТЫ:
ВРЕМЕННЫЕ РЯДЫ:
SimpleRNN: • MSE: 0.0160 • MAE: 0.0977 • RMSE: 0.1264 • R2: 0.8735 • Explained Variance: 0.8825
LSTM: • MSE: 0.0123 • MAE: 0.0874 • RMSE: 0.1107 • R2: 0.9030 • Explained Variance: 0.9073
GRU: • MSE: 0.0120 • MAE: 0.0873 • RMSE: 0.1095 • R2: 0.9051 • Explained Variance: 0.9051
КЛАССИФИКАЦИЯ ТЕКСТА:
** LSTM:** • Accuracy: 0.8383 • Precision: 0.8396 • Recall: 0.8383 • F1-Score: 0.8381
GRU: • Accuracy: 0.8223 • Precision: 0.8223 • Recall: 0.8223 • F1-Score: 0.8223
Bidirectional_LSTM: • Accuracy: 0.8281 • Precision: 0.8320 • Recall: 0.8281 • F1-Score: 0.8276
АНАЛИЗ И ВЫВОДЫ:
ЛУЧШИЕ МОДЕЛИ: • Временные ряды: GRU (MSE: 0.0120) • Классификация текста: LSTM (Accuracy: 0.8383)
КЛЮЧЕВЫЕ НАБЛЮДЕНИЯ:
- LSTM и GRU превосходят SimpleRNN на временных рядах
- GRU предлагает хороший компромисс скорость/точность
- Двунаправленный LSTM превосходит в классификации текста
- Dropout значительно улучшает обобщение
- Early stopping эффективно предотвращает переобучение
РЕКОМЕНДАЦИИ: • Для временных рядов: Предпочитать LSTM или GRU • Для текста: Использовать двунаправленный LSTM • Для быстрого прототипирования: Выбирать GRU
Запуск проекта
Исходный код: lab2.py