Menambahkan Fitur Ke Model Time Series LSTM

43

telah membaca sedikit tentang LSTM dan penggunaannya untuk seri waktu dan itu menarik tetapi sulit pada saat yang sama. Satu hal yang saya punya kesulitan dalam memahami adalah pendekatan untuk menambahkan fitur tambahan pada apa yang sudah menjadi daftar fitur deret waktu. Dengan asumsi Anda memiliki dataset Anda seperti ini:

t-3, t-2, t-1, Output

Sekarang katakanlah Anda tahu Anda memiliki fitur yang memengaruhi output tetapi tidak perlu fitur deret waktu, misalkan cuaca di luar. Apakah ini sesuatu yang bisa Anda tambahkan dan LSTM akan dapat membedakan apa itu aspek deret waktu dan apa yang tidak?

Rjay155
sumber
Saya suka pertanyaan Anda. Namun, dapatkah Anda menjelaskan bagaimana fitur seri tidak-waktu ini memengaruhi output pada waktu t, berdasarkan pada pengetahuan materi pelajaran.
horaceT

Jawaban:

39

Untuk RNNs (mis., LSTMs dan GRUs), input layer adalah daftar timesteps, dan setiap timestep adalah tensor fitur. Itu berarti Anda dapat memiliki tensor input seperti ini (dalam notasi Pythonic):

# 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 ],
    ...
]

Jadi tentu saja, Anda dapat memiliki banyak fitur di setiap catatan waktu. Dalam pikiranku, cuaca adalah fitur deret waktu: di mana aku tinggal, itu adalah fungsi waktu. Jadi akan cukup masuk akal untuk menyandikan informasi cuaca sebagai salah satu fitur Anda di setiap catatan waktu (dengan penyandian yang sesuai, seperti berawan = 0, cerah = 1, dll.).

Jika Anda memiliki data seri non-waktu, maka tidak masuk akal untuk meneruskannya melalui LSTM. Mungkin LSTM akan tetap bekerja, tetapi bahkan jika LSTM mungkin akan dikenakan biaya kehilangan / akurasi yang lebih tinggi per waktu pelatihan.

Atau, Anda dapat memperkenalkan informasi "ekstra" semacam ini ke dalam model Anda di luar LSTM melalui lapisan tambahan. Anda mungkin memiliki aliran data seperti ini:

TIME_SERIES_INPUT ------> LSTM -------\
                                       *---> MERGE ---> [more processing]
AUXILIARY_INPUTS --> [do something] --/

Jadi, Anda akan menggabungkan input bantu Anda ke dalam output LSTM, dan melanjutkan jaringan Anda dari sana. Sekarang model Anda hanya multi-input.

Misalnya, katakanlah dalam aplikasi khusus Anda, Anda hanya menyimpan output terakhir dari urutan output LSTM. Katakanlah itu adalah vektor dengan panjang 10. Anda input tambahan mungkin cuaca Anda disandikan (jadi skalar). Lapisan gabungan Anda bisa dengan mudah menambahkan informasi cuaca tambahan ke ujung vektor output LSTM untuk menghasilkan vektor tunggal panjang 11. Tapi Anda tidak perlu hanya menyimpan catatan waktu keluaran LSTM terakhir: jika LSTM menghasilkan 100 timesteps, masing-masing dengan 10-vektor fitur, Anda masih bisa menempel pada informasi cuaca tambahan Anda, menghasilkan 100 langkah waktu, masing-masing terdiri dari vektor 11 titik data.

Dokumentasi Keras pada API fungsionalnya memiliki ikhtisar yang baik tentang ini.

