RNNs (örneğin, LSTMs ve Grus) için, tabaka girişi olan dilimler bir listesi ve her timestep olan bir özellik tensörü. Bu, böyle bir giriş tensörüne sahip olabileceğiniz anlamına gelir (Pythonic notasyonunda):
# Input tensor to RNN
[
# Timestep 1
[ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
# Timestep 2
[ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
# Timestep 3
[ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
...
]
Yani kesinlikle, her zaman noktasında birden fazla özelliğe sahip olabilirsiniz. Aklımda, hava bir zaman serisi özelliğidir: yaşadığım yerde, zamanın bir işlevi olur. Bu nedenle, hava durumu bilgisini her zaman adımındaki özelliklerinden biri olarak kodlamak oldukça uygun olacaktır (bulutlu = 0, güneşli = 1 vb. Gibi uygun bir kodlamayla).
Zaman serisi olmayan verileriniz varsa, LSTM'den geçirmenin bir anlamı yoktur. Belki LSTM yine de işe yarayabilir, ancak çalışsa bile, muhtemelen eğitim süresi başına daha yüksek kayıp / daha düşük doğruluk maliyeti ile karşılanacaktır.
Alternatif olarak, bu tür "ekstra" bilgileri LSTM dışında modelinize ek katmanlar aracılığıyla da ekleyebilirsiniz. Bunun gibi bir veri akışınız olabilir:
TIME_SERIES_INPUT ------> LSTM -------\
*---> MERGE ---> [more processing]
AUXILIARY_INPUTS --> [do something] --/
Böylece, yardımcı girişlerinizi LSTM çıkışlarında birleştirir ve ağınızı oradan devam ettirirsiniz. Şimdi modeliniz sadece çoklu girdi.
Örneğin, uygulamanızda, yalnızca LSTM çıktı dizisinin son çıktısını koruduğunuzu varsayalım. Diyelim ki bunun 10 uzunluğunda bir vektör olduğunu söyleyelim. Yardımcı girdi kodlanmış hava durumunuz (yani bir skalar) olabilir. Kişisel birleştirme katmanı sadece uzunluk 11 tek vektör üretmek için LSTM çıkış vektörü ucuna yardımcı hava durumu bilgilerini eklemek olabilir Ama yok gerek , her LSTM 100 dilimler çıktısı ise: sadece geçen LSTM çıktı timestep tutmak 10 vektör özellikleriyle, her biri 11 veri noktasından oluşan bir vektörden oluşan 100 timestep ile sonuçlanan yardımcı hava durumu bilgilerinizi hala düzeltebilirsiniz.
İşlevsel API'sindeki Keras dokümantasyonu buna iyi bir genel bakış sağlar.
Diğer durumlarda, @horaceT'in işaret ettiği gibi, LSTM'yi geçici olmayan veriler üzerinde koşullandırmak isteyebilirsiniz. Örneğin, yer verilen yarın hava durumunu tahmin edin. Bu durumda, her biri olumlu / olumsuz olan üç öneri:
İlk zaman adımının koşullandırma verilerinizi içermesini sağlayın, çünkü bu, RNN'nizin dahili / gizli durumunu etkili bir şekilde "ayarlayacaktır". Açıkçası, ben ederim değil nedenlerle bir grup için şunu yapın: senin şartlandırma veri özelliklerinizin kalanıyla aynı şekil olması gerekir, veri beslemek nasıl izlemek için gerçekten dikkatli olma açısından (zor durum bilgisi RNNs oluşturmayı kolaylaştırır ağın içine), ağ koşullandırma verilerini yeterli zaman (örneğin, uzun eğitim dizileri veya uzun tahmin dizileri), vb. ile "unutabilir".
Verileri, geçici verinin bir parçası olarak dahil edin. Dolayısıyla, belirli bir zaman adımındaki her özellik vektörü "çoğunlukla" zaman serisi verilerini içerir, ancak daha sonra her özellik vektörünün sonuna eklenen koşullandırma verileri vardır. Ağ bunu tanımayı öğrenecek mi? Muhtemelen, ama o zaman bile, sıra verilerini sıralı olmayan bilgilerle kirleterek daha zor bir öğrenme görevi yaratıyorsunuz. Bu yüzden bunu da caydırırım .
Muhtemelen en iyi yaklaşım, RNN'nin sıfır durumunda gizli durumunu doğrudan etkilemektir. Bu Karpathy ve Fei-Fei ve Vinyals ve ark . Bu nasıl çalışır:
- x⃗
- v⃗ = G x⃗ + b⃗ Wb⃗
- v⃗
Bu yaklaşım en "teorik olarak" doğrudur, çünkü zamansal olmayan girdiler üzerindeki RNN'yi uygun şekilde şartlandırır, şekil problemini doğal olarak çözer ve ayrıca zaman aşımına uğramış zaman aşımına uğramış ek geçici olmayan bilgilerle kirlenmesini önler. Dezavantajı ise bu yaklaşımın mimarinizin grafik düzeyinde kontrolünü gerektirmesidir, bu nedenle Keras gibi daha üst düzeyde bir soyutlama kullanıyorsanız, kendi katman türünüzü eklemediğiniz sürece uygulaması zor bulacaksınız.