Thêm tính năng cho mô hình chuỗi thời gian LSTM


42

đã đọc một chút về LSTM và việc sử dụng chúng cho chuỗi thời gian và điều đó thật thú vị nhưng khó khăn cùng một lúc. Một điều tôi gặp khó khăn với sự hiểu biết là cách tiếp cận để thêm các tính năng bổ sung vào danh sách các tính năng chuỗi thời gian. Giả sử bạn có tập dữ liệu của mình như thế này:

t-3, t-2, t-1, Đầu ra

Bây giờ hãy nói rằng bạn biết bạn có một tính năng ảnh hưởng đến đầu ra nhưng nó không nhất thiết phải là tính năng chuỗi thời gian, giả sử thời tiết bên ngoài. Đây có phải là thứ bạn có thể thêm và LSTM sẽ có thể phân biệt khía cạnh chuỗi thời gian là gì và không phải là gì?


Tôi thích câu hỏi của bạn. Tuy nhiên, bạn có thể giải thích cách tính năng chuỗi không thời gian này ảnh hưởng đến đầu ra tại thời điểm t, dựa trên kiến ​​thức về chủ đề.
horaceT

Câu trả lời:


39

Đối với RNN (ví dụ: LSTM và GRU), đầu vào lớp một danh sách các dấu thời gian và mỗi dấu thời gian một thang đo tính năng. Điều đó có nghĩa là bạn có thể có một tenxơ đầu vào như thế này (theo ký hiệu Pythonic):

# Input tensor to RNN
[
    # Timestep 1
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    # Timestep 2
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    # Timestep 3
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    ...
]

Vì vậy, hoàn toàn, bạn có thể có nhiều tính năng tại mỗi dấu thời gian. Trong tâm trí của tôi, thời tiết là một tính năng chuỗi thời gian: nơi tôi sống, nó là một chức năng của thời gian. Vì vậy, sẽ khá hợp lý khi mã hóa thông tin thời tiết là một trong những tính năng của bạn trong mỗi dấu thời gian (với một mã hóa phù hợp, như cloudy = 0, sunny = 1, v.v.).

Nếu bạn có dữ liệu không theo chuỗi thời gian, thì thực sự không có ý nghĩa gì khi chuyển nó qua LSTM. Có thể LSTM sẽ vẫn hoạt động, nhưng ngay cả khi có, nó có thể sẽ phải trả giá bằng tổn thất cao hơn / độ chính xác thấp hơn trên mỗi thời gian đào tạo.

Ngoài ra, bạn có thể giới thiệu loại thông tin "bổ sung" này vào mô hình của mình bên ngoài LSTM bằng các lớp bổ sung. Bạn có thể có một luồng dữ liệu như thế này:

TIME_SERIES_INPUT ------> LSTM -------\
                                       *---> MERGE ---> [more processing]
AUXILIARY_INPUTS --> [do something] --/

Vì vậy, bạn sẽ hợp nhất các đầu vào phụ của bạn vào các đầu ra LSTM và tiếp tục mạng của bạn từ đó. Bây giờ mô hình của bạn chỉ đơn giản là đa đầu vào.

Ví dụ: giả sử trong ứng dụng cụ thể của bạn, bạn chỉ giữ đầu ra cuối cùng của chuỗi đầu ra LSTM. Giả sử rằng đó là một vectơ có độ dài 10. Đầu vào phụ của bạn có thể là thời tiết được mã hóa của bạn (vì vậy là vô hướng). Lớp hợp nhất của bạn chỉ có thể nối thông tin thời tiết phụ trợ vào cuối vectơ đầu ra LSTM để tạo ra một vectơ có độ dài 11. Nhưng bạn không cần giữ dấu thời gian đầu ra LSTM cuối cùng: nếu LSTM xuất ra 100 dấu thời gian, mỗi dấu thời gian với 10 vectơ các tính năng, bạn vẫn có thể giải quyết thông tin thời tiết phụ trợ của mình, dẫn đến 100 dấu thời gian, mỗi dấu bao gồm một vectơ gồm 11 điểm dữ liệu.

Tài liệu Keras về API chức năng của nó có một tổng quan tốt về điều này.

