สำหรับ 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 สำหรับข้อมูลที่ไม่ใช่ชั่วคราว ตัวอย่างเช่นคาดการณ์สภาพอากาศในวันพรุ่งนี้กำหนดสถานที่ ในกรณีนี้ต่อไปนี้เป็นคำแนะนำสามข้อโดยแต่ละข้อมีค่าเป็นบวก / เชิงลบ:
ให้การประทับเวลาครั้งแรกมีข้อมูลการปรับสภาพของคุณเนื่องจากจะ "ตั้งค่า" สถานะภายใน / ซ่อนของ RNN ของคุณได้อย่างมีประสิทธิภาพ ตรงไปตรงมาฉันจะไม่ทำสิ่งนี้ด้วยเหตุผลหลายประการ: ข้อมูลการปรับสภาพของคุณจะต้องมีรูปร่างเหมือนส่วนที่เหลือของคุณสมบัติทำให้ยากต่อการสร้างสถานะ RNN ที่ยากขึ้น (ในแง่ของการระมัดระวังอย่างมากในการติดตามว่าคุณป้อนข้อมูลอย่างไร เข้าสู่เครือข่าย) เครือข่ายอาจ "ลืม" ข้อมูลการปรับสภาพให้มีเวลาเพียงพอ (เช่นลำดับการฝึกอบรมที่ยาวนานหรือลำดับการทำนายที่ยาวนาน) เป็นต้น
รวมข้อมูลเป็นส่วนหนึ่งของข้อมูลชั่วคราว ดังนั้นเวกเตอร์คุณลักษณะแต่ละรายการในการประทับเวลาที่เฉพาะเจาะจงจึงรวมข้อมูลชุดข้อมูล "ส่วนใหญ่" ไว้ แต่จากนั้นข้อมูลการปรับสภาพจะถูกผนวกเข้ากับส่วนท้ายของเวกเตอร์คุณลักษณะแต่ละรายการ เครือข่ายจะเรียนรู้ที่จะรับรู้สิ่งนี้หรือไม่? อาจเป็นไปได้ แต่ถึงอย่างนั้นคุณก็กำลังสร้างงานการเรียนรู้ที่ยากขึ้นโดยการทำให้ข้อมูลลำดับที่มีข้อมูลที่ไม่ต่อเนื่องเสียหาย ดังนั้นฉันจะไม่สนับสนุนสิ่งนี้
อาจเป็นวิธีที่ดีที่สุดที่จะส่งผลโดยตรงต่อสถานะที่ซ่อนอยู่ของ RNN ณ เวลาศูนย์ นี่คือวิธีการที่ถ่ายโดยKarpathy และเฟยเฟยและVinyals et al, นี่คือวิธีการทำงาน:
- สำหรับตัวอย่างการฝึกอบรมแต่ละใช้เงื่อนไขตัวแปรของคุณ{x}x⃗
- แปลง / ปรับสภาพตัวแปรสภาพของคุณด้วยการแปลงเลียนแบบเพื่อให้ได้รูปร่างที่เหมาะสมเนื่องจากสถานะภายในของ RNN: (สิ่งเหล่านี้และเป็นน้ำหนักที่ฝึกได้) คุณสามารถหาได้ด้วยเลเยอร์หนาแน่นใน keras W → bv⃗ =Wx⃗ +b⃗ Wb⃗
- สำหรับการประทับเวลาครั้งแรกให้เพิ่มเข้ากับสถานะที่ซ่อนของ RNN เมื่อคำนวณค่าv⃗
วิธีการนี้เป็นวิธีการที่ถูกต้องที่สุดในเชิงทฤษฎีเนื่องจากเป็นเงื่อนไขที่เหมาะสมของ RNN ในอินพุตที่ไม่ใช่ชั่วคราวของคุณแก้ปัญหารูปร่างตามธรรมชาติได้อย่างเป็นธรรมชาติและยังหลีกเลี่ยงการก่อให้เกิดมลพิษในอินพุตของคุณด้วยข้อมูลเพิ่มเติม ข้อเสียคือวิธีการนี้มักจะต้องมีการควบคุมระดับกราฟของสถาปัตยกรรมของคุณดังนั้นหากคุณใช้สิ่งที่เป็นนามธรรมในระดับที่สูงขึ้นเช่น Keras คุณจะพบว่ามันยากที่จะติดตั้งเว้นแต่คุณจะเพิ่มประเภทเลเยอร์ของคุณเอง