ลืมเลเยอร์ในเครือข่ายประสาทกำเริบ (RNN) -


13

ฉันกำลังพยายามหามิติของตัวแปรแต่ละตัวใน RNN ในเลเยอร์ลืมอย่างไรก็ตามฉันไม่แน่ใจว่าฉันกำลังติดตามถูกหรือไม่ รูปภาพและสมการถัดไปมาจากบล็อกของ Colah "การทำความเข้าใจกับเครือข่าย LSTM" :

ป้อนคำอธิบายรูปภาพที่นี่

ที่อยู่:

  • xtคืออินพุตของขนาดเวกเตอร์m1
  • ht1เป็นสถานะที่ซ่อนขนาดเวกเตอร์n1
  • [xt,ht1]คือการต่อข้อมูล (ตัวอย่างเช่นถ้าจากนั้น )xt=[1,2,3],ht1=[4,5,6][xt,ht1]=[1,2,3,4,5,6]
  • wfคือน้ำหนักของขนาดเมทริกซ์โดยที่คือจำนวนของสถานะเซลล์ (ถ้าและในตัวอย่างด้านบนและถ้าเรามี 3 สถานะของเซลล์จากนั้นเมทริกซ์)k(m+n)km=3n=3wf=33
  • bfเป็นอคติของขนาดเวกเตอร์โดยที่คือจำนวนของสถานะเซลล์ (เนื่องจากเป็นตัวอย่างด้านบนแล้วเป็น เวกเตอร์ )k1kk=3bf31

หากเราตั้งค่าเป็น: wf

[1234565678910345678]

และเป็น:bf[1,2,3]

จากนั้นWf.[ht1,xt]=

[1234565678910345678].[123456]=[91175133]

จากนั้นเราสามารถเพิ่มอคติWf.[ht1,xt]+bf=

[91175133]+[123]=[92177136]

จากนั้นเราให้อาหารมันเป็นฟังก์ชั่น sigmoid: , โดยที่ดังนั้นเราจึงทำหน้าที่ฟังก์ชั่นนี้ ฉลาดและได้รับ{bmatrix}11+exx=[92177136]

[111]

ซึ่งหมายความว่าสำหรับแต่ละสถานะเซลล์ , (มีเซลล์ฯ ) เราอนุญาตให้มันผ่านไปยังชั้นถัดไปCt1k=3

สมมติฐานข้างต้นถูกต้องหรือไม่

นอกจากนี้ยังหมายความว่าจำนวนสถานะเซลล์และสถานะที่ซ่อนอยู่เหมือนกันหรือไม่

คำตอบ:


14

เป็นคำถามที่ดีมาก!

tl; dr: สถานะของเซลล์และสถานะที่ซ่อนอยู่เป็นสองสิ่งที่แตกต่างกัน แต่สถานะที่ซ่อนอยู่นั้นขึ้นอยู่กับสถานะของเซลล์และแน่นอนว่าพวกเขามีขนาดเท่ากัน

คำอธิบายอีกต่อไป

ความแตกต่างระหว่างทั้งสองสามารถเห็นได้จากแผนภาพด้านล่าง (ส่วนหนึ่งของบล็อกเดียวกัน):

สถานะเซลล์เป็นเส้นตัวหนาที่เดินทางไปตะวันตกไปตะวันออกข้ามด้านบน

สถานะเซลล์เป็นเส้นตัวหนาที่เดินทางไปตะวันตกไปตะวันออกข้ามด้านบน บล็อกสีเขียวทั้งหมดเรียกว่า 'เซลล์'

สถานะที่ซ่อนจากขั้นตอนเวลาก่อนหน้านี้จะถือว่าเป็นส่วนหนึ่งของอินพุตในขั้นตอนเวลาปัจจุบัน

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

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

นี่คือสิ่งที่เกิดขึ้น:

ประตูเข้า

ป้อนคำอธิบายรูปภาพที่นี่

การป้อนข้อมูลในเวลาเป็นและ{t-1} สิ่งเหล่านี้ถูกต่อกันและถูกป้อนเข้าสู่ฟังก์ชันที่ไม่ใช่เชิงเส้น (ในกรณีนี้คือ sigmoid) ฟังก์ชั่น sigmoid นี้เรียกว่า 'ประตูเข้า' เพราะทำหน้าที่เป็นช่องว่างสำหรับอินพุต มันตัดสินใจสุ่มซึ่งเป็นค่าที่เราจะอัปเดต ณ เวลานี้ตามอินพุตปัจจุบันtxtht1

นั่นคือ (ตามตัวอย่างของคุณ) ถ้าเรามีเวกเตอร์อินพุตและสถานะที่ซ่อนไว้ก่อนหน้าประตูอินพุตจะทำสิ่งต่อไปนี้:xt=[1,2,3]ht=[4,5,6]

