Gated Recurrent Unit (GRU)
게이트 순환 유닛(GRU)은 업데이트 게이트와 리셋 게이트가 기억할 내용을 제어하는 순환 셀입니다. 방정식, GRU와 LSTM의 비교, 코드를 다룹니다.
게이트 순환 유닛(GRU)은 시퀀스를 한 번에 한 단계씩 처리하는 순환 신경망(RNN) 셀입니다. 업데이트 게이트와 리셋 게이트라는 두 개의 학습된 게이트를 사용해 각 단계에서 메모리를 얼마나 유지하고 덮어쓸지 결정합니다. Kyunghyun Cho와 동료들은 2014년 기계 번역을 위한 RNN 인코더-디코더 논문에서 GRU를 소개했습니다. 게이트를 사용하면 여러 시간 단계에 걸쳐 그래디언트가 흐르므로, 그래디언트 소실 문제를 겪는 단순 RNN보다 GRU가 더 장기적인 종속성을 학습할 수 있습니다. GRU는 장단기 메모리(LSTM) 네트워크를 단순화한 형태로, 두 개 대신 하나의 은닉 상태를 사용하고 네 개 대신 세 개의 가중치 블록을 사용합니다. 시계열 분석, 음성 및 기타 순차 데이터에 사용됩니다.
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ₜ의 역할을 바꾸지만, 같은 셀을 나타냅니다. PyTorch의 nn.GRU는 동일한 결합을 사용하지만 행렬 곱셈 후에 리셋 게이트를 적용하는 널리 쓰이는 후보 상태 변형인 rₜ ⊙ (Uhₜ₋₁ + b)를 사용합니다.
PyTorch에서 GRU 사용하기#
아래 코드 조각은 비디오의 프레임별 특징과 같은 특징 벡터 시퀀스에 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의 정확히 4분의 3입니다.
GRU, LSTM, 트랜스포머 비교#
- LSTM: 은닉 상태와 별도로 셀 상태를 유지하며 입력, 망각, 출력의 세 게이트를 사용합니다. GRU는 두 상태를 하나로 합치고 출력 게이트를 제거하므로 매개변수가 더 적고 단계별 학습 속도가 더 빠릅니다. Junyoung Chung과 동료들이 2014년에 수행한 실증 비교에서 GRU는 다성 음악 및 음성 신호 모델링에서 LSTM과 비슷한 성능을 보였습니다. 실제로는 작업에 따라 어느 한쪽이 일관되게 우세하지 않습니다.
- 단순 RNN: 게이트 없이 각 단계에서 전체 상태를 덮어쓰므로 긴 시퀀스에서 그래디언트가 소실되거나 폭발하며, 오랜 간격으로 떨어진 사건을 연결하는 데 어려움을 겪습니다.
- Transformer: 어텐션을 사용해 시퀀스의 모든 위치를 병렬로 처리하므로 GPU에서 훨씬 빠르게 학습하고 장거리 컨텍스트를 더 잘 처리합니다. 따라서 대부분의 언어 작업에서 트랜스포머가 순환 네트워크를 대체했습니다. GRU는 시퀀스 길이에 관계없이 일정한 크기의 상태와 단계별 일정한 연산 비용을 유지하므로 스트리밍 오디오, 센서 데이터, 소형 장치에 여전히 적합합니다.
응용 분야#
- 광학 흐름: ECCV 2020 최우수 논문상을 수상한 RAFT는 합성곱 GRU를 사용해 여러 반복에 걸쳐 흐름 추정치를 개선합니다. 합성곱 GRU는 행렬 곱셈을 합성곱으로 대체한 GRU이므로 상태가 특징 맵입니다.
- 예측 유지보수 및 예측: GRU는 진동, 온도, 수요 데이터 스트림을 읽고 고장이나 미래 값을 예측합니다. 소형 모델이 중요한 임베디드 하드웨어에서 자주 사용됩니다.
- 음성 및 오디오: 온디바이스 오디오 모델은 오디오를 프레임 단위로 처리하고 메모리 사용량이 적고 일정하므로 GRU를 사용합니다. RNNoise 잡음 제거기는 일반 CPU에서 GRU 계층을 실시간으로 실행합니다.
- 행동 인식: GRU는 프레임별 특징이나 키포인트 시퀀스를 읽고 클립의 행동 레이블을 출력합니다. YOLO26은 트랙 모드에서 프레임 간 각 사람에게 지속적인 ID를 할당합니다. 이를 통해 GRU가 분류할 사람별 박스 시퀀스 또는 포즈 키포인트 시퀀스를 얻을 수 있습니다.










