Akurasi tiba-tiba turun saat melatih LSTM atau GRU dalam Keras

8

Jaringan saraf berulang saya (LSTM, resp. GRU) berperilaku dengan cara yang tidak bisa saya jelaskan. Pelatihan dimulai dan dilatih dengan baik (hasilnya terlihat cukup baik) ketika akurasi tiba-tiba turun (dan kehilangan meningkat dengan cepat) - baik pelatihan dan metrik pengujian. Terkadang net menjadi gila dan mengembalikan output acak dan kadang-kadang (seperti pada tiga contoh terakhir yang diberikan) ia mulai mengembalikan output yang sama ke semua input .

gambar

Apakah Anda punya penjelasan untuk perilaku ini ? Pendapat apapun diterima. Silakan, lihat deskripsi tugas dan gambar di bawah ini.

Tugas: Dari suatu kata memprediksi vektor word2vec-nya Masukan: Kami memiliki model word2vec sendiri (dinormalisasi) dan kami memberi makan jaringan dengan kata (huruf per huruf). Kami menulis kata-kata (lihat contoh di bawah). Contoh: Kami memiliki kata football dan kami ingin memprediksi vektor word2vec-nya yang lebar 100 dimensi. Maka inputnya adalah $football$$$$$$$$$$.

Tiga contoh perilaku:

LSTM lapisan tunggal

model = Sequential([
    LSTM(1024, input_shape=encoder.shape, return_sequences=False),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

gambar

GRU lapisan tunggal

model = Sequential([
    GRU(1024, input_shape=encoder.shape, return_sequences=False),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

gambar

LSTM lapisan ganda

model = Sequential([
    LSTM(512, input_shape=encoder.shape, return_sequences=True),
    TimeDistributed(Dense(512, activation="sigmoid")),
    LSTM(512, return_sequences=False),
    Dense(256, activation="tanh"),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

gambar

Kami juga pernah mengalami perilaku semacam ini di proyek lain yang sebelumnya menggunakan arsitektur yang sama tetapi tujuan dan datanya berbeda. Dengan demikian alasannya tidak boleh disembunyikan dalam data atau dalam tujuan tertentu melainkan dalam arsitektur.

Marek
sumber
apakah Anda mengetahui apa yang menyebabkan masalah?
Antoine
Sayangnya tidak juga. Kami berubah ke arsitektur yang berbeda dan kemudian kami tidak memiliki kesempatan untuk kembali ke ini. Kami memiliki beberapa petunjuk. Dugaan kami adalah bahwa sesuatu menyebabkan satu atau lebih params berubah nan.
Marek
nanparameter tidak akan menghasilkan kerugian non-nan. Dugaan saya adalah bahwa gradien Anda terjadi meledak, hal serupa terjadi pada saya di jaringan normal non-batch.
Lugi
Itu juga salah satu hal yang kami coba teliti menggunakan TensorBoard tetapi ledakan gradien tidak pernah terbukti dalam kasus kami. Idenya adalah yang nanmuncul di salah satu perhitungan dan kemudian default ke nilai lain yang menyebabkan jaringan menjadi gila. Tapi itu hanya tebakan liar. Terima kasih atas pendapat anda
Marek

Jawaban:

2

Berikut saran saya untuk menunjukkan masalah:

1) Lihatlah kurva pembelajaran pelatihan: Bagaimana kurva belajar di kereta api ditetapkan? Apakah ia mempelajari perangkat pelatihan? Jika tidak, pertama-tama kerjakan itu untuk memastikan Anda bisa pas pada set pelatihan.

2) Periksa data Anda untuk memastikan tidak ada NaN di dalamnya (pelatihan, validasi, tes)

3) Periksa gradien dan bobot untuk memastikan tidak ada NaN.

4) Kurangi tingkat pembelajaran saat Anda berlatih untuk memastikan itu bukan karena pembaruan besar mendadak yang terjebak dalam minima yang tajam.

5) Untuk memastikan semuanya benar, periksa prediksi jaringan Anda sehingga jaringan Anda tidak membuat beberapa prediksi konstan, atau berulang.

6) Periksa apakah data Anda dalam batch Anda seimbang sehubungan dengan semua kelas.

7) menormalkan data Anda menjadi nol varians unit rata-rata. Inisialisasi bobot juga. Ini akan membantu pelatihan.

PickleRick
sumber