Zaman Serisi Modeline LSTM Özellik Ekleme


42

LSTM'leri ve zaman serileri için kullanımlarını biraz okumakta ve aynı zamanda ilginç fakat zor olmuştur. Anlamakta güçlük çektiğim bir şey, zaman serisi özelliklerinin bir listesine ek özellikler eklemeye yaklaşmak. Veri kümenizi şu şekilde ayarladığınızı varsayalım:

t-3, t-2, t-1 Çıkış

Şimdi çıktınızı etkileyen bir özelliğiniz olduğunu bilmenizi sağlar, ancak bunun zaman çizelgesi özelliği olması gerekmez, havanın dışarıdaki havasını söyleyelim. Bu sadece ekleyebileceğiniz bir şey mi ve LSTM, zaman serileri ile neyin ne olduğunu ayırt edebilecek mi?


Sorunu beğendim Bununla birlikte, bu zaman çizelgesi olmayan serinin özelliğinin konu bilgisine dayanarak t zamanında çıktıyı nasıl etkilediğini detaylandırabilir misiniz.
horaceT

Yanıtlar:


39

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:

  1. İ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".

  2. 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 .

  3. 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:

    1. x
    2. v=Wx+bWb
    3. 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.


1
İyi öneri, fakat ya LSTM'nin çıktısının zaman serisi olmayan bir tahminciye yapısal bağımlılığı varsa.
horaceT

Bir örnek verebilir misiniz?
Adam Sypniewski

6
Tamam, işte çok yapay bir örnek. Son n adımdaki adımlara dayanarak, t zamanında hava tahmin etmeye çalıştığınızı varsayalım. Hava, bulunduğunuz dünyanın bir kısmına bağlı. Kuzey yarımkürede yaz mevsiminde, güney yarımkürede kış mevsiminde. Dolayısıyla bu kuzey / güney faktörü dikkate alınmalıdır. LSTM'ye dahil edebilir misin?
horaceT

1
Harika soru! Bunu ele almak için düzenlemeler ekledim.
Adam Sypniewski

Düzenlemeler ve iki referans için teşekkürler. Gayet yararlı.
horaceT

2

Bu konunun tüm iyi cevaplarına dayanarak, yardımcı girdilerin koşullandırılması için bir kütüphane yazdım. Tüm karmaşıklığı soyutlar ve mümkün olduğunca kullanıcı dostu olacak şekilde tasarlanmıştır:

https://github.com/philipperemy/cond_rnn/ (tensorflow)

Umarım yardımcı olur!


0

LSTM keraslarında bir fonksiyon var reset_states(states).

Bununla birlikte, parametre durumları, gizli durum h ve hücre durumu olmak üzere iki durumun eşleşmesidir.

States = [h, c]

Eğer başlatmak gerektiğini eğer bilmek ilginç olurdu hya cgöre yukarıda belirtilen gazetelerde yaklaşır.


0

Bu muhtemelen en etkili yol değildir, ancak statik değişkenler kullanarak zaman uzunluğuna tekrar edilebilir tf.tile().

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.