Tôi sử dụng mạng LSTM trong Keras. Trong quá trình đào tạo, sự mất mát biến động rất nhiều và tôi không hiểu tại sao điều đó sẽ xảy ra.
Đây là NN tôi đã sử dụng ban đầu:
Và đây là sự mất mát & chính xác trong quá trình đào tạo:
(Lưu ý rằng độ chính xác thực sự đạt đến 100% cuối cùng, nhưng phải mất khoảng 800 epoch.)
Tôi nghĩ rằng những biến động này xảy ra do các lớp Dropout / thay đổi về tốc độ học tập (tôi đã sử dụng rmsprop / adam), vì vậy tôi đã tạo ra một mô hình đơn giản hơn:
Tôi cũng đã sử dụng SGD mà không có động lực và sâu răng. Tôi đã thử các giá trị khác nhau lr
nhưng vẫn có kết quả như nhau.
sgd = optimizers.SGD(lr=0.001, momentum=0.0, decay=0.0, nesterov=False)
Nhưng tôi vẫn gặp phải một vấn đề tương tự: mất mát dao động thay vì chỉ giảm. Tôi đã luôn nghĩ rằng sự mất mát chỉ là giả sử để dần dần đi xuống nhưng ở đây dường như không hành xử như vậy.
Vì thế:
Có phải bình thường cho sự mất mát dao động như vậy trong quá trình đào tạo? Và tại sao nó sẽ xảy ra?
Nếu không, tại sao điều này lại xảy ra đối với mô hình LSTM đơn giản với
lr
tham số được đặt thành một giá trị thực sự nhỏ?
Cảm ơn. (Xin lưu ý rằng tôi đã kiểm tra các câu hỏi tương tự ở đây nhưng nó không giúp tôi giải quyết vấn đề của mình.)
Trình cập nhật.: Mất hơn 1000 epoch (không có lớp BatchN normalization, bộ biến tần RmsProp của Keras):
Cập nhật. 2: Đối với biểu đồ cuối cùng:
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
history = model.fit(train_x, train_y, epochs = 1500)
Dữ liệu: chuỗi các giá trị của dòng điện (từ các cảm biến của robot).
Biến mục tiêu: bề mặt mà robot đang hoạt động (dưới dạng một vectơ nóng, 6 loại khác nhau).
Sơ chế:
- thay đổi tần số lấy mẫu để các chuỗi không quá dài (LSTM dường như không học cách khác);
- cắt các chuỗi trong các chuỗi nhỏ hơn (cùng độ dài cho tất cả các chuỗi nhỏ hơn: 100 dấu thời gian mỗi chuỗi);
- kiểm tra xem mỗi 6 lớp có xấp xỉ cùng một số ví dụ trong tập huấn luyện không.
Không đệm.
Hình dạng của tập huấn luyện (# Hậu quả, #timesteps theo trình tự, #features):
(98, 100, 1)
Hình dạng của các nhãn tương ứng (dưới dạng một vectơ nóng cho 6 loại):
(98, 6)
Lớp:
Phần còn lại của các tham số (tốc độ học tập, kích thước lô) giống như mặc định trong Keras:
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
batch_size: Số nguyên hoặc Không có. Số lượng mẫu trên mỗi bản cập nhật gradient. Nếu không được chỉ định, nó sẽ mặc định là 32.
Cập nhật. 3:
Mất mát cho batch_size=4
:
Đối với batch_size=2
LSTM dường như không học đúng cách (tổn thất dao động xung quanh cùng một giá trị và không giảm).
Cập nhật. 4: Để xem vấn đề không chỉ là lỗi trong mã: Tôi đã tạo một ví dụ nhân tạo (2 lớp không khó để phân loại: cos vs arccos). Mất mát và độ chính xác trong quá trình đào tạo cho các ví dụ này: