การเพิ่มคุณสมบัติให้กับ Time Series รุ่น LSTM


42

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

T-3, T-2, T-1, เอาท์พุท

ตอนนี้ให้บอกว่าคุณรู้ว่าคุณมีคุณสมบัติที่มีผลต่อการส่งออก แต่ไม่จำเป็นต้องเป็นคุณลักษณะอนุกรมเวลาให้บอกว่าสภาพอากาศภายนอก นี่คือสิ่งที่คุณสามารถเพิ่มได้และ LSTM จะสามารถแยกแยะความแตกต่างของอนุกรมเวลาและอะไรไม่ได้


ฉันชอบคำถามของคุณ อย่างไรก็ตามคุณสามารถอธิบายเพิ่มเติมได้ว่าคุณลักษณะที่ไม่เกี่ยวกับเวลาในซีรีส์นี้มีอิทธิพลต่อเอาต์พุตในเวลา t โดยขึ้นอยู่กับความรู้ของเนื้อหาสาระ
horaceT

คำตอบ:


39

สำหรับ RNNs (เช่น LSTMs และ GRU) อินพุตเลเยอร์เป็นรายการของการประทับเวลาและการประทับเวลาแต่ละครั้งเป็นฟีเจอร์เมตริกซ์ นั่นหมายความว่าคุณสามารถมีเทนเซอร์อินพุทเช่นนี้ (ในรูปสัญลักษณ์ 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 ],
    ...
]

ดังนั้นคุณสามารถมีคุณสมบัติหลายอย่างในแต่ละการประทับเวลา ในใจของฉันสภาพอากาศเป็นคุณลักษณะอนุกรมเวลา: ที่ที่ฉันอาศัยอยู่มันเป็นหน้าที่ของเวลา ดังนั้นจึงค่อนข้างสมเหตุสมผลในการเข้ารหัสข้อมูลสภาพอากาศเป็นหนึ่งในคุณสมบัติของคุณในแต่ละการบันทึกเวลา (ด้วยการเข้ารหัสที่เหมาะสมเช่น cloudy = 0, sunny = 1, ฯลฯ )

หากคุณมีข้อมูลที่ไม่ใช่อนุกรมเวลาแสดงว่าไม่เหมาะสมที่จะส่งผ่าน LSTM บางที LSTM จะทำงานต่อไป แต่ถึงแม้ว่ามันจะเป็นไปได้ แต่มันอาจจะมาจากต้นทุนของการสูญเสีย / ความแม่นยำที่ลดลงต่อการฝึกอบรม

หรือคุณสามารถแนะนำข้อมูล "พิเศษ" ประเภทนี้ลงในโมเดลของคุณนอก LSTM โดยใช้เลเยอร์เพิ่มเติม คุณอาจมีกระแสข้อมูลเช่นนี้:

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

ดังนั้นคุณจะรวมอินพุตเสริมของคุณเข้ากับเอาต์พุต LSTM และดำเนินการเครือข่ายของคุณต่อจากที่นั่น ตอนนี้แบบจำลองของคุณเป็นเพียงอินพุตหลายตัว

ตัวอย่างเช่นสมมติว่าในแอปพลิเคชันของคุณโดยเฉพาะคุณเก็บเอาท์พุทสุดท้ายของลำดับเอาท์พุท LSTM สมมุติว่ามันคือเวกเตอร์ที่มีความยาว 10 คุณช่วยเสริมอาจเป็นสภาพอากาศที่เข้ารหัสของคุณ (ดังนั้นสเกลาร์) เลเยอร์การผสานของคุณสามารถผนวกข้อมูลสภาพอากาศเสริมเข้ากับท้ายของเวกเตอร์เอาต์พุต LSTM เพื่อสร้างเวกเตอร์เดียวที่มีความยาว 11 แต่คุณไม่จำเป็นต้องเก็บ LSTM เอาท์พุทล่าสุดเอาไว้ถ้าหาก LSTM เอาท์พุท 100 ครั้ง ด้วยคุณสมบัติ 10 เวกเตอร์คุณยังคงสามารถเก็บข้อมูลสภาพอากาศเสริมของคุณได้ซึ่งส่งผลให้เกิดการประทับเวลา 100 ครั้งแต่ละครั้งประกอบด้วยเวกเตอร์จำนวน 11 ดาต้าพอยน์

เอกสารประกอบของ Keras บนAPI การทำงานมีภาพรวมที่ดี