a) เชื่อมและให้เราxtht1[1,2,3,4,5,6]

b) คำนวณเวกเตอร์ที่ต่อกันและเพิ่มอคติ (ในคณิตศาสตร์:โดยที่คือเมทริกซ์น้ำหนักจากเวกเตอร์อินพุตไปยังความไม่เชิงเส้นคืออินพุต อคติ)WiWi[xt,ht1]+biWibi

สมมติว่าเราไปจากอินพุตหกมิติ (ความยาวของเวกเตอร์การตัดแบ่งข้อมูล) เป็นการตัดสินใจสามมิติสำหรับสถานะที่จะอัปเดต นั่นหมายความว่าเราต้องการเมทริกซ์น้ำหนัก 3x6 และเวกเตอร์อคติ 3x1 ให้ค่าเหล่านั้น:

Wi=[111111222222333333]

bi=[111]

การคำนวณจะเป็น:

[111111222222333333][123456]+[111]=[224262]

c) ฟีดการคำนวณก่อนหน้านี้เป็นความไม่เชิงเส้น:it=σ(Wi[xt,ht1]+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,ht1]+bC)

จุดของส่วนนี้คือการคำนวณว่าเราจะอัพเดทสถานะอย่างไรถ้าเราทำเช่นนั้น มันคือการมีส่วนร่วมจากอินพุตใหม่ในขั้นตอนนี้ไปจนถึงสถานะของเซลล์ การคำนวณเป็นไปตามขั้นตอนเดียวกันที่แสดงด้านบน แต่ใช้หน่วย tanh แทนหน่วย sigmoid

เอาท์พุทถูกคูณด้วยเวกเตอร์ไบนารีนั้นแต่เราจะกล่าวถึงเมื่อเราไปถึงการอัพเดทเซลล์Ct~it

ร่วมกันบอกเราว่าต้องการอัปเดตใดและบอกเราว่าเราต้องการอัปเดตอย่างไร มันบอกเราว่าข้อมูลใหม่ที่เราต้องการเพิ่มในการเป็นตัวแทนของเราจนถึงขณะนี้itCt~

จากนั้นประตูลืมซึ่งเป็นจุดสำคัญของคำถามของคุณ

ประตูลืม

ป้อนคำอธิบายรูปภาพที่นี่

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

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

การคำนวณมีลักษณะเหมือนกับที่เราทำในเลเยอร์อินพุท:

ft=σ(Wf[xt,ht1]+bf)

นี่จะให้เวกเตอร์ขนาด 3 กับค่าระหว่าง 0 ถึง 1 ลองทำเป็นว่ามันให้เรา:

[0.5,0.8,0.9]

จากนั้นเราตัดสินใจสุ่มตามค่าเหล่านี้ซึ่งในสามส่วนของข้อมูลที่จะลืม วิธีหนึ่งในการทำเช่นนี้คือการสร้างตัวเลขจากการแจกแจงแบบสม่ำเสมอ (0, 1) และถ้าจำนวนนั้นน้อยกว่าความน่าจะเป็นของการ 'เปิด' หน่วย (0.5, 0.8 และ 0.9 สำหรับหน่วยที่ 1, 2 และ 3 ตามลำดับ) จากนั้นเราเปิดหน่วยนั้น ในกรณีนี้นั่นหมายความว่าเราลืมข้อมูลนั้น

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

การอัพเดตสถานะของเซลล์

ป้อนคำอธิบายรูปภาพที่นี่

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

Ct=ftCt1+itCt~

ทีนี้นี่จะแปลกไปหน่อย แทนที่จะเป็นการทวีคูณอย่างที่เราเคยทำมาก่อนหน้านี้ที่นี่บ่งบอกถึงผลิตภัณฑ์ Hadamard ซึ่งเป็นผลิตภัณฑ์ที่ฉลาด

นอกเหนือ: ผลิตภัณฑ์ Hadamard

ตัวอย่างเช่นถ้าเรามีเวกเตอร์สองตัวและและเราต้องการที่จะใช้ผลิตภัณฑ์ Hadamard เราจะทำสิ่งนี้:x1=[1,2,3]x2=[3,2,1]

x1x2=[(13),(22),(31)]=[3,4,3]

ปิดท้าย

ด้วยวิธีนี้เรารวมสิ่งที่เราต้องการเพิ่มลงในสถานะเซลล์ (อินพุต) กับสิ่งที่เราต้องการนำออกจากสถานะเซลล์ (ลืม) ผลลัพธ์คือสถานะเซลล์ใหม่

ประตูทางออก

ป้อนคำอธิบายรูปภาพที่นี่

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

เลเยอร์เอาต์พุตใช้อินพุตเดียวกันอีกครั้ง แต่จากนั้นพิจารณาสถานะเซลล์ที่อัพเดต:

ot=σ(Wo[xt,ht1]+bo)

