Độ chính xác giảm đột ngột khi đào tạo LSTM hoặc GRU trong Keras


8

Mạng thần kinh tái phát của tôi (LSTM, resp. GRU) hoạt động theo cách mà tôi không thể giải thích. Việc đào tạo bắt đầu và nó đào tạo tốt (kết quả trông khá tốt) khi độ chính xác đột ngột giảm (và mất nhanh chóng tăng) - cả số liệu đào tạo và kiểm tra. Đôi khi, mạng chỉ phát điên và trả về các đầu ra ngẫu nhiên và đôi khi (như trong ba ví dụ cuối cùng), nó bắt đầu trả lại cùng một đầu ra cho tất cả các đầu vào .

hình ảnh

Bạn có bất kỳ lời giải thích cho hành vi này ? Bất kỳ ý kiến ​​đều được chào đón. Xin vui lòng, xem mô tả nhiệm vụ và các con số dưới đây.

Nhiệm vụ: Từ một từ dự đoán vectơ word2vec của nó Đầu vào: Chúng tôi có một mô hình word2vec riêng (chuẩn hóa) và chúng tôi cung cấp cho mạng bằng một từ (từng chữ cái). Chúng tôi đệm các từ (xem ví dụ dưới đây). Ví dụ: Chúng tôi có một bóng đá từ và chúng tôi muốn dự đoán vector word2vec của nó rộng 100 chiều. Sau đó, đầu vào là $football$$$$$$$$$$.

Ba ví dụ về hành vi:

LSTM một lớp

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

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

hình ảnh

GRU một lớp

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

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

hình ảnh

LSTM hai lớp

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"])

hình ảnh

Chúng tôi cũng đã trải nghiệm loại hành vi này trong một dự án khác trước đó sử dụng kiến ​​trúc tương tự nhưng mục tiêu và dữ liệu của nó là khác nhau. Do đó, lý do không nên được ẩn trong dữ liệu hoặc trong mục tiêu cụ thể mà là trong kiến ​​trúc.


Bạn đã tìm ra những gì đã gây ra vấn đề?
Antoine

Thật không may, không thực sự. Chúng tôi đã thay đổi sang một kiến ​​trúc khác và sau đó chúng tôi không có cơ hội quay lại với kiến ​​trúc này. Chúng tôi có một số manh mối mặc dù. Chúng tôi đoán là một cái gì đó đã khiến một hoặc nhiều thông số thay đổi thành nan.
Marek

nantham số sẽ không dẫn đến mất non-nan. Tôi đoán là độ dốc của bạn xảy ra để phát nổ, điều tương tự đã xảy ra với tôi trong các mạng bình thường không theo đợt.
Lugi

Đó cũng là một trong những điều chúng tôi đã cố gắng kiểm tra bằng cách sử dụng TensorBoard nhưng vụ nổ gradient chưa bao giờ được chứng minh trong trường hợp của chúng tôi. Ý tưởng là nanxuất hiện trong một trong những tính toán và sau đó nó được mặc định thành một giá trị khác khiến mạng phát điên. Nhưng đó chỉ là một phỏng đoán hoang dã. Cảm ơn ý kiến ​​của bạn.
Marek

Câu trả lời:


2

Dưới đây là gợi ý của tôi để xác định chính xác vấn đề:

1) Nhìn vào đường cong học tập: Đường cong học tập trên tàu được thiết lập như thế nào? Nó có học tập huấn luyện không? Nếu không, trước tiên hãy làm việc đó để đảm bảo bạn có thể quá phù hợp với tập huấn luyện.

2) Kiểm tra dữ liệu của bạn để đảm bảo không có NaN trong đó (đào tạo, xác nhận, kiểm tra)

3) Kiểm tra độ dốc và trọng lượng để đảm bảo không có NaN.

4) Giảm tốc độ học tập khi bạn luyện tập để đảm bảo không phải vì một bản cập nhật lớn đột ngột bị kẹt trong một cực tiểu sắc nét.

5) Để đảm bảo mọi thứ đều đúng, hãy kiểm tra dự đoán của mạng để mạng của bạn không tạo ra một số dự đoán liên tục hoặc lặp đi lặp lại.

6) Kiểm tra xem dữ liệu trong lô của bạn có cân đối với tất cả các lớp không.

7) bình thường hóa dữ liệu của bạn thành phương sai đơn vị trung bình bằng không. Khởi tạo các trọng số tương tự. Nó sẽ hỗ trợ đào tạo.

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.