เป็นคำถามที่ดีมาก!
tl; dr: สถานะของเซลล์และสถานะที่ซ่อนอยู่เป็นสองสิ่งที่แตกต่างกัน แต่สถานะที่ซ่อนอยู่นั้นขึ้นอยู่กับสถานะของเซลล์และแน่นอนว่าพวกเขามีขนาดเท่ากัน
คำอธิบายอีกต่อไป
ความแตกต่างระหว่างทั้งสองสามารถเห็นได้จากแผนภาพด้านล่าง (ส่วนหนึ่งของบล็อกเดียวกัน):
สถานะเซลล์เป็นเส้นตัวหนาที่เดินทางไปตะวันตกไปตะวันออกข้ามด้านบน บล็อกสีเขียวทั้งหมดเรียกว่า 'เซลล์'
สถานะที่ซ่อนจากขั้นตอนเวลาก่อนหน้านี้จะถือว่าเป็นส่วนหนึ่งของอินพุตในขั้นตอนเวลาปัจจุบัน
อย่างไรก็ตามมันยากกว่านิดหน่อยที่จะเห็นการพึ่งพาระหว่างคนทั้งสองโดยไม่ทำแบบเต็ม ฉันจะทำที่นี่เพื่อให้มุมมองอื่น แต่ได้รับอิทธิพลอย่างมากจากบล็อก สัญกรณ์ของฉันจะเหมือนกันและฉันจะใช้รูปภาพจากบล็อกในคำอธิบายของฉัน
ฉันชอบคิดว่าลำดับการดำเนินการแตกต่างจากวิธีการนำเสนอในบล็อกเล็กน้อย โดยส่วนตัวเช่นเริ่มจากประตูเข้า ฉันจะแสดงมุมมองด้านล่างนี้ แต่โปรดจำไว้ว่าบล็อกอาจเป็นวิธีที่ดีที่สุดในการตั้งค่าการคำนวณ LSTM และคำอธิบายนี้เป็นแนวคิดล้วนๆ
นี่คือสิ่งที่เกิดขึ้น:
ประตูเข้า
การป้อนข้อมูลในเวลาเป็นและ{t-1} สิ่งเหล่านี้ถูกต่อกันและถูกป้อนเข้าสู่ฟังก์ชันที่ไม่ใช่เชิงเส้น (ในกรณีนี้คือ sigmoid) ฟังก์ชั่น sigmoid นี้เรียกว่า 'ประตูเข้า' เพราะทำหน้าที่เป็นช่องว่างสำหรับอินพุต มันตัดสินใจสุ่มซึ่งเป็นค่าที่เราจะอัปเดต ณ เวลานี้ตามอินพุตปัจจุบันtxtht−1
นั่นคือ (ตามตัวอย่างของคุณ) ถ้าเรามีเวกเตอร์อินพุตและสถานะที่ซ่อนไว้ก่อนหน้าประตูอินพุตจะทำสิ่งต่อไปนี้:xt=[1,2,3]ht=[4,5,6]
a) เชื่อมและให้เราxtht−1[1,2,3,4,5,6]
b) คำนวณเวกเตอร์ที่ต่อกันและเพิ่มอคติ (ในคณิตศาสตร์:โดยที่คือเมทริกซ์น้ำหนักจากเวกเตอร์อินพุตไปยังความไม่เชิงเส้นคืออินพุต อคติ)WiWi⋅[xt,ht−1]+biWibi
สมมติว่าเราไปจากอินพุตหกมิติ (ความยาวของเวกเตอร์การตัดแบ่งข้อมูล) เป็นการตัดสินใจสามมิติสำหรับสถานะที่จะอัปเดต นั่นหมายความว่าเราต้องการเมทริกซ์น้ำหนัก 3x6 และเวกเตอร์อคติ 3x1 ให้ค่าเหล่านั้น:
Wi=⎡⎣⎢123123123123123123⎤⎦⎥
bi=⎡⎣⎢111⎤⎦⎥
การคำนวณจะเป็น:
⎡⎣⎢123123123123123123⎤⎦⎥⋅⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢123456⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥+⎡⎣⎢111⎤⎦⎥=⎡⎣⎢224262⎤⎦⎥
c) ฟีดการคำนวณก่อนหน้านี้เป็นความไม่เชิงเส้น:it=σ(Wi⋅[xt,ht−1]+bi)
σ(x)=11+exp(−x) (เราใช้ elementwise นี้กับค่าในเวกเตอร์ )x
σ(⎡⎣⎢224262⎤⎦⎥)=[11+exp(−22),11+exp(−42),11+exp(−62)]=[1,1,1]
ในภาษาอังกฤษแปลว่าเราจะอัพเดทสถานะทั้งหมดของเรา
ประตูอินพุตมีส่วนที่สอง:
d)Ct~=tanh(WC[xt,ht−1]+bC)
จุดของส่วนนี้คือการคำนวณว่าเราจะอัพเดทสถานะอย่างไรถ้าเราทำเช่นนั้น มันคือการมีส่วนร่วมจากอินพุตใหม่ในขั้นตอนนี้ไปจนถึงสถานะของเซลล์ การคำนวณเป็นไปตามขั้นตอนเดียวกันที่แสดงด้านบน แต่ใช้หน่วย tanh แทนหน่วย sigmoid
เอาท์พุทถูกคูณด้วยเวกเตอร์ไบนารีนั้นแต่เราจะกล่าวถึงเมื่อเราไปถึงการอัพเดทเซลล์Ct~it
ร่วมกันบอกเราว่าต้องการอัปเดตใดและบอกเราว่าเราต้องการอัปเดตอย่างไร มันบอกเราว่าข้อมูลใหม่ที่เราต้องการเพิ่มในการเป็นตัวแทนของเราจนถึงขณะนี้itCt~
จากนั้นประตูลืมซึ่งเป็นจุดสำคัญของคำถามของคุณ
ประตูลืม
วัตถุประสงค์ของประตูลืมคือการลบข้อมูลที่เรียนรู้มาก่อนหน้านี้ซึ่งไม่เกี่ยวข้องอีกต่อไป ตัวอย่างที่ให้ไว้ในบล็อกนั้นใช้ภาษา แต่เราสามารถนึกถึงหน้าต่างแบบเลื่อนได้ หากคุณกำลังสร้างแบบจำลองอนุกรมเวลาที่มีจำนวนเต็มตามธรรมชาติเช่นจำนวนผู้ติดเชื้อในพื้นที่ระหว่างการระบาดของโรคบางทีเมื่อโรคนั้นตายในพื้นที่คุณไม่ต้องการที่จะกังวลอีกต่อไปเมื่อ คิดเกี่ยวกับวิธีโรคจะเดินทางต่อไป
เช่นเดียวกับเลเยอร์อินพุทเลเยอร์ที่ลืมจะใช้สถานะที่ซ่อนอยู่จากขั้นตอนเวลาก่อนหน้าและอินพุตใหม่จากขั้นตอนเวลาปัจจุบันและเชื่อมต่อเข้าด้วยกัน ประเด็นสำคัญคือการตัดสินใจแบบสุ่ม ๆ ว่าจะลืมอะไรและควรจดจำอะไร ในการคำนวณก่อนหน้านี้ฉันได้แสดงเอาท์พุทเลเยอร์ sigmoid ของ 1 ทั้งหมด แต่ในความเป็นจริงมันอยู่ใกล้กับ 0.999 และฉันปัดเศษขึ้น
การคำนวณมีลักษณะเหมือนกับที่เราทำในเลเยอร์อินพุท:
ft=σ(Wf[xt,ht−1]+bf)
นี่จะให้เวกเตอร์ขนาด 3 กับค่าระหว่าง 0 ถึง 1 ลองทำเป็นว่ามันให้เรา:
[0.5,0.8,0.9]
จากนั้นเราตัดสินใจสุ่มตามค่าเหล่านี้ซึ่งในสามส่วนของข้อมูลที่จะลืม วิธีหนึ่งในการทำเช่นนี้คือการสร้างตัวเลขจากการแจกแจงแบบสม่ำเสมอ (0, 1) และถ้าจำนวนนั้นน้อยกว่าความน่าจะเป็นของการ 'เปิด' หน่วย (0.5, 0.8 และ 0.9 สำหรับหน่วยที่ 1, 2 และ 3 ตามลำดับ) จากนั้นเราเปิดหน่วยนั้น ในกรณีนี้นั่นหมายความว่าเราลืมข้อมูลนั้น
บันทึกย่อ: เลเยอร์อินพุทและเลเยอร์การลืมนั้นเป็นอิสระ หากฉันเป็นคนเดิมพันฉันจะเดิมพันว่าเป็นสถานที่ที่ดีสำหรับการขนาน
การอัพเดตสถานะของเซลล์
ตอนนี้เรามีทุกอย่างที่เราต้องการในการอัพเดทสถานะของเซลล์ เรารวบรวมข้อมูลจากอินพุตและประตูลืม:
Ct=ft∘Ct−1+it∘Ct~
ทีนี้นี่จะแปลกไปหน่อย แทนที่จะเป็นการทวีคูณอย่างที่เราเคยทำมาก่อนหน้านี้ที่นี่บ่งบอกถึงผลิตภัณฑ์ Hadamard ซึ่งเป็นผลิตภัณฑ์ที่ฉลาด∘
นอกเหนือ: ผลิตภัณฑ์ Hadamard
ตัวอย่างเช่นถ้าเรามีเวกเตอร์สองตัวและและเราต้องการที่จะใช้ผลิตภัณฑ์ Hadamard เราจะทำสิ่งนี้:x1=[1,2,3]x2=[3,2,1]
x1∘x2=[(1⋅3),(2⋅2),(3⋅1)]=[3,4,3]
ปิดท้าย
ด้วยวิธีนี้เรารวมสิ่งที่เราต้องการเพิ่มลงในสถานะเซลล์ (อินพุต) กับสิ่งที่เราต้องการนำออกจากสถานะเซลล์ (ลืม) ผลลัพธ์คือสถานะเซลล์ใหม่
ประตูทางออก
สิ่งนี้จะทำให้เรามีสถานะที่ซ่อนอยู่ใหม่ จุดสำคัญของประตูส่งออกคือการตัดสินใจว่าข้อมูลใดที่เราต้องการให้ส่วนถัดไปของแบบจำลองคำนึงถึงเมื่อทำการปรับปรุงสถานะของเซลล์ที่ตามมา ตัวอย่างในบล็อกคืออีกครั้งภาษา: ถ้าคำนามเป็นพหูพจน์การผันคำกริยาในขั้นตอนต่อไปจะเปลี่ยนไป ในรูปแบบของโรคหากความไวของบุคคลในพื้นที่ใดพื้นที่หนึ่งนั้นแตกต่างจากพื้นที่อื่นความน่าจะเป็นที่จะได้รับเชื้ออาจเปลี่ยนแปลงได้
เลเยอร์เอาต์พุตใช้อินพุตเดียวกันอีกครั้ง แต่จากนั้นพิจารณาสถานะเซลล์ที่อัพเดต:
ot=σ(Wo[xt,ht−1]+bo)
นี่เป็นเวกเตอร์ของความน่าจะเป็นอีกครั้ง จากนั้นเราคำนวณ:
ht=ot∘tanh(Ct)
ดังนั้นสถานะเซลล์ปัจจุบันและประตูส่งออกจะต้องเห็นด้วยกับสิ่งที่จะส่งออก
นั่นคือถ้าผลลัพธ์ของคือหลังจากการตัดสินใจแบบสุ่มทำการตัดสินใจว่าแต่ละหน่วยเปิดหรือปิดและผลลัพธ์ของคือ , จากนั้นเมื่อเราใช้ผลิตภัณฑ์ Hadamard เราจะได้รับและเฉพาะหน่วยที่เปิดโดยทั้งประตูออกและในสถานะเซลล์จะเป็นส่วนหนึ่งของผลลัพธ์สุดท้ายtanh(Ct)[0,1,1]ot[0,0,1][0,0,1]
[แก้ไข: มีความคิดเห็นในบล็อกที่บอกว่าถูกเปลี่ยนอีกครั้งเป็นเอาต์พุตจริงโดยซึ่งหมายความว่าผลลัพธ์จริงไปยังหน้าจอ (สมมติว่าคุณมี) การแปลงแบบไม่เชิงเส้นอีก]]htyt=σ(W⋅ht)
แผนภาพแสดงให้เห็นว่าไปที่สองแห่ง: เซลล์ถัดไปและไปที่ 'เอาท์พุท' - ไปที่หน้าจอ ฉันคิดว่าส่วนที่สองเป็นทางเลือกht
มีตัวแปรมากมายใน LSTMs แต่นั่นครอบคลุมสิ่งที่จำเป็น!