RNN's พร้อมคุณสมบัติมากมาย


27

ฉันมีความรู้เล็กน้อยที่สอนด้วยตนเองทำงานกับอัลกอริทึมการเรียนรู้ของเครื่อง (ป่าประเภทพื้นฐานแบบสุ่มและการถดถอยเชิงเส้นแบบพื้นฐาน) ฉันตัดสินใจแยกสาขาและเริ่มเรียนรู้ RNN กับ Keras เมื่อดูตัวอย่างส่วนใหญ่ซึ่งมักจะเกี่ยวข้องกับการคาดการณ์หุ้นฉันไม่สามารถหาตัวอย่างพื้นฐานของคุณสมบัติหลายอย่างที่ใช้งานนอกเหนือจาก 1 คอลัมน์เป็นวันที่ของคุณลักษณะและอีกอันเป็นเอาท์พุท มีสิ่งสำคัญพื้นฐานที่ขาดหายไปหรือเปล่า

หากใครมีตัวอย่างฉันจะขอบคุณมันมาก

ขอบคุณ!


1
ไม่แน่ใจว่าคุณหมายถึงอะไรโดย "คุณสมบัติหลายอย่าง" หากคุณหมายถึงฟีเจอร์มากกว่าหนึ่งอย่างที่มีผลต่อการเรียนรู้คุณเพียงแค่ใช้เมทริกซ์การออกแบบหลายตัวแปร กรุณาชี้แจงโดยตัวอย่างหรือบางสิ่งบางอย่าง
horaceT

@horaceT ฉันอธิบายเพิ่มเติมmultiple features ที่นี่เป็นคำถามที่เฉพาะเจาะจงมากขึ้นเกี่ยวกับวิธีใช้ RNN สำหรับการคาดคะเนอนุกรมเวลาด้วยคุณลักษณะที่มีข้อมูลตัวเลขและข้อมูลที่ไม่ใช่ตัวเลขหรือไม่
hhh

คำตอบ:


25

เครือข่ายประสาทที่เกิดขึ้นอีก (RNNs) ได้รับการออกแบบมาเพื่อเรียนรู้ข้อมูลลำดับ อย่างที่คุณเดาพวกเขาสามารถใช้คุณสมบัติหลายอย่างเป็นอินพุตได้อย่างแน่นอน! Keras 'RNNs รับอินพุต 2D ( T , F ) ของการตั้งเวลาTและฟีเจอร์F (ฉันไม่สนใจมิติแบทช์ที่นี่)

อย่างไรก็ตามคุณไม่ต้องการหรือต้องการการประทับเวลาระดับกลางเสมอt = 1, 2 ... ( T - 1) ดังนั้น Keras ยืดหยุ่นรองรับทั้งสองโหมด หากต้องการให้มันส่งออกการจับเวลาTทั้งหมดให้ส่งreturn_sequences=Trueไปที่ RNN ของคุณ (เช่นLSTMหรือGRU) ที่กำลังก่อสร้าง หากคุณต้องการการประทับเวลาล่าสุดเท่านั้นt = Tให้ใช้return_sequences=False(นี่คือค่าเริ่มต้นหากคุณไม่ผ่านreturn_sequencesไปยังตัวสร้าง)

ด้านล่างเป็นตัวอย่างของโหมดทั้งสองนี้

ตัวอย่างที่ 1: การเรียนรู้ลำดับ

นี่คือตัวอย่างย่อ ๆ ของการฝึกอบรม LSTM (ประเภทของ RNN) ซึ่งเก็บลำดับทั้งหมดไว้ ในตัวอย่างนี้แต่ละจุดข้อมูลอินพุตมี 2 การประทับเวลาแต่ละครั้งมี 3 คุณสมบัติ ข้อมูลขาออกมี 2 การประทับเวลา (เพราะreturn_sequences=True) แต่ละจุดมี 4 จุดข้อมูล (เพราะนั่นคือขนาดที่ฉันส่งไป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)

ตัวอย่างที่ 2: เรียนรู้การประทับเวลาครั้งสุดท้าย

