Bagaimana cara merepresentasikan data untuk LSTM?

Saya memiliki data urutan yang memberi tahu saya warna apa yang diamati untuk beberapa subjek pada titik waktu berbeda. Misalnya:

ID Time Color
A 1 Blue
A 2 Red
A 5 Red
B 3 Blue
B 6 Green
C 1 Red
C 3 Orange

Saya ingin mendapatkan prediksi warna yang paling mungkin untuk langkah 3 kali berikutnya, serta kemungkinan munculnya warna tersebut. Misalnya, untuk ID A, saya ingin mengetahui 3 item berikutnya (waktu, warna) dalam urutan serta kemungkinan munculnya warna tersebut.

Saya memahami bahwa LSTM sering digunakan untuk memprediksi jenis data sekuensial ini, dan saya akan memasukkan array 3d seperti

input =[ 
[[1,1], [2,2], [5,2]], #blue at t=1, red at t=2, red at t=5 for ID A
[[0,0], [3,1], [6,3]], #nothing for first entry, blue at t=3, green at t=6 for ID B
[[0,0], [1,2], [3,4]]
]
  

setelah memetakan warna ke angka (Biru-› 1, Merah-›2, Hijau-› 3, Oranye -› 4dst.). Pemahaman saya adalah, secara default, LSTM hanya memprediksi item berikutnya di setiap urutan, misalnya

output = [
[[7, 2]], #next item is most likely red at t=7
[[9, 3]], # next item is most likely red at t=9
[[6, 2]] 
]

Apakah mungkin untuk mengubah keluaran LSTM saya sehingga alih-alih hanya memprediksi waktu dan warna kemunculan berikutnya, saya bisa mendapatkan 3 kali, warna DAN probabilitas kemunculan warna berikutnya? Misalnya, keluaran seperti

output = [
[[7, 2, 0.93], [8,2, 0.79], [10,4, 0.67]], 
[[9, 2, 0.88], [11,3, 0.70], [14,3, 0.43]], 
...
]

Saya sudah mencoba mencari di dokumentasi Sequential untuk Keras, tetapi saya tidak yakin apakah saya menemukan sesuatu.

Selain itu, saya melihat ada TrainX dan TrainY yang biasanya digunakan untuk model.fit() tetapi saya juga tidak yakin TrainY saya apa yang ada di sini?


person lvnwrth    schedule 24.02.2021    source sumber
comment
Sequential tidak terkait dengan urutan, ini hanya antarmuka untuk menumpuk lapisan (nama yang lebih baik adalah Model).   -  person runDOSrun    schedule 26.02.2021


Jawaban (1)


LSTM hanya memprediksi item berikutnya di setiap urutan...

Tidak juga, LSTM hanyalah sebuah lapisan untuk membantu menyandikan data berurutan. Tugas hilirnya, (lapisan padat, dan lapisan keluaran)lah yang menentukan apa yang akan diprediksi oleh model.

Meskipun Anda dapat melatih model berbasis LSTM untuk memprediksi nilai berikutnya dalam suatu urutan (dengan secara cerdik menjaga stempel waktu terakhir sebagai target regresi Anda, y), idealnya Anda ingin menggunakan arsitektur encoder-decoder berbasis LSTM untuk menghasilkan urutan dengan benar dari input urutan.

masukkan deskripsi gambar di sini

Ini adalah arsitektur yang sama yang digunakan pada model bahasa untuk menghasilkan teks atau model terjemahan mesin untuk menerjemahkan bahasa Inggris ke bahasa Prancis.

Anda dapat menemukan tutorial bagus tentang penerapan di sini. Keuntungan model ini adalah, kini Anda dapat memilih untuk memecahkan kode langkah waktu sebanyak yang Anda perlukan. Jadi untuk kasus Anda, Anda dapat memasukkan rangkaian warna dengan panjang tetap dan empuk ke encoder, dan mendekode langkah 3 kali.

Dari sudut pandang persiapan data, Anda harus mengambil setiap rangkaian warna, menghapus 3 warna terakhir sebagai y Anda, dan memasukkan sisanya ke panjang tetap.

sample = [R, G, B, B, R, G, R, R, B]
X = [<start>, 0, 0, 0, 0, 0, R, G, B, B, R, G, <end>]  #Padded input sequence
y = [<start>, R, R, B, <end>]                          #Y sequence

Anda akan menemukan langkah-langkah prapemrosesan, pelatihan, dan inferensi yang diperlukan pada tautan di atas.