Dalam kasus lain, seperti yang ditunjukkan @horaceT, Anda mungkin ingin mengkondisikan LSTM pada data non-temporal. Misalnya, prediksi cuaca besok, diberikan lokasi. Dalam hal ini, berikut adalah tiga saran, masing-masing dengan positif / negatif:

  1. Minta timestep pertama berisi data pengondisian Anda, karena ini akan secara efektif "mengatur" keadaan internal / tersembunyi RNN Anda. Terus terang, saya tidak akan melakukan ini, karena banyak alasan: data pengkondisian Anda harus memiliki bentuk yang sama dengan fitur-fitur lainnya, membuatnya lebih sulit untuk membuat RNN yang stateful (dalam hal sangat berhati-hati untuk melacak bagaimana Anda memberi makan data ke dalam jaringan), jaringan dapat "melupakan" data pengkondisian dengan waktu yang cukup (misalnya, urutan latihan yang panjang, atau urutan prediksi yang panjang), dll.

  2. Sertakan data sebagai bagian dari data temporal itu sendiri. Jadi setiap vektor fitur pada catatan waktu tertentu termasuk "sebagian besar" data time-series, tetapi kemudian memiliki data pengkondisian ditambahkan ke akhir setiap vektor fitur. Apakah jaringan akan belajar mengenali ini? Mungkin, tetapi bahkan kemudian, Anda membuat tugas belajar yang lebih sulit dengan mencemari data urutan dengan informasi non-sekuensial. Jadi saya juga akan mencegah ini.

  3. Mungkin pendekatan terbaik adalah secara langsung mempengaruhi keadaan tersembunyi RNN pada saat nol. Ini adalah pendekatan yang diambil oleh Karpathy dan Fei-Fei dan oleh Vinyals et al . Begini Cara kerjanya:

    1. Untuk setiap sampel pelatihan, ambil variabel kondisi Anda .x
    2. Ubah / bentuk ulang variabel kondisi Anda dengan transformasi affine untuk membuatnya menjadi bentuk yang tepat sebagai keadaan internal RNN: (ini dan adalah bobot yang bisa dilatih). Anda bisa mendapatkannya dengan lapisan padat di keras. Wbv=Wx+bWb
    3. Untuk catatan waktu pertama, tambahkan ke status tersembunyi RNN saat menghitung nilainya.v

    Pendekatan ini adalah yang paling "teoretis" paling benar, karena dengan tepat mengkondisikan RNN pada input non-temporal Anda, secara alami menyelesaikan masalah bentuk, dan juga menghindari mencemari timestep input Anda dengan informasi tambahan non-temporal. Kelemahannya adalah bahwa pendekatan ini sering memerlukan kontrol tingkat grafik dari arsitektur Anda, jadi jika Anda menggunakan abstraksi tingkat tinggi seperti Keras, Anda akan kesulitan menerapkannya kecuali Anda menambahkan jenis layer Anda sendiri.

Adam Sypniewski
sumber
1
Saran yang bagus, tetapi bagaimana jika keluaran LSTM memiliki ketergantungan struktural pada prediktor seri non-waktu.
horaceT
Bisakah Anda memberi contoh?
Adam Sypniewski
6
Oke, ini adalah contoh yang sangat tiruan. Katakanlah Anda mencoba memprediksi cuaca pada waktu t, berdasarkan pada obs dari langkah terakhir dan waktu. Cuaca tergantung pada bagian dunia tempat Anda berada. Jika musim panas di belahan bumi utara, musim dingin di belahan bumi selatan. Jadi faktor utara / selatan ini harus diperhitungkan. Bisakah Anda memasukkannya ke dalam LSTM?
horaceT
1
Pertanyaan bagus! Saya telah menyertakan pengeditan untuk mengatasi hal ini.
Adam Sypniewski
Terima kasih untuk suntingan dan dua referensi. Cukup berguna.
horaceT
2

Berdasarkan semua jawaban yang baik dari utas ini, saya menulis sebuah perpustakaan untuk mengkondisikan pada input tambahan. Ini mengabstraksi semua kerumitan dan telah dirancang agar seramah mungkin:

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

Semoga ini bisa membantu!

Philippe Remy
sumber
0

Ada fungsi di keras LSTM reset_states(states).

Namun status parameter adalah gabungan dari dua status, status tersembunyi h dan status sel.

States = [h, c]

akan menarik untuk mengetahui apakah Anda harus menginisialisasi hatau csesuai dengan pendekatan dalam makalah yang disebutkan di atas.

pengguna2614596
sumber
0

Ini mungkin bukan cara yang paling efisien, tetapi variabel statis dapat diulangi dengan jangka waktu menggunakan tf.tile().

ganda-d
sumber