Makine Öğrenmesi
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.
Örnek çözümü göster
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))
Kendini test et
-
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
- c sınırlı olduğu için
- Normalleştirme yapıldığı için
Cevabı göster
h = o · tanh(c); tanh ve sigmoid sınırlıdır — o ∈ (0, 1) ve tanh ∈ (-1, 1); çarpımları da (-1, 1) içindedir.
-
Önceki parçanın durumunu başlangıç olarak ver.
_, (h, c) = lstm(x[:, 6:], ____)
Cevabı göster
_, (h, c) = lstm(x[:, 6:], durum)
-
Kavramları eşleştir.
- c
- Uzun süreli bellek
- h
- Anlık çıktı
- (h0, c0)
- Başlangıç durumu
- truncated BPTT
- Parçalı eğitim
Sıradaki ders: input_size