นี่เป็นเวกเตอร์ของความน่าจะเป็นอีกครั้ง จากนั้นเราคำนวณ:

ht=ottanh(Ct)

ดังนั้นสถานะเซลล์ปัจจุบันและประตูส่งออกจะต้องเห็นด้วยกับสิ่งที่จะส่งออก

นั่นคือถ้าผลลัพธ์ของคือหลังจากการตัดสินใจแบบสุ่มทำการตัดสินใจว่าแต่ละหน่วยเปิดหรือปิดและผลลัพธ์ของคือ , จากนั้นเมื่อเราใช้ผลิตภัณฑ์ Hadamard เราจะได้รับและเฉพาะหน่วยที่เปิดโดยทั้งประตูออกและในสถานะเซลล์จะเป็นส่วนหนึ่งของผลลัพธ์สุดท้ายtanh(Ct)[0,1,1]ot[0,0,1][0,0,1]

[แก้ไข: มีความคิดเห็นในบล็อกที่บอกว่าถูกเปลี่ยนอีกครั้งเป็นเอาต์พุตจริงโดยซึ่งหมายความว่าผลลัพธ์จริงไปยังหน้าจอ (สมมติว่าคุณมี) การแปลงแบบไม่เชิงเส้นอีก]]htyt=σ(Wht)

แผนภาพแสดงให้เห็นว่าไปที่สองแห่ง: เซลล์ถัดไปและไปที่ 'เอาท์พุท' - ไปที่หน้าจอ ฉันคิดว่าส่วนที่สองเป็นทางเลือกht

มีตัวแปรมากมายใน LSTMs แต่นั่นครอบคลุมสิ่งที่จำเป็น!


ขอบคุณสำหรับคำตอบ! ฉันมีหนึ่งคำถามพิเศษคือคุณไม่รังเกียจ โครงข่ายประสาทเทียมแบบลึกสามารถลึกได้เนื่องจากอนุพันธ์ของ ReLU คือ 1 (ถ้าผลลัพธ์มากกว่า 0) นี่เป็นกรณีเดียวกันสำหรับเซลล์นี้หรือไม่? ฉันไม่แน่ใจว่า Tanh และ Sigmoid สามารถมีอนุพันธ์คงที่ 1 ได้อย่างไร
user1157751

ด้วยความยินดี! เครือข่ายประสาทถือเป็น 'ลึก' เมื่อมีเลเยอร์ที่ซ่อนอยู่มากกว่าหนึ่ง อนุพันธ์ของฟังก์ชั่นการเปิดใช้งาน (tanh, sigmoid, ReLU) ส่งผลกระทบต่อวิธีการฝึกอบรมเครือข่าย อย่างที่คุณพูดเนื่องจาก ReLU มีความชันคงที่ถ้าอินพุตของมันมากกว่า 0 อนุพันธ์ของมันคือ 1 ถ้าเราอยู่ในขอบเขตของฟังก์ชันนั้น หน่วย Tanh และ sigmoid มีอนุพันธ์ใกล้เคียงกับ 1 หากเราอยู่ในช่วงกลางของพื้นที่การเปิดใช้งานของพวกเขา แต่อนุพันธ์ของพวกเขาจะไม่คงที่ บางทีฉันควรทำโพสต์บล็อกแยกต่างหากในตราสารอนุพันธ์ ....
StatsSorceress

คุณสามารถแสดงตัวอย่างของอนุพันธ์ใกล้เคียงกับ 1 ที่ขอบเขตการเปิดใช้งานได้หรือไม่ ฉันเคยเห็นแหล่งข้อมูลมากมายที่พูดถึงอนุพันธ์ แต่ไม่มีการคำนวณทางคณิตศาสตร์หรือไม่
user1157751

ความคิดที่ดี แต่ฉันต้องใช้เวลาพอสมควรในการเขียนโพสต์ที่เหมาะสมเกี่ยวกับเรื่องนั้น ในขณะเดียวกันลองนึกถึงรูปร่างของฟังก์ชั่นแทนห์ซึ่งก็คือ 'S' ที่ยืดออก ตรงกลางคืออนุพันธ์ที่สูงที่สุด ที่ S แบน (ส่วนท้ายของ S) อนุพันธ์คือ 0 ฉันเห็นแหล่งข้อมูลหนึ่งที่กล่าวว่า sigmoids มีอนุพันธ์สูงสุดที่ 0.25 แต่ฉันไม่มีขอบเขตเทียบเท่ากับ tanh
StatsSorceress

ส่วนที่ฉันไม่เข้าใจนั้นแตกต่างจาก ReLU ที่มีอนุพันธ์ 1 คงที่โดยที่ x> 0 แต่ sigmoid และ tanh มีค่าตัวแปรสำหรับอนุพันธ์ทั้งสอง สิ่งนี้จะเป็น "คงที่" ได้อย่างไร?
user1157751
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.