Sử dụng tốt nhất LSTM cho dự đoán sự kiện trong chuỗi


9

Giả sử chuỗi 1 chiều sau:

A, B, C, Z, B, B, #, C, C, C, V, $, W, A, % ...

Chữ cái A, B, C, ..ở đây đại diện cho các sự kiện 'thông thường'.

Biểu tượng #, $, %, ...ở đây đại diện cho các sự kiện 'đặc biệt'

Khoảng cách thời gian giữa tất cả các sự kiện là không đồng nhất (bất cứ điều gì từ vài giây đến vài ngày) mặc dù càng xa trong một sự kiện thì càng ít có khả năng ảnh hưởng đến các sự kiện trong tương lai. Lý tưởng nhất là tôi có thể tính đến sự chậm trễ thời gian này một cách rõ ràng.

Có thứ tự 10000 loại sự kiện thông thường và theo thứ tự 100 loại sự kiện đặc biệt. Số lượng các sự kiện thông thường trước một sự kiện đặc biệt khác nhau nhưng không chắc là nhiều hơn 100-300.

Về cơ bản, tôi quan tâm đến việc tìm kiếm các mẫu trong chuỗi sự kiện thông thường mà cuối cùng là dự đoán cho các sự kiện đặc biệt.

Bây giờ bạn có thể tiếp cận điều này theo các cách khác nhau: tạo vectơ đặc trưng + phân loại tiêu chuẩn, học quy tắc kết hợp, HMM, v.v.

Trong trường hợp này, tôi tò mò về cách một mạng dựa trên LSTM sẽ phù hợp nhất. Nói thẳng sẽ là làm một cái gì đó giống như char-rnn của Karparth và dự đoán sự kiện tiếp theo được đưa ra trong lịch sử. Sau đó cho một chuỗi mới

C, Z, Q, V, V, ... , V, W

Bạn có thể chạy nó qua mô hình và xem sự kiện đặc biệt nào có thể xảy ra tiếp theo. Nhưng nó không hoàn toàn cảm thấy phù hợp.

Vì đây là một vấn đề phân loại theo thời gian, có vẻ như điều đúng đắn cần làm là sử dụng Phân loại tạm thời kết nối theo mô tả của Alex Graves .

Tuy nhiên, trước khi đầu tư quá nhiều vào lúc này, tôi đang tìm kiếm thứ gì đó dễ dàng hơn và nhanh hơn để thử nghiệm để có cảm giác về việc các LSTM sẽ phù hợp như thế nào ở đây. Tensorflow sẽ thấy một ví dụ CTC tại một số điểm, nhưng chưa.

Vì vậy, câu hỏi (phụ) của tôi là:

  1. Với vấn đề ở trên và tôi muốn thử nghiệm với các LSTM, có đáng để thử cách tiếp cận kiểu char-rnn không, tôi có nên cắn viên đạn và nắm bắt với CTC không, hay có nơi nào tốt hơn để bắt đầu.
  2. Làm thế nào bạn sẽ kết hợp rõ ràng thông tin thời gian giữa các sự kiện. Sử dụng đồng hồ cố định với các sự kiện không hoạt động rõ ràng hoạt động nhưng có vẻ xấu.
  3. Giả sử tôi quản lý để đào tạo một LSTM, có cách nào để kiểm tra mô hình để xem loại "họa tiết" nào đã được chọn không? (nghĩa là tương tự với các bộ lọc trong convnets)

Bất kỳ mã mẫu (ưu tiên python) luôn hữu ích.

Chỉnh sửa: Chỉ cần thêm rằng có một số nhiễu trong chuỗi. Một số sự kiện có thể được bỏ qua một cách an toàn nhưng chính xác những sự kiện không phải lúc nào cũng có thể nói lên phía trước. Vì vậy, lý tưởng là mô hình (và các họa tiết bắt nguồn từ nó) mạnh mẽ chống lại điều này.


Đây là loại tập dữ liệu nào?
cướp biển

@felbo: ​​Tôi không thể nói rõ ràng không may nhưng dữ liệu của nó từ phần cứng, không phải tài chính / bán hàng / quảng cáo / ..
dgorissen

Đồng ý. Trên thực tế, mã hóa một nóng (theo câu trả lời của tôi) có thể có vấn đề nếu bạn có ~ 10k loại sự kiện. Bạn có thể có thể làm một cái gì đó dọc theo dòng của word2vec để bạn chỉ có ~ 300 kích thước đầu vào. Tương tự, có thể có vấn đề khi dự đoán loại sự kiện tiếp theo trong số 10k tùy chọn. Thay vào đó, sẽ hợp lý khi điều chỉnh lại vấn đề để chỉ dự đoán 100 loại đặc biệt và sau đó là lớp 'sự kiện bình thường' cho tất cả 10k sự kiện thông thường.
cướp biển

Nói rõ hơn: Tôi giả sử bạn có hàng tấn dữ liệu cho loại vấn đề này.
cướp biển

