Recurrent Neural Network (RNN)
Tekrarlayan sinir ağı (RNN), bir diziyi adım adım okur ve gizli durumu sonraki adıma taşır. Tekrarlama yapısı, eğitim, çeşitleri ve kod örneği.
Tekrarlayan sinir ağı (RNN), her seferinde bir öğeyi işlerken her adımdan gizli durumu sonraki adıma taşıyan bir sinir ağıdır. Böylece herhangi bir adımdaki çıktısı, o ana kadar okuduğu her şeye bağlı olabilir. Aynı ağırlıklar her adımda uygulanır; bu sayede tek bir ağ, bir cümleden saatler süren sensör okumalarına kadar her uzunluktaki diziyi işleyebilir. 2010'ların sonlarında Transformer'lar çoğu dil görevinde RNN'lerin yerini alana kadar RNN'ler, doğal dil işlemenin (NLP), konuşma tanımanın ve zaman serisi analizinin temel mimarisiydi. Kapılı varyantları, gerçek zamanlı akışta ve cihaz üzerinde çalışan modellerde hâlâ yaygındır. Tekrarlama, Mamba gibi durum uzayı modelleriyle (SSMs) yeniden gündeme geldi.
RNN Nasıl Çalışır?#
Jeffrey Elman'ın 1990 tarihli makalesinden sonra Elman ağı olarak da adlandırılan basit bir RNN, gizli durumunu hₜ = tanh(Wxₜ + Uhₜ₋₁ + b) şeklinde günceller ve her adımda yₜ = Vhₜ + c çıktısını üretebilir. Gizli durum, o ana kadarki diziyi özetleyen sabit boyutlu bir vektördür; tanh, geri beslenirken değerlerini −1 ile 1 arasında tutar. Her adımda ağın bir kopyası çizildiğinde döngü, katmanları aynı ağırlıkları paylaşan bir derin ileri beslemeli ağa açılır:
Aşağıdaki kod parçası, bir dizi üzerinde PyTorch'un nn.RNN yapısını çalıştırır ve aynı tekrarlamayı basit bir döngüde yineler:
import torch
from torch import nn
torch.manual_seed(0)
rnn = nn.RNN(input_size=3, hidden_size=4, batch_first=True)
x = torch.randn(1, 6, 3) # one sequence: 6 time steps, 3 features each
# PyTorch runs the whole sequence; output holds the hidden state after every step
output, h_n = rnn(x)
# The same recurrence by hand, reusing one set of weights at every step
h = torch.zeros(1, 4)
for t in range(x.shape[1]):
h = torch.tanh(x[:, t] @ rnn.weight_ih_l0.T + rnn.bias_ih_l0 + h @ rnn.weight_hh_l0.T + rnn.bias_hh_l0)
print(f"Output shape: {tuple(output.shape)}, final state shape: {tuple(h_n.shape)}")
print(f"Hand-written loop matches nn.RNN: {torch.allclose(h, h_n[0], atol=1e-6)}")Output shape: (1, 6, 4), final state shape: (1, 1, 4) ve Hand-written loop matches nn.RNN: True çıktısını verir. Çıktı, her zaman adımı için 4 boyutlu bir gizli durum içerir. Döngü, yalnızca biri girdi, diğeri önceki durum için olan iki ağırlık matrisiyle son durumu yeniden üretir.
Dizi Görevleri#
Aynı tekrarlama, girdi ve çıktı uzunlukları farklı olan görevlere uyar:
- Çoktan teke: Dizinin tamamını oku ve duygu analizi ya da bir sensör verisi penceresini etiketleme görevlerinde olduğu gibi son durumdan sınıflandır.
- Çoktan çoğa: Bir cümlenin her sözcüğünü veya sesin her karesini etiketlemek gibi, her adımda bir çıktı üret.
- Diziden diziye: Bir kodlayıcı RNN girdiyi okur, bir kod çözücü RNN ise farklı uzunlukta bir çıktı üretir. Bu, ilk sinirsel makine çevirisi sistemlerinin ve diğer diziden diziye modellerin tasarımıdır.
- Tekten çoğa: İlk görüntü açıklama modellerinde bir görüntünün özellik vektöründen açıklama üretmek gibi, tek bir girdiden bir dizi oluştur.
Çift yönlü RNN'ler, diziyi geriye doğru okuyan ikinci bir RNN ekler ve her adımda iki durumu birleştirir; böylece her çıktı geçmiş ve gelecek bağlamı görür. Yığınlanmış RNN'ler, bir katmanın gizli durumlarını girdi dizisi olarak sonraki katmana aktarır.
Zaman Boyunca Geri Yayılımla Eğitim#
RNN'ler, zaman boyunca geri yayılımla (BPTT) eğitilir: Ağ dizi boyunca açılır, adımlar üzerindeki kayıp toplanır ve geri yayılım açılmış hesaplama grafiğinde çalışır. T adımından t adımına ulaşan gradyan, tekrarlayan katmanın T − t kopyasından geçer ve her seferinde U ile tanh'ın türeviyle çarpılır. Bu çarpanlar çoğunlukla 1'den küçük olduğunda gradyan geometrik olarak küçülür. Yoshua Bengio, Patrice Simard ve Paolo Frasconi'nın 1994'te incelediği bu sorun, kaybolan gradyan problemidir. Çarpanlar 1'den büyük olduğunda ise gradyan geometrik olarak büyür ve patlayan gradyan sorunu ortaya çıkar. Aşağıdaki kod parçası, 50 adımlı bir dizideki her girdinin son gizli durumu ne ölçüde etkilediğini ölçer:
import torch
from torch import nn
torch.manual_seed(0)
rnn = nn.RNN(input_size=8, hidden_size=32, batch_first=True)
x = torch.randn(1, 50, 8, requires_grad=True) # one 50-step sequence
# Backpropagate from the final hidden state to the input at every step
output, h_n = rnn(x)
h_n.sum().backward()
grad_norms = x.grad[0].norm(dim=1)
for distance in [0, 10, 20, 30, 40]:
print(f"Input {distance:>2} steps before the end: gradient {grad_norms[-1 - distance]:.1e}")Bitişten önce 0, 10, 20, 30 ve 40 adım için 1.6e+00, 3.4e-03, 6.2e-06, 1.2e-08 ve 1.1e-11 gradyanlarını yazdırır. Her on adımda gradyanlar yaklaşık üç büyüklük mertebesi azalır; bu nedenle eğitim, birkaç düzine adım önceki bir girdiyi kullanacak şekilde ağırlıkları zar zor ayarlayabilir. 2013'te Razvan Pascanu ve çalışma arkadaşlarının RNN'ler için incelediği gradyan kırpma, patlayan gradyanları sınırlar; kesilmiş BPTT ise belleği sınırlamak için geri yayılımı sabit bir pencereyle kısıtlar. Kaybolan gradyanlar mimari değişikliği gerektirir; LSTM ve GRU kapılarının sağladığı da budur.
RNN'ler ve İlgili Mimariler#
- LSTM ve GRU: Bilginin ve gradyanların birçok adımdan geçmesini sağlayan toplamsal durum güncellemesine sahip, kapılı RNN'lerdir. Uygulamada "RNN" çoğu zaman basit RNN'nin yanı sıra bunlardan birini de ifade eder.
- Transformer: Geçmişi tek bir durumda sıkıştırmak yerine önceki tüm konumlara doğrudan dikkat eder ve tüm konumlarda paralel eğitim yapar. Dikkat maliyeti dizi uzunluğuyla artarken RNN, her yeni adımda aynı hesaplama ve bellek miktarını kullanır.
- Evrişimli sinir ağı (CNN): Görüntülerde uzam boyunca veya 1B evrişimlerle zaman boyunca sabit boyutlu filtreler kullanarak yakındaki konumları birleştirir; alıcı alanı ise derinliğine bağlıdır.
- Durum uzayı modelleri: Mamba gibi doğrusal yinelemeler, tarama işlemiyle paralel olarak eğitilir ve çıkarım sırasında bir RNN gibi adım adım çalışır. Sıvı sinir ağları, nöronları diferansiyel denklemleri izleyen sürekli zamanlı RNN'lerdir.
Uygulamalar#
- Klavye tahmini: Gboard'un sonraki kelime modeli, daha hafif bir LSTM çeşidi olan, bağlı giriş-unutma kapılı bir LSTM'ydi; kullanıcıların telefonlarında federatif öğrenme ile eğitildi ve Google araştırmacıları bunu 2018'de açıkladı.
- Talep tahmini: Amazon'un DeepAR modeli, birbiriyle ilişkili çok sayıda zaman serisi üzerinde tek bir otoregresif RNN eğitir ve gelecekteki her değer için bir olasılık dağılımı üretir.
- Akış sesi: Uyandırma sözcüğü algılayıcıları ve gürültü bastırıcılar sesi kare kare işleyen küçük yinelemeli katmanlar kullanır; böylece telefonlarda ve kulaklıklarda bellek ve gecikme sabit kalır.
- Nesne takibi: Bir izleyici, RNN'nin gizli durumunun üstlendiği role benzer biçimde, her nesnenin durumunu bir kareden diğerine taşır. YOLO26 izleme modunda yerleşik tüm izleyiciler, ByteTrack ve BoT-SORT'tan varsayılan TrackTrack'e kadar, bu durumu öğrenilmiş ağırlıklar yerine elle belirlenmiş sabit hız denklemlerini kullanan doğrusal bir yineleme olan Kalman filtresi ile günceller.