person Akshay Sehgal    schedule 25.02.2021
comment
Begitu- jadi jika saya ingin mendapatkan 3 warna berikutnya di setiap urutan, saya akan menghapus tiga warna terakhir yang diamati di setiap urutan untuk ditetapkan sebagai y saya. Saat kita melakukan pad, apakah penting jika kita melakukan pad di awal atau di akhir? Urutan saya memiliki panjang yang berbeda sehingga beberapa memerlukan lebih banyak bantalan daripada yang lain. misalnya Saya mungkin memiliki 8 item di urutan A dan 6 item di urutan B - person lvnwrth; 25.02.2021
comment
Lebih baik melakukan pre-padding daripada post-padding. Alasannya adalah bahwa negara bagian yang tersembunyi akan terhapus dengan padding pos. Dalam prepadding, angka 0 diikuti oleh urutan sebenarnya sehingga mempertahankan representasi urutan dengan lebih baik. Saya telah memperbarui jawaban saya untuk mencerminkan hal yang sama. Baca ini untuk detail lebih lanjut - person Akshay Sehgal; 26.02.2021
comment
Selain itu, Anda juga dapat mengisi dan memotong urutan Anda. Jadi, jika urutannya lebih kecil dari rata-rata maka padukan, tetapi untuk urutan yang sangat panjang, Anda mungkin ingin memotongnya. - person Akshay Sehgal; 26.02.2021
comment
@AkshaySehgal Post-padding secara signifikan lebih populer daripada pra-padding (bahkan tutorial yang Anda tautkan menggunakan postingan bekas). Meskipun hal ini mungkin lebih bersifat tradisi daripada bukti, makalah yang Anda tautkan terlalu terbatas untuk mengklaim bahwa salah satu studi umumnya lebih baik daripada yang lain dalam hal akurasi model (jika Anda memiliki studi lain yang ditinjau oleh rekan sejawat yang berkualitas baik, saya akan melakukannya tertarik). Selain itu, pembilasan juga bisa diterapkan pada awal suatu rangkaian namun dalam praktiknya tidak menjadi masalah karena kita melakukan penyembunyian. - person runDOSrun; 26.02.2021
comment
Untuk mendukung klaim saya bahwa post-padding lebih populer: TF, Keras memiliki post sebagai default dan merekomendasikannya, CUDNN melakukan postpadding, dan Huggingface hanya Transformer mendukung postpadding, jadi saya sangat menantang agar prepadding lebih populer. PyTorch bahkan tidak mendukung prepadding saat ini. - person runDOSrun; 26.02.2021
comment
@runDOSrun, menurut saya Anda salah, harap baca kembali makalah yang telah saya tautkan. Artikel itu dan artikel lainnya menunjukkan bahwa pra-padding adalah cara yang tepat. Bukan post padding, untuk LSTM. Saya dapat menghasilkan banyak tautan untuk hal yang sama. tautan 1, tautan 2, tautan 3. - person Akshay Sehgal; 26.02.2021
comment
Mengenai klaim Anda atas Transformers, Masker memberikan cara yang efisien untuk membedakan bagian rangkaian yang diberi bantalan dan yang tidak diberi bantalan. - person Akshay Sehgal; 26.02.2021
comment
Dan, tautan yang Anda tampilkan tentang merekomendasikan TF hanya karena tautan tersebut memungkinkan Anda untuk menggunakan implementasi CuDNN (seperti yang disebutkan secara eksplisit setelah kalimat yang dirujuk) - person Akshay Sehgal; 26.02.2021
comment
Ditambah pra-padding terbukti (seperti pada makalah yang saya tautkan di atas) berkinerja lebih baik dengan RNN dan LSTM tetapi tidak berpengaruh apa pun pada arsitektur berbasis CNN (harap baca ringkasan akhir makalah) - person Akshay Sehgal; 26.02.2021
comment
@AkshaySehgal Terima kasih, tetapi sumber Anda memberikan klaim tanpa bukti apa pun (SO bahkan mengulanginya di komentar). Makalah yang dikutip, khususnya, tampaknya tidak ditinjau oleh rekan sejawat dan memberikan eksperimen berskala sangat kecil dengan satu model pada satu kumpulan data. Saya mohon maaf jika hal ini terkesan berlebihan, namun secara ilmiah hal ini perlu direplikasi dalam lebih banyak penelitian agar dapat dianggap sebagai bukti kuat. Jika kita bisa sepakat untuk tidak setuju, saya sudah menegaskan maksud saya: tidak jelas mana yang lebih baik karena ada perbedaan pendapat yang beredar. - person runDOSrun; 26.02.2021
comment
Seperti yang Anda tunjukkan, mungkin saja hasilnya berbeda-beda berdasarkan skenario tertentu, jadi saya memahami dari mana pendapat Anda. Juga akan membantu, untuk pemahaman saya, jika Anda memiliki sumber yang secara pasti menunjukkan alasan mengapa post-padding lebih baik. - person Akshay Sehgal; 26.02.2021