Tại sao tổn thất / độ chính xác dao động trong quá trình đào tạo? (Máy ảnh, LSTM)


11

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: nhập mô tả hình ảnh ở đây

Và đây là sự mất mát & chính xác trong quá trình đào tạo: nhập mô tả hình ảnh ở đây

(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: nhập mô tả hình ảnh ở đây

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 lrnhư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ế:

  1. 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?

  2. 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 lrtham 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): nhập mô tả hình ảnh ở đây

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ế:

  1. 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);
  2. 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);
  3. 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:

nhập mô tả hình ảnh ở đây

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:

nhập mô tả hình ảnh ở đây

Đối với batch_size=2LSTM 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: nhập mô tả hình ảnh ở đây


Điều gì về việc giới thiệu đúng vấn đề của bạn (câu hỏi nghiên cứu bạn đang cố gắng trả lời, mô tả dữ liệu của bạn, hiển thị mô hình của bạn, v.v.) là gì? Bạn chỉ hiển thị cho chúng tôi các lớp của bạn, nhưng chúng tôi không biết gì về dữ liệu, tiền xử lý, chức năng mất, kích thước lô và nhiều chi tiết khác có thể ảnh hưởng đến kết quả
DeltaIV

1
Những thứ khác có thể ảnh hưởng đến sự ổn định là phân loại, xáo trộn, đệm và tất cả các mánh khóe cần thiết để có được các RNN được đào tạo hàng loạt nhỏ để làm việc với các chuỗi có độ dài thay đổi rộng rãi. Những mũi nhọn khổng lồ bạn nhận được vào khoảng 1200 kỷ nguyên nhắc nhở tôi về một trường hợp mà tôi phải giải quyết chính xác điều đó. Ai biết được, có thể sự chú ý là tất cả những gì bạn cần
DeltaIV

1
Tôi biết đó là điên rồ. Đó chính xác là lý do tại sao tôi ở đây: để hiểu tại sao nó lại như thế này / làm thế nào có thể sửa nó.
Valeria

1
1. Robot có nhiều cảm biến nhưng tôi chỉ sử dụng các phép đo dòng điện.
Valeria

Câu trả lời:


4

Có một số lý do có thể gây ra sự dao động trong mất tập luyện qua các kỷ nguyên. Mặc dù vậy, vấn đề chính là hầu hết tất cả các mạng lưới thần kinh đều được đào tạo với các dạng khác nhau của độ dốc ngẫu nhiên . Đây là lý do tại sao tham số batch_size tồn tại xác định có bao nhiêu mẫu bạn muốn sử dụng để thực hiện một bản cập nhật cho các tham số mô hình. Nếu bạn sử dụng tất cả các mẫu cho mỗi bản cập nhật, bạn sẽ thấy nó giảm dần và cuối cùng đạt đến giới hạn. Lưu ý rằng có những lý do khác cho việc mất có một số hành vi ngẫu nhiên.

Điều này giải thích tại sao chúng ta thấy dao động. Nhưng trong trường hợp của bạn, điều đó là bình thường hơn tôi sẽ nói. Nhìn vào mã của bạn, tôi thấy hai nguồn có thể.

  1. Mạng lớn, tập dữ liệu nhỏ: Có vẻ như bạn đang đào tạo một mạng tương đối lớn với các tham số 200K + với số lượng mẫu rất nhỏ, ~ 100. Để đặt điều này vào phối cảnh, bạn muốn tìm hiểu 200K tham số hoặc tìm mức tối thiểu cục bộ tốt trong không gian 200K-D chỉ bằng 100 mẫu. Do đó, bạn có thể sẽ chỉ đi lang thang xung quanh chứ không phải khóa chặt một cực tiểu địa phương tốt. (Việc lang thang cũng là do lý do thứ hai dưới đây).

  2. Lô rất nhỏ. Bạn sử dụng batch_size rất nhỏ. Vì vậy, nó giống như bạn đang tin tưởng từng phần nhỏ của các điểm dữ liệu. Giả sử trong các điểm dữ liệu của bạn, bạn có một mẫu bị gắn nhãn sai. Mẫu này khi được kết hợp với 2-3 mẫu thậm chí được dán nhãn chính xác, có thể dẫn đến một bản cập nhật không làm giảm tổn thất toàn cầu, nhưng tăng nó hoặc ném nó ra khỏi cực tiểu địa phương. Khi batch_size lớn hơn, các hiệu ứng như vậy sẽ bị giảm. Cùng với các lý do khác, thật tốt khi có batch_size cao hơn một số mức tối thiểu. Có nó quá lớn cũng sẽ khiến việc đào tạo trở nên chậm chạp. Do đó, batch_size được coi là một siêu tham số.


0

Đường cong mất mát của bạn trông không tệ lắm đối với tôi. Nó chắc chắn nên "dao động" lên xuống một chút, miễn là xu hướng chung là nó đang đi xuống - điều này có ý nghĩa.

Kích thước hàng loạt cũng sẽ tham gia vào cách mạng của bạn học, vì vậy bạn có thể muốn tối ưu hóa điều đó cùng với tốc độ học tập của bạn. Ngoài ra, tôi sẽ vẽ toàn bộ đường cong (cho đến khi nó đạt độ chính xác 100% / tổn thất tối thiểu). Có vẻ như bạn đã đào tạo nó trong 800 kỷ nguyên và chỉ hiển thị 50 kỷ nguyên đầu tiên - toàn bộ đường cong có thể sẽ đưa ra một câu chuyện rất khác.


Bạn đúng rồi. Bên cạnh đó, sau khi tôi chạy lại khóa đào tạo, nó thậm chí còn kém ổn định hơn, vì vậy tôi gần như chắc chắn rằng mình đang thiếu một số lỗi. Tôi đã cập nhật bài viết với việc đào tạo hơn 1000 kỷ nguyên.
Valeria

0

Các dao động là bình thường trong giới hạn nhất định và phụ thuộc vào thực tế là bạn sử dụng phương pháp heuristic nhưng trong trường hợp của bạn thì chúng quá mức. Mặc dù tất cả các hiệu suất có một hướng xác định và do đó hệ thống hoạt động. Từ các biểu đồ bạn đã đăng, vấn đề phụ thuộc vào dữ liệu của bạn nên việc đào tạo khó khăn. Nếu bạn đã cố gắng thay đổi tốc độ học tập, hãy thử thay đổi thuật toán đào tạo. Bạn sẽ đồng ý kiểm tra dữ liệu của mình: trước tiên hãy tính tỷ lệ lỗi Bayes bằng KNN (sử dụng hồi quy lừa trong trường hợp bạn cần), bằng cách này bạn có thể kiểm tra xem dữ liệu đầu vào có chứa tất cả thông tin bạn cần không. Sau đó thử LSTM mà không cần xác thực hoặc bỏ học để xác minh rằng nó có khả năng đạt được kết quả cần thiết cho bạn. Nếu thuật toán đào tạo không phù hợp, bạn sẽ gặp vấn đề tương tự ngay cả khi không có xác nhận hoặc bỏ học. Cuối cùng, điều chỉnh đào tạo và kích thước xác nhận để có kết quả tốt nhất trong tập kiểm tra. Lý thuyết học thống kê không phải là một chủ đề có thể được nói đến cùng một lúc, chúng ta phải tiến hành từng bước.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.