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:
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:
- Untuk setiap sampel pelatihan, ambil variabel kondisi Anda .x⃗
- 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. W → bv⃗ =Wx⃗ +b⃗ Wb⃗
- 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.