CodeBlanks Logo Icon CodeBlanks

Cell state

Cell state, LSTM'ın uzun süreli bellek taşıyıcısıdır.

Hücre durumu

Hücre durumu c, LSTM'in uzun süreli belleğidir; gizli durum h ise o anki çıktıdır. c sınırsızdır, h = o · tanh(c) ise (-1, 1) aralığındadır:

lstm = nn.LSTM(4, 8, batch_first=True)
h0 = torch.zeros(1, 2, 8)
c0 = torch.zeros(1, 2, 8)
output, (h_n, c_n) = lstm(torch.randn(2, 6, 4), (h0, c0))   # başlangıç durumu verilebilir
print(h_n.abs().max().item() < 1)   # True

Başlangıç durumu verilmezse sıfır kabul edilir. Uzun bir metni parça parça işlerken bir parçanın son durumu bir sonrakine başlangıç olarak verilebilir.

Durumu taşımak

Bir diziyi tek seferde ya da iki parçada işlemek, durum taşındığı sürece aynı sonucu verir. Bu, akan veride (canlı sensör, uzun belge) çok kullanışlıdır:

x = torch.randn(1, 10, 4)
_, (h_tam, _) = lstm(x)
_, durum = lstm(x[:, :6])
_, (h_parca, _) = lstm(x[:, 6:], durum)
print(torch.allclose(h_tam, h_parca, atol=1e-6))   # True

Eğitimde uzun dizilerin parçalara bölünüp durumun taşınmasına "kesik geri yayılım" (truncated BPTT) denir; durum parçalar arasında detach() edilir.

Uygulama Parça parça işle

Tohum 0 ile nn.LSTM(4, 8, batch_first=True) kur. (1, 10, 4) girdiyi tek seferde ve 6 + 4 adımlık iki parçada (durumu taşıyarak) işle. Son gizli durumların aynı olduğunu torch.allclose(..., atol=1e-6) ile, ardından durumu taşımadan ikinci parçayı işlemenin farklı sonuç verdiğini yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

torch.manual_seed(0)
lstm = nn.LSTM(4, 8, batch_first=True)
x = torch.randn(1, 10, 4)

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

torch.manual_seed(0)
lstm = nn.LSTM(4, 8, batch_first=True)
x = torch.randn(1, 10, 4)

_, (h_tam, _) = lstm(x)
_, durum = lstm(x[:, :6])
_, (h_parca, _) = lstm(x[:, 6:], durum)
print(torch.allclose(h_tam, h_parca, atol=1e-6))
_, (h_bos, _) = lstm(x[:, 6:])
print(not torch.allclose(h_tam, h_bos, atol=1e-6))

Beklenen çıktı

True
True

Soru ve cevaplar

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

1 Neden <code>h</code> her zaman (-1, 1) aralığındadır?

  • Değildir
  • h = o · tanh(c); tanh ve sigmoid sınırlıdır Doğru cevap
  • c sınırlı olduğu için
  • Normalleştirme yapıldığı için

Açıklama: o ∈ (0, 1) ve tanh ∈ (-1, 1); çarpımları da (-1, 1) içindedir.

2 Önceki parçanın durumunu başlangıç olarak ver.

Soru
_, (h, c) = lstm(x[:, 6:], ____)
Cevap
_, (h, c) = lstm(x[:, 6:], durum)

Açıklama: İkinci argüman (h0, c0) çiftidir.

3 Kavramları eşleştir.

Kavram Anlamı
c Uzun süreli bellek
h Anlık çıktı
(h0, c0) Başlangıç durumu
truncated BPTT Parçalı eğitim

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