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?
Jawaban:
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):
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:
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:
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.
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.
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:
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.
sumber
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!
sumber
Ada fungsi di keras LSTM
reset_states(states)
.Namun status parameter adalah gabungan dari dua status, status tersembunyi h dan status sel.
akan menarik untuk mengetahui apakah Anda harus menginisialisasi
h
atauc
sesuai dengan pendekatan dalam makalah yang disebutkan di atas.sumber
Ini mungkin bukan cara yang paling efisien, tetapi variabel statis dapat diulangi dengan jangka waktu menggunakan
tf.tile()
.sumber