Trong các trường hợp khác, như @horaceT chỉ ra, bạn có thể muốn điều chỉnh LSTM trên dữ liệu phi thời gian. Ví dụ, dự đoán thời tiết ngày mai, vị trí nhất định. Trong trường hợp này, đây là ba gợi ý, mỗi gợi ý tích cực / tiêu cực:

  1. Có dấu thời gian đầu tiên chứa dữ liệu điều hòa của bạn, vì nó sẽ "thiết lập" trạng thái bên trong / ẩn của RNN của bạn một cách hiệu quả. Thành thật mà nói, tôi sẽ không làm điều này, vì một loạt lý do: dữ liệu điều hòa của bạn cần phải có hình dạng giống với các tính năng còn lại của bạn, khiến việc tạo RNNs trở nên khó khăn hơn (về mặt thực sự cẩn thận để theo dõi cách bạn cung cấp dữ liệu vào mạng), mạng có thể "quên" dữ liệu điều hòa với đủ thời gian (ví dụ: chuỗi đào tạo dài hoặc chuỗi dự đoán dài), v.v.

  2. Bao gồm dữ liệu như là một phần của chính dữ liệu tạm thời. Vì vậy, mỗi vectơ tính năng tại một dấu thời gian cụ thể bao gồm dữ liệu chuỗi thời gian "chủ yếu", nhưng sau đó có dữ liệu điều hòa được nối vào cuối mỗi vectơ tính năng. Mạng sẽ học cách nhận ra điều này? Có thể, nhưng ngay cả khi đó, bạn đang tạo ra một nhiệm vụ học tập khó hơn bằng cách làm ô nhiễm dữ liệu chuỗi với thông tin không tuần tự. Vì vậy, tôi cũng sẽ ngăn cản điều này.

  3. Có lẽ cách tiếp cận tốt nhất sẽ là ảnh hưởng trực tiếp đến trạng thái ẩn của RNN tại thời điểm 0. Đây là cách tiếp cận của Karpathy và Fei-FeiVinyals et al . Đây là cách nó hoạt động:

    1. Đối với mỗi mẫu đào tạo, hãy lấy các biến điều kiện của bạn .x
    2. Chuyển đổi / định hình lại các biến điều kiện của bạn bằng một phép biến đổi affine để biến nó thành đúng hình dạng như trạng thái bên trong của RNN: (những và là các trọng số có thể huấn luyện). Bạn có thể có được nó với một lớp dày đặc trong máy ảnh.v=Wx+bWb
    3. Đối với dấu thời gian đầu tiên, hãy thêm vào trạng thái ẩn của RNN khi tính giá trị của nó.v

    Cách tiếp cận này là "đúng" nhất về mặt lý thuyết, vì nó điều kiện đúng RNN trên các đầu vào không theo thời gian của bạn, giải quyết vấn đề hình dạng một cách tự nhiên và cũng tránh làm ô nhiễm dấu thời gian đầu vào của bạn với thông tin bổ sung, không theo thời gian. Nhược điểm là cách tiếp cận này thường yêu cầu kiểm soát mức đồ thị của kiến ​​trúc của bạn, vì vậy nếu bạn đang sử dụng một bản tóm tắt cấp cao hơn như Keras, bạn sẽ khó thực hiện trừ khi bạn thêm loại lớp của riêng mình.


1
Đề xuất tốt, nhưng điều gì xảy ra nếu đầu ra của LSTM có sự phụ thuộc về cấu trúc vào bộ dự báo chuỗi không theo thời gian.
horaceT

Bạn có thể cho một ví dụ?
Adam Sypniewski

6
OK, đây là một ví dụ rất giả tạo. Giả sử bạn đang cố gắng dự đoán thời tiết tại thời điểm t, dựa trên sự quan sát từ các bước thời gian cuối cùng. Thời tiết phụ thuộc vào một phần của thế giới bạn đang ở. Nếu đó là mùa hè ở Bắc bán cầu, thì đó là mùa đông ở Nam bán cầu. Vì vậy, yếu tố bắc / nam này nên được tính đến. Bạn có thể kết hợp nó vào LSTM không?
horaceT

1
Câu hỏi tuyệt vời! Tôi đã bao gồm các chỉnh sửa để giải quyết vấn đề này.
Adam Sypniewski

Thks cho các chỉnh sửa và hai tài liệu tham khảo. Khá hữu dụng.
horaceT

2

Dựa trên tất cả các câu trả lời hay của chủ đề này, tôi đã viết một thư viện để điều kiện về các đầu vào phụ trợ. Nó trừu tượng hóa tất cả sự phức tạp và đã được thiết kế để thân thiện với người dùng nhất có thể:

https://github.com/philipperemy/cond_rnn/ (dòng chảy)

Hy vọng nó giúp!


0

Có một chức năng trong máy ảnh LSTM reset_states(states).

Tuy nhiên, các trạng thái tham số là sự kết hợp của hai trạng thái, trạng thái ẩn h và trạng thái ô.

States = [h, c]

Sẽ rất thú vị nếu bạn biết nên khởi tạo hhoặc ctheo các cách tiếp cận trong các tài liệu được đề cập ở trên.


0

Đây có lẽ không phải là cách hiệu quả nhất, nhưng các biến tĩnh có thể được lặp lại theo thời gian sử dụng tf.tile().

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.