@felbo: ​​thực sự. Đã nghĩ đến việc chỉ sử dụng một chỉ mục, học một vectơ nhúng như word2vec hoặc nhóm các sự kiện vào các lớp để giảm tính chiều. Tương tự về phía dự đoán, đồng ý.
dgorissen

Câu trả lời:


4

Dữ liệu của bạn dường như chỉ là chuỗi các mã thông báo. Hãy thử xây dựng bộ mã hóa tự động LSTM và để bộ mã hóa tìm hiểu một số biểu diễn cố định của phần đầu tiên của chuỗi và bộ giải mã để dự đoán phần còn lại.

Những đại diện này sẽ là họa tiết của bạn.

Tham chiếu:

Bahdanau, D., Cho, K., & Bengio, Y. (2014). Dịch máy thần kinh bằng cách cùng học để căn chỉnh và dịch. bản in sẵn arXiv arXiv: 1409.0473.

Srivastava, N., Mansimov, E., & Salakhutdinov, R. (2015). Học tập không giám sát các biểu diễn video bằng LSTM. bản in sẵn arXiv arXiv: 1502.04681.


1

Phần quan trọng nhất là cách bạn "cụm từ" vấn đề phân loại, nghĩa là cách bạn thể hiện đầu vào và những gì bạn muốn đầu ra. Thấy rằng bạn có rất nhiều loại sự kiện khác nhau, bạn cần phải học cách nhúng chúng. Điều này có thể được thực hiện trực tiếp trong ví dụ Keras. Bạn có thể xem ví dụ nàyvề cách học nhúng trực tiếp từ dữ liệu. Một cách tiếp cận khác là học cách nhúng trước bằng cách sử dụng phương pháp không giám sát, chẳng hạn như word2vec. Tuy nhiên, điều này đòi hỏi nhiều công việc hơn từ phía bạn khi bạn cần đưa ra một nhiệm vụ có liên quan và đào tạo điều đó để tạo ra sự nhúng. Cho rằng bạn có đủ dữ liệu sẽ dễ dàng hơn (mặc dù hơi kém hiệu quả) để học cách nhúng trực tiếp. Đối với đầu ra, tôi sẽ không dự đoán tất cả các loại sự kiện khác nhau, mà chỉ các sự kiện đặc biệt và một "lớp nền" để giữ cho vấn đề khả thi. Nếu bạn thực sự muốn có thể dự đoán từng lớp duy nhất thì bạn cần sử dụng một số thủ thuật (xem cách word2vec thực hiện).

Về thời gian giữa các sự kiện. Bạn chỉ có thể thêm nó vào LSTM của mình dưới dạng thứ nguyên bổ sung (xem ví dụ này để biết ví dụ về cách thực hiện điều đó trong Keras). Điều này sẽ dễ thực hiện và sẽ cho phép LSTM tính đến sự khác biệt tạm thời.

Tôi không biết cách nào để hình dung các họa tiết bằng cách "không kiểm soát" bản chất tạm thời của mạng. Bạn có thể tạo ra một số họa tiết bằng cách sử dụng một mạng chung, nhưng nó có thể khó diễn giải. Một cách để khám phá các họa tiết có thể chỉ đơn giản là tìm ra 100000 chuỗi phổ biến nhất của các sự kiện không đặc biệt, ví dụ như độ dài 20-100, nhập chúng vào mô hình được đào tạo và trích xuất đầu ra xác suất từ ​​lớp softmax cuối cùng. Theo cách này, bạn có thể tìm thấy các chuỗi được kết nối với các sự kiện đặc biệt. Tuy nhiên, thật khó để nói liệu phương pháp tiếp cận này có khả thi / hữu ích hay không mà không cần nhìn vào dữ liệu của bạn.


Chỉ để được rõ ràng. Về mặt mô-đun, bạn có nghĩa là xem xét dữ liệu thô và trích xuất các chuỗi phổ biến nhất có độ dài tối thiểu cụ thể (hoặc sử dụng khai thác tập hợp mục thường xuyên để tạo chúng) và sau đó xem dự đoán sự kiện đặc biệt là tối đa ở đâu? Trong trường hợp đó có vẻ dễ dàng hơn để tiếp cận nó như là một vấn đề phân loại tiêu chuẩn không?
dgorissen

Tôi đã hy vọng bản chất phụ thuộc thời gian của một mô hình định kỳ sẽ cho phép một số loại kiểm tra hữu ích. Mặt khác, có lẽ điều cần làm là chạy mô hình theo kiểu 'đảo ngược'. Tối đa hóa độ tin cậy dự đoán của từng loại sự kiện đặc biệt và xem loại kết quả nào dẫn đến. Tuy nhiên, không hoàn toàn chắc chắn cách thức hoạt động và có lẽ cần một mô hình tổng quát.
dgorissen

1
Xin vui lòng xem câu trả lời cập nhật của tôi. Có, tôi có nghĩa là xem "dự đoán sự kiện đặc biệt là tối đa" dựa trên dữ liệu thô. Tôi không hiểu ý của bạn về việc tiếp cận nó như là một vấn đề phân loại tiêu chuẩn :)
cướp biển
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.