ในกรณีอื่น ๆ ตามที่ @horaceT ชี้ให้เห็นคุณอาจต้องการกำหนด LSTM สำหรับข้อมูลที่ไม่ใช่ชั่วคราว ตัวอย่างเช่นคาดการณ์สภาพอากาศในวันพรุ่งนี้กำหนดสถานที่ ในกรณีนี้ต่อไปนี้เป็นคำแนะนำสามข้อโดยแต่ละข้อมีค่าเป็นบวก / เชิงลบ:

  1. ให้การประทับเวลาครั้งแรกมีข้อมูลการปรับสภาพของคุณเนื่องจากจะ "ตั้งค่า" สถานะภายใน / ซ่อนของ RNN ของคุณได้อย่างมีประสิทธิภาพ ตรงไปตรงมาฉันจะไม่ทำสิ่งนี้ด้วยเหตุผลหลายประการ: ข้อมูลการปรับสภาพของคุณจะต้องมีรูปร่างเหมือนส่วนที่เหลือของคุณสมบัติทำให้ยากต่อการสร้างสถานะ RNN ที่ยากขึ้น (ในแง่ของการระมัดระวังอย่างมากในการติดตามว่าคุณป้อนข้อมูลอย่างไร เข้าสู่เครือข่าย) เครือข่ายอาจ "ลืม" ข้อมูลการปรับสภาพให้มีเวลาเพียงพอ (เช่นลำดับการฝึกอบรมที่ยาวนานหรือลำดับการทำนายที่ยาวนาน) เป็นต้น

  2. รวมข้อมูลเป็นส่วนหนึ่งของข้อมูลชั่วคราว ดังนั้นเวกเตอร์คุณลักษณะแต่ละรายการในการประทับเวลาที่เฉพาะเจาะจงจึงรวมข้อมูลชุดข้อมูล "ส่วนใหญ่" ไว้ แต่จากนั้นข้อมูลการปรับสภาพจะถูกผนวกเข้ากับส่วนท้ายของเวกเตอร์คุณลักษณะแต่ละรายการ เครือข่ายจะเรียนรู้ที่จะรับรู้สิ่งนี้หรือไม่? อาจเป็นไปได้ แต่ถึงอย่างนั้นคุณก็กำลังสร้างงานการเรียนรู้ที่ยากขึ้นโดยการทำให้ข้อมูลลำดับที่มีข้อมูลที่ไม่ต่อเนื่องเสียหาย ดังนั้นฉันจะไม่สนับสนุนสิ่งนี้

  3. อาจเป็นวิธีที่ดีที่สุดที่จะส่งผลโดยตรงต่อสถานะที่ซ่อนอยู่ของ RNN ณ เวลาศูนย์ นี่คือวิธีการที่ถ่ายโดยKarpathy และเฟยเฟยและVinyals et al, นี่คือวิธีการทำงาน:

    1. สำหรับตัวอย่างการฝึกอบรมแต่ละใช้เงื่อนไขตัวแปรของคุณ{x}x
    2. แปลง / ปรับสภาพตัวแปรสภาพของคุณด้วยการแปลงเลียนแบบเพื่อให้ได้รูปร่างที่เหมาะสมเนื่องจากสถานะภายในของ RNN: (สิ่งเหล่านี้และเป็นน้ำหนักที่ฝึกได้) คุณสามารถหาได้ด้วยเลเยอร์หนาแน่นใน keras Wbv=Wx+bWb
    3. สำหรับการประทับเวลาครั้งแรกให้เพิ่มเข้ากับสถานะที่ซ่อนของ RNN เมื่อคำนวณค่าv

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


1
ข้อเสนอแนะที่ดี แต่จะเกิดอะไรขึ้นถ้าผลลัพธ์ของ LSTM มีการพึ่งพาโครงสร้างกับตัวทำนายอนุกรมที่ไม่ใช่เวลา
horaceT

คุณยกตัวอย่างได้ไหม
Adam Sypniewski

6
ตกลงนี่เป็นตัวอย่างที่ดีมาก สมมติว่าคุณกำลังพยายามทำนายสภาพอากาศ ณ เวลา t โดยอ้างอิงจากขั้นตอน n ครั้งล่าสุด สภาพอากาศขึ้นอยู่กับส่วนของโลกที่คุณอยู่ถ้าฤดูร้อนในซีกโลกเหนือมันเป็นฤดูหนาวในซีกโลกใต้ ดังนั้นควรคำนึงถึงปัจจัยเหนือ / ใต้นี้ด้วย คุณสามารถรวมมันเข้ากับ LSTM ได้หรือไม่?
horaceT

1
เป็นคำถามที่ดีมาก! ฉันได้รวมการแก้ไขเพื่อแก้ไขปัญหานี้
Adam Sypniewski

ขอบคุณสำหรับการแก้ไขและการอ้างอิงทั้งสอง มีประโยชน์มากทีเดียว
horaceT

2

จากคำตอบที่ดีทั้งหมดของกระทู้นี้ฉันเขียนไลบรารี่เพื่อกำหนดเงื่อนไขของอินพุตเสริม มันสรุปความซับซ้อนทั้งหมดและได้รับการออกแบบให้ใช้งานง่ายที่สุด:

https://github.com/philipperemy/cond_rnn/ (tensorflow)

หวังว่ามันจะช่วย!


0

มีฟังก์ชั่นใน reset_states(states)LSTM

อย่างไรก็ตามสถานะพารามิเตอร์คือการรวมกันของสองสถานะซ่อนสถานะ h และสถานะเซลล์

States = [h, c]

มันจะน่าสนใจที่จะทราบว่าคุณควรเริ่มต้นhหรือcตามแนวทางในเอกสารดังกล่าวข้างต้น


0

นี่อาจจะไม่ใช่วิธีที่มีประสิทธิภาพมากที่สุด แต่ตัวแปรคงที่อาจจะซ้ำ timeseries tf.tile()ระยะเวลาในการใช้

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