CodeBlanks Logo Icon CodeBlanks

Vanishing gradient

RNN'lerde uzun dizilerde gradyan kaybolması sorunu yaşanır.

Sönen gradyan

Geri yayılım zaman boyunca geriye giderken her adımda gradyan W_hh ve tanh türeviyle çarpılır. Bu çarpımlar 1'den küçükse gradyan üstel olarak küçülür ve erken adımlardaki bilgi öğrenilemez:

g = 1.0
for adim in range(50):
    g *= 0.9           # her adımda 0.9 çarpanı
print(round(g, 4))     # 0.0052: 50 adım önceki girdiye neredeyse hiç sinyal yok

Çarpanlar 1'den büyükse gradyan patlar; buna karşı gradyan kırpma kullanılır. Sönmeye karşı ise LSTM ve GRU gibi kapılı mimariler geliştirildi.

Gözlemlemek

Bir RNN'in son çıktısının ilk ve son girdilere göre gradyanı karşılaştırılarak sönme doğrudan görülebilir:

x = torch.randn(1, 50, 1, requires_grad=True)
output, _ = rnn(x)
output[0, -1].sum().backward()
print(x.grad[0, 0].abs().item())    # ilk adım: çok küçük
print(x.grad[0, -1].abs().item())   # son adım: büyük

İlk adımdaki gradyan son adımdakinden kat kat küçükse model uzun vadeli bağımlılıkları öğrenemez.

Uygulama Sönmeyi ölç

Tohum 0 ile nn.RNN(1, 8, batch_first=True) kur. (1, 40, 1) rastgele girdinin gradyanını izle; son adım çıktısının toplamını geri yay. İlk adımdaki gradyan büyüklüğünün son adımdakinin yüzde birinden küçük olduğunu yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

torch.manual_seed(0)
rnn = nn.RNN(1, 8, batch_first=True)
x = torch.randn(1, 40, 1, requires_grad=True)

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

torch.manual_seed(0)
rnn = nn.RNN(1, 8, batch_first=True)
x = torch.randn(1, 40, 1, requires_grad=True)

output, _ = rnn(x)
output[0, -1].sum().backward()
ilk = x.grad[0, 0].abs().item()
son = x.grad[0, -1].abs().item()
print(ilk < son / 100)

Beklenen çıktı

True

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Gradyan her adımda 1.1 ile çarpılırsa 100 adım sonra ne olur?

  • Aynı kalır
  • Sıfır olur
  • Patlar (~13780 kat büyür) Doğru cevap
  • Söner

Açıklama: 1.1¹⁰⁰ ≈ 13780; bu yüzden gradyan kırpma gerekir.

2 Gradyanı 50 adım boyunca çarp.

Soru
g = 0.9 ____ 50
Cevap
g = 0.9 ** 50

Açıklama: 0.9⁵⁰ üstel sönmeyi gösterir.

3 Durumları eşleştir.

Kavram Anlamı
çarpan < 1 Sönen gradyan
çarpan > 1 Patlayan gradyan
gradyan kırpma Patlamaya çare
LSTM/GRU Sönmeye çare

İleri seviye bölümündeki tüm dersler