Gated Recurrent Unit (GRU)
Управляемый рекуррентный блок (GRU) — это рекуррентная ячейка, в которой обновляющий и сбрасывающий вентили управляют тем, что она запоминает. Рассматриваются уравнения, сравнение GRU с LSTM и код.
Управляемый рекуррентный блок (GRU) — это ячейка рекуррентной нейронной сети (RNN), которая обрабатывает последовательность шаг за шагом и использует два обучаемых механизма — управляющий вентиль обновления и вентиль сброса. На каждом шаге они определяют, какую часть состояния памяти сохранить, а какую перезаписать. Кён Хён Чо и его коллеги представили GRU в 2014 году в работе «Кодировщик-декодировщик на основе RNN для машинного перевода». Вентили позволяют градиентам проходить через множество временных шагов, поэтому GRU обучается находить более долгосрочные зависимости, чем простая RNN, страдающая от проблемы затухающего градиента. GRU — упрощённый вариант сети с долгой краткосрочной памятью (LSTM): у неё одно скрытое состояние вместо двух и три блока весов вместо четырёх. GRU используют для анализа временных рядов, речи и других последовательных данных.
Как работает GRU#
На каждом временном шаге t GRU объединяет текущий вход xₜ с предыдущим скрытым состоянием hₜ₋₁. Два вентиля используют функцию сигмоиды, чтобы получить для каждого элемента состояния значение от 0 до 1:
- Вентиль сброса: rₜ = σ(Wᵣxₜ + Uᵣhₜ₋₁ + bᵣ) определяет, насколько использовать предыдущее состояние при формировании нового содержимого. Значения, близкие к 0, позволяют ячейке игнорировать свою историю, что полезно на границах, например в начале новой фразы.
- Вентиль обновления: zₜ = σ(W_z xₜ + U_z hₜ₋₁ + b_z) определяет, какую часть предыдущего состояния сохранить. Значения, близкие к 1, почти без изменений копируют старое состояние вперёд, благодаря чему информация сохраняется на длинных отрезках.
- Кандидатное состояние: h̃ₜ = tanh(Wxₜ + U(rₜ ⊙ hₜ₋₁) + b) формирует новое содержимое из входа и истории, масштабированной вентилем сброса; функция tanh удерживает значения в диапазоне от −1 до 1.
- Новое состояние: hₜ = (1 − zₜ) ⊙ h̃ₜ + zₜ ⊙ hₜ₋₁ поэлементно смешивает кандидатное и старое состояния.
Когда вентиль обновления остаётся близким к 1, новое состояние почти копирует старое, а градиент проходит назад по этому пути и почти не затухает. Этот аддитивный путь выполняет ту же роль, что и состояние ячейки в LSTM. Приведённые выше уравнения соответствуют исходной статье, где zₜ задаёт вес старого состояния; в некоторых источниках роли zₜ и 1 − zₜ меняются местами, но это описание той же ячейки. nn.GRU в PyTorch использует такое же смешивание, но применяет вентиль сброса после умножения матриц — rₜ ⊙ (Uhₜ₋₁ + b). Это широко используемый вариант вычисления кандидатного состояния.
GRU в PyTorch#
Приведённый ниже фрагмент запускает GRU на последовательности векторов признаков, например признаков каждого кадра из видео, и сравнивает число её параметров с LSTM той же ширины:
import torch
from torch import nn
# A sequence of 64-dim features from 5 video frames: (batch, time, features)
frames = torch.randn(1, 5, 64)
# A GRU with a 128-dim hidden state, and an LSTM of the same size for comparison
gru = nn.GRU(input_size=64, hidden_size=128, batch_first=True)
lstm = nn.LSTM(input_size=64, hidden_size=128, batch_first=True)
# outputs holds the hidden state at every step; h_n is the final state
outputs, h_n = gru(frames)
print(f"Outputs: {tuple(outputs.shape)}, final state: {tuple(h_n.shape)}")
# GRU weights cover 3 blocks (reset, update, candidate); LSTM weights cover 4
gru_params = sum(p.numel() for p in gru.parameters())
lstm_params = sum(p.numel() for p in lstm.parameters())
print(f"GRU: {gru_params:,} parameters, LSTM: {lstm_params:,} parameters")Выводятся Outputs: (1, 5, 128), final state: (1, 1, 128) и GRU: 74,496 parameters, LSTM: 99,328 parameters. GRU возвращает 128-мерное состояние для каждого кадра и финальное состояние, которое обобщает всю последовательность для последующего классификатора. Число параметров GRU составляет ровно три четверти от числа параметров LSTM.
GRU, LSTM и трансформеры#
- LSTM: Помимо скрытого состояния хранит отдельное состояние ячейки и использует три вентиля: входной, забывания и выходной. GRU объединяет два состояния и отказывается от выходного вентиля, поэтому на каждом шаге обучается быстрее и содержит меньше параметров. В эмпирическом сравнении Джунён Чона и его коллег, опубликованном в 2014 году, GRU не уступала LSTM при моделировании полифонической музыки и речевых сигналов; на практике ни одна из архитектур не превосходит другую во всех задачах.
- Простая RNN: На каждом шаге перезаписывает всё состояние без вентилей, поэтому на длинных последовательностях её градиенты затухают или взрываются, а события, разделённые большими промежутками, сложно связать.
- Transformer: Параллельно обрабатывает все позиции последовательности с помощью механизма внимания, что значительно ускоряет обучение на GPU и помогает лучше учитывать дальний контекст. Поэтому трансформеры заменили рекуррентные сети в большинстве языковых задач. GRU хранит состояние постоянного размера, а стоимость каждого шага остаётся неизменной независимо от длины последовательности. Это по-прежнему удобно для потокового аудио, данных с датчиков и небольших устройств.
Применение#
- Оптический поток: RAFT, получившая награду за лучшую статью ECCV 2020, уточняет оценку потока на протяжении многих итераций с помощью свёрточной GRU. В такой GRU умножения матриц заменены свёртками, поэтому её состояние представляет собой карту признаков.
- Прогнозирование и предиктивное обслуживание: GRU обрабатывает потоки данных о вибрации, температуре или спросе и предсказывает поломки или будущие значения. Такие модели часто работают на встроенном оборудовании, где важен небольшой размер модели.
- Речь и аудио: В аудиомоделях на устройстве используют GRU, поскольку она обрабатывает аудио покадрово и требует небольшого фиксированного объёма памяти. Подавитель шума RNNoise запускает слои GRU в реальном времени на обычном CPU.
- Распознавание действий: GRU обрабатывает последовательность признаков или ключевых точек для каждого кадра и выдаёт метку действия для клипа. В режиме отслеживания модели YOLO26 присваивают каждому человеку постоянный идентификатор во всех кадрах. Так формируются последовательности рамок или ключевых точек позы для каждого человека, которые классифицирует такая GRU.










