Đối với RNN (ví dụ: LSTM và GRU), đầu vào lớp là một danh sách các dấu thời gian và mỗi dấu thời gian là 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:
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.
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.
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-Fei và Vinyals et al . Đây là cách nó hoạt động:
- Đố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⃗
- 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⃗ +b⃗ Wb⃗
- Đố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.