RNN với nhiều tính năng


27

Tôi có một chút kiến ​​thức tự học khi làm việc với các thuật toán Machine Learning (công cụ loại Ngẫu nhiên tuyến tính và Hồi quy tuyến tính cơ bản). Tôi quyết định mở chi nhánh và bắt đầu học RNN với Keras. Khi xem xét hầu hết các ví dụ, thường liên quan đến dự đoán cổ phiếu, tôi không thể tìm thấy bất kỳ ví dụ cơ bản nào về nhiều tính năng đang được triển khai ngoài 1 cột là ngày tính năng và đầu ra là đầu ra. Có một điều cơ bản quan trọng tôi đang thiếu hoặc một cái gì đó?

Nếu bất cứ ai có một ví dụ tôi sẽ đánh giá rất cao nó.

Cảm ơn!


1
Không chắc chắn những gì bạn có nghĩa là "nhiều tính năng". Nếu bạn có nghĩa là nhiều hơn một tính năng có ảnh hưởng đến việc học, thì bạn chỉ cần sử dụng ma trận thiết kế đa biến. Xin làm rõ bằng một ví dụ hoặc một cái gì đó.
horaceT

@horaceT Tôi đã giải thích multiple features ở đây , một câu hỏi cụ thể hơn về cách sử dụng RNN cho các dự đoán chuỗi thời gian với các tính năng chứa dữ liệu số và dữ liệu không phải là số?
hhh

Câu trả lời:


25

Mạng thần kinh tái phát (RNNs) được thiết kế để tìm hiểu dữ liệu chuỗi. Như bạn đoán, họ chắc chắn có thể lấy nhiều tính năng làm đầu vào! Các RNN của Keras lấy đầu vào 2D ( T , F ) của dấu thời gian T và tính năng F (Tôi bỏ qua kích thước lô ở đây).

Tuy nhiên, bạn không phải lúc nào cũng cần hoặc muốn các dấu thời gian trung gian, t = 1, 2 ... ( T - 1). Do đó, Keras linh hoạt hỗ trợ cả hai chế độ. Để có đầu ra tất cả các dấu thời gian T , hãy chuyển return_sequences=Trueđến RNN của bạn (ví dụ: LSTMhoặc GRU) khi xây dựng. Nếu bạn chỉ muốn dấu thời gian cuối cùng t = T , thì hãy sử dụng return_sequences=False(đây là mặc định nếu bạn không chuyển return_sequencescho hàm tạo).

Dưới đây là ví dụ của cả hai chế độ này.

Ví dụ 1: Học trình tự

Đây là một ví dụ nhanh về đào tạo LSTM (loại RNN) giữ toàn bộ chuỗi xung quanh. Trong ví dụ này, mỗi điểm dữ liệu đầu vào có 2 dấu thời gian, mỗi điểm có 3 tính năng; dữ liệu đầu ra có 2 dấu thời gian (vì return_sequences=True), mỗi điểm có 4 điểm dữ liệu (vì đó là kích thước tôi chuyển đến LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    [
        # Target features at timestep 1
        [101, 102, 103, 104],
        # Target features at timestep 2
        [105, 106, 107, 108]
    ],
    # Datapoint 2
    [
        # Target features at timestep 1
        [201, 202, 203, 204],
        # Target features at timestep 2
        [205, 206, 207, 208]
    ]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=True, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=True)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Ví dụ 2: Học dấu thời gian cuối cùng

Mặt khác, nếu bạn muốn huấn luyện một LSTM chỉ xuất ra dấu thời gian cuối cùng trong chuỗi, thì bạn cần phải đặt return_sequences=False(hoặc chỉ loại bỏ nó hoàn toàn khỏi hàm tạo, vì Falselà mặc định). Và sau đó dữ liệu đầu ra của bạn ( data_ytrong ví dụ trên) cần được sắp xếp lại, vì bạn chỉ cần cung cấp dấu thời gian cuối cùng. Vì vậy, trong ví dụ thứ hai này, mỗi điểm dữ liệu đầu vào vẫn có 2 dấu thời gian, mỗi điểm có 3 tính năng. Tuy nhiên, dữ liệu đầu ra chỉ là một vectơ duy nhất cho mỗi điểm dữ liệu, bởi vì chúng tôi đã làm phẳng mọi thứ xuống một dấu thời gian duy nhất. Tuy nhiên, mỗi vectơ đầu ra vẫn có 4 tính năng (vì đó là kích thước tôi chuyển đến LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    # Target features at timestep 2
    [105, 106, 107, 108],
    # Datapoint 2
    # Target features at timestep 2
    [205, 206, 207, 208]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=False, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=False)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Cảm ơn bạn đã giải thích tuyệt vời của bạn. Mối quan hệ giữa datapoint # 1 và datapoint # 2 là gì. Ví dụ, trong tình huống đầu tiên, nếu bạn đã xóa datapoint 2 và đặt nó dưới datapoint 1, thì bây giờ chúng ta có 4 bước thời gian. Làm thế nào điều đó sẽ ảnh hưởng đến toàn bộ mô hình?
Rjay155

Không có mối quan hệ đặc biệt giữa các datapoint. Một bộ đào tạo học tập sâu tốt sẽ có nhiều hàng chục ngàn hoặc thậm chí hàng triệu datapoint. Một điểm dữ liệu = một mẫu đào tạo, đó là tất cả. Nếu bạn đã "hợp nhất" các biểu dữ liệu số 1 và số 2, thì data_xchỉ cần chứa một biểu dữ liệu duy nhất và biểu dữ liệu đó sẽ có bốn dấu thời gian, mỗi chiều có 3 chiều (và tương tự, bạn sẽ phải hợp nhất data_ytheo cùng một cách). Số lượng dấu thời gian bạn sử dụng chỉ đơn giản phụ thuộc vào những gì bạn đang cố gắng mô hình hóa (và có bao nhiêu dấu thời gian có liên quan cho quá trình đó).
Adam Sypniewski

@Adam Sypniewski Tôi có câu hỏi về y. data_y = numpy.array ([# Datapoint 1 # Target Feature at timestep 2 [[105, 106, 107, 108], [0, 1]], # Datapoint 2 # Target các tính năng tại timestep 2 [[205, 206, 207 , 208], [1, 0]]]) nếu một trong các tính năng phân loại của tôi. Làm thế nào tôi sẽ cấu trúc này. Cám ơn!
Hua Ye

2
Trong trường hợp đó, có lẽ bạn nên đưa đầu ra của RNN vào một lớp dày đặc, để mỗi dấu thời gian đầu ra được ánh xạ thành một loại nóng.
Adam Sypniewski

Làm thế nào bạn có thể hình dung kết quả ở đây? Một số lô sẽ hữu ích.
hhh
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.