หากในอีกทางหนึ่งคุณต้องการฝึก LSTM ซึ่งจะให้ผลลัพธ์เฉพาะการจับเวลาครั้งสุดท้ายตามลำดับคุณจะต้องตั้งค่าreturn_sequences=False(หรือเพียงแค่ลบมันออกจากตัวสร้างทั้งหมดเนื่องจากFalseเป็นค่าเริ่มต้น) และจากนั้นข้อมูลผลลัพธ์ของคุณ ( data_yในตัวอย่างข้างต้น) จะต้องมีการจัดเรียงใหม่เนื่องจากคุณจะต้องระบุเวลาล่าสุด ดังนั้นในตัวอย่างที่สองนี้จุดข้อมูลอินพุตแต่ละจุดยังคงมีการประทับเวลา 2 ครั้งแต่ละอันมี 3 ฟีเจอร์ อย่างไรก็ตามข้อมูลที่ส่งออกเป็นเพียงเวกเตอร์เดียวสำหรับแต่ละจุดข้อมูลเพราะเราได้ทำให้ทุกอย่างราบเรียบลงในการประทับเวลาเดียว แต่ละเวกเตอร์เอาต์พุตเหล่านี้ยังคงมีคุณสมบัติ 4 อย่าง (เนื่องจากเป็นขนาดที่ฉันส่งไป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)

ขอบคุณสำหรับคำอธิบายที่ดี อะไรคือความสัมพันธ์ระหว่างดาต้าพอยน์ # 1 และดาต้าพอยน์ # 2 ตัวอย่างเช่นในสถานการณ์แรกหากคุณต้องลบดาต้าพอยน์ 2 และวางไว้ใต้ดาต้าพอยน์ 1 ดังนั้นตอนนี้เรามี 4 ขั้นตอน สิ่งนั้นจะส่งผลกระทบต่อโมเดลโดยรวมอย่างไร
Rjay155

ไม่มีความสัมพันธ์พิเศษระหว่างดาต้าพอยน์ ชุดการฝึกอบรมการเรียนรู้เชิงลึกที่ดีจะมีดาต้าพอยน์หลายสิบหรือหลายล้านตัว หนึ่งจุดข้อมูล = หนึ่งตัวอย่างการฝึกอบรมนั่นคือทั้งหมด หากคุณต้องการ "รวม" ดาต้าพอยน์ # 1 และ # 2 ก็data_xจะมีดาต้าพอยน์เดียวและดาต้าพอยน์นั้นจะมีการประทับเวลาสี่ครั้งแต่ละช่วงสามมิติ (และในทำนองเดียวกันคุณจะต้องผสานdata_yในลักษณะเดียวกัน) จำนวนการประทับเวลาที่คุณใช้นั้นขึ้นอยู่กับสิ่งที่คุณพยายามทำแบบจำลอง (และจำนวนการประทับเวลาที่เกี่ยวข้องกับกระบวนการนั้น)
Adam Sypniewski

@Adam Sypniewski ฉันมีคำถามเกี่ยวกับ y data_y = numpy.array ([# Datapoint 1 # ฟีเจอร์เป้าหมายที่ timestep 2 [[105, 106, 107, 108], [0, 1]], # Datapoint 2 # คุณสมบัติเป้าหมายที่ timestep 2 [[205, 206, 207 , 208], [1, 0]]]) ถ้าหนึ่งใน y ของฉันเป็นคุณสมบัติที่แน่ชัด ฉันจะจัดโครงสร้างนี้อย่างไร ขอบคุณ!
Hua Ye

2
ในกรณีดังกล่าวคุณควรป้อนข้อมูลผลลัพธ์ของ RNN ลงในเลเยอร์ที่มีความหนาแน่นสูงเพื่อให้แต่ละการประทับเวลาเอาท์พุทได้รับการแมปเป็นหมวดหมู่ที่ร้อนแรง
Adam Sypniewski

คุณเห็นภาพผลลัพธ์ที่นี่ได้อย่างไร บางแปลงจะมีประโยชน์
hhh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.