รหัสของผลิตภัณฑ์ซอฟต์แวร์การเรียนรู้ของเครื่องมักจะซับซ้อนและค่อนข้างสับสน การตรวจจับและกำจัดข้อบกพร่องนั้นเป็นงานที่ต้องใช้ทรัพยากรมาก แม้จะง่ายที่สุด
บทความนี้เกี่ยวกับอัลกอริทึมสำหรับการดีบักโครงข่ายประสาทเทียมของคุณ
Skillbox แนะนำ: หลักสูตรภาคปฏิบัติ
ผู้พัฒนา Python ตั้งแต่เริ่มต้น .เราเตือนคุณ: สำหรับผู้อ่าน "Habr" ทุกคน - ส่วนลด 10 rubles เมื่อลงทะเบียนในหลักสูตร Skillbox ใด ๆ โดยใช้รหัสส่งเสริมการขาย "Habr"
อัลกอริทึมประกอบด้วยห้าขั้นตอน:
- เริ่มต้นง่าย
- การยืนยันการสูญเสีย
- การตรวจสอบผลลัพธ์ระดับกลางและการเชื่อมต่อ
- การวินิจฉัยพารามิเตอร์
- การควบคุมการทำงาน
หากมีสิ่งที่น่าสนใจสำหรับคุณมากกว่าส่วนอื่นๆ คุณสามารถข้ามไปยังส่วนเหล่านี้ได้ทันที
เริ่มต้นง่ายๆ
โครงข่ายประสาทเทียมที่มีสถาปัตยกรรมที่ซับซ้อน การทำให้เป็นมาตรฐาน และตัวกำหนดเวลาอัตราการเรียนรู้นั้นแก้ไขจุดบกพร่องได้ยากกว่าเครือข่ายปกติ เรากำลังยุ่งยากเล็กน้อยที่นี่ เนื่องจากประเด็นนี้เกี่ยวข้องทางอ้อมกับการดีบัก แต่นี่ยังคงเป็นคำแนะนำที่สำคัญ
การเริ่มต้นง่ายๆ คือการสร้างแบบจำลองที่เรียบง่ายและฝึกฝนกับชุดข้อมูลเดียว (จุด)
ขั้นแรกเราสร้างแบบจำลองที่เรียบง่าย
เพื่อเริ่มต้นอย่างรวดเร็ว เราสร้างเครือข่ายขนาดเล็กที่มีเลเยอร์ที่ซ่อนอยู่เพียงชั้นเดียว และตรวจสอบว่าทุกอย่างทำงานได้อย่างถูกต้อง จากนั้นเราจะค่อยๆ ทำให้โมเดลซับซ้อนขึ้น ตรวจสอบแต่ละแง่มุมใหม่ของโครงสร้าง (เลเยอร์เพิ่มเติม พารามิเตอร์ ฯลฯ) และดำเนินการต่อไป
เราฝึกโมเดลด้วยชุดข้อมูล (จุด) ชุดเดียว
เพื่อเป็นการตรวจสอบความสมบูรณ์อย่างรวดเร็วสำหรับโปรเจ็กต์ของคุณ คุณสามารถใช้จุดข้อมูลหนึ่งหรือสองจุดในการฝึกอบรมเพื่อยืนยันว่าระบบทำงานอย่างถูกต้องหรือไม่ โครงข่ายประสาทเทียมจะต้องแสดงความแม่นยำ 100% ในการฝึกอบรมและการทดสอบ หากไม่เป็นเช่นนั้น แสดงว่าโมเดลมีขนาดเล็กเกินไปหรือคุณมีจุดบกพร่องอยู่แล้ว
แม้ว่าทุกอย่างจะเรียบร้อยดี แต่ให้เตรียมโมเดลสำหรับยุคหนึ่งหรือหลายยุคก่อนจะดำเนินการต่อ
การประเมินการสูญเสีย
การประมาณค่าการสูญเสียเป็นวิธีหลักในการปรับแต่งประสิทธิภาพของแบบจำลอง คุณต้องแน่ใจว่าการสูญเสียนั้นเหมาะสมกับปัญหา และฟังก์ชันการสูญเสียได้รับการจัดอันดับในระดับที่ถูกต้อง หากคุณใช้การสูญเสียมากกว่าหนึ่งประเภท ตรวจสอบให้แน่ใจว่าทั้งหมดอยู่ในลำดับเดียวกันและปรับขนาดอย่างถูกต้อง
สิ่งสำคัญคือต้องใส่ใจกับการสูญเสียในช่วงแรก ตรวจสอบว่าผลลัพธ์จริงใกล้เคียงกับผลลัพธ์ที่คาดหวังเพียงใด หากแบบจำลองเริ่มต้นด้วยการเดาแบบสุ่ม ใน
สำหรับตัวอย่างไบนารี จะมีการคำนวณที่คล้ายกันสำหรับแต่ละคลาส ตัวอย่างเช่น นี่คือข้อมูล: 20% 0 และ 80% 1 การสูญเสียเริ่มต้นที่คาดหวังจะสูงถึง –0,2ln (0,5) –0,8ln (0,5) = 0,693147 หากผลลัพธ์มากกว่า 1 อาจบ่งชี้ว่าน้ำหนักของโครงข่ายประสาทเทียมไม่สมดุลอย่างเหมาะสม หรือข้อมูลไม่ได้รับการปรับให้เป็นมาตรฐาน
ตรวจสอบผลลัพธ์ระดับกลางและการเชื่อมต่อ
ในการดีบักโครงข่ายประสาทเทียม จำเป็นต้องเข้าใจพลวัตของกระบวนการภายในเครือข่ายและบทบาทของเลเยอร์ระดับกลางแต่ละเลเยอร์ในขณะที่เชื่อมต่อกัน นี่คือข้อผิดพลาดทั่วไปที่คุณอาจพบ:
- นิพจน์ที่ไม่ถูกต้องสำหรับการอัพเดต gradle
- ไม่ใช้การอัปเดตน้ำหนัก
- การไล่ระดับสีแบบระเบิด
หากค่าการไล่ระดับสีเป็นศูนย์ หมายความว่าอัตราการเรียนรู้ในเครื่องมือเพิ่มประสิทธิภาพช้าเกินไป หรือคุณพบนิพจน์ที่ไม่ถูกต้องในการอัปเดตการไล่ระดับสี
นอกจากนี้ยังจำเป็นต้องตรวจสอบค่าของฟังก์ชันการเปิดใช้งาน น้ำหนัก และการอัพเดตของแต่ละเลเยอร์ ตัวอย่างเช่น ขนาดของการอัปเดตพารามิเตอร์ (น้ำหนักและอคติ)
มีปรากฏการณ์ที่เรียกว่า “Dying ReLU” หรือ
คุณสามารถใช้การตรวจสอบการไล่ระดับสีเพื่อระบุข้อผิดพลาดเหล่านี้ได้โดยการประมาณการไล่ระดับสีโดยใช้วิธีตัวเลข หากใกล้กับการไล่ระดับสีที่คำนวณไว้ แสดงว่ามีการใช้การถ่ายทอดกลับอย่างถูกต้อง หากต้องการสร้างการตรวจสอบการไล่ระดับสี ลองดูแหล่งข้อมูลดีๆ เหล่านี้จาก CS231
- เบื้องต้นเป็นวิธีการง่ายๆ ที่แสดงให้เราเห็นโครงสร้างทั่วไปของแบบจำลองที่ผ่านการฝึกอบรม ซึ่งรวมถึงผลลัพธ์ของรูปร่างหรือตัวกรองของแต่ละเลเยอร์ของโครงข่ายประสาทเทียมและพารามิเตอร์ภายในแต่ละเลเยอร์
- ตามการเปิดใช้งาน ในนั้นเราถอดรหัสการกระตุ้นของเซลล์ประสาทแต่ละเซลล์หรือกลุ่มของเซลล์ประสาทเพื่อทำความเข้าใจการทำงานของพวกมัน
- ขึ้นอยู่กับการไล่ระดับสี วิธีการเหล่านี้มีแนวโน้มที่จะจัดการกับการไล่ระดับสีที่เกิดขึ้นจากการฝึกโมเดลไปข้างหน้าและข้างหลัง (รวมถึงแผนที่ความโดดเด่นและแผนที่การเปิดใช้งานคลาส)
มีเครื่องมือที่มีประโยชน์หลายอย่างสำหรับการแสดงภาพการเปิดใช้งานและการเชื่อมต่อของแต่ละเลเยอร์ เช่น
การวินิจฉัยพารามิเตอร์
โครงข่ายประสาทเทียมมีพารามิเตอร์จำนวนมากที่โต้ตอบซึ่งกันและกัน ซึ่งทำให้การปรับให้เหมาะสมมีความซับซ้อน จริงๆ แล้วส่วนนี้เป็นหัวข้อของการวิจัยเชิงรุกโดยผู้เชี่ยวชาญ ดังนั้นคำแนะนำด้านล่างควรถือเป็นคำแนะนำเท่านั้น ซึ่งเป็นจุดเริ่มต้นในการสร้าง
ขนาดบรรจุ (ขนาดแบทช์) - หากคุณต้องการให้ขนาดแบทช์มีขนาดใหญ่พอที่จะประมาณค่าการไล่ระดับสีข้อผิดพลาดได้อย่างแม่นยำ แต่เล็กพอสำหรับการสุ่มไล่ระดับลง (SGD) เพื่อทำให้เครือข่ายของคุณเป็นปกติ ขนาดชุดงานน้อยจะนำไปสู่การบรรจบกันอย่างรวดเร็วเนื่องจากเสียงรบกวนในระหว่างกระบวนการฝึกอบรม และต่อมาทำให้เกิดปัญหาในการปรับให้เหมาะสมที่สุด นี่คือคำอธิบายโดยละเอียดเพิ่มเติม
อัตราการเรียนรู้ - ต่ำเกินไปจะนำไปสู่การบรรจบกันช้าหรือเสี่ยงต่อการติดอยู่ในขั้นต่ำสุดท้องถิ่น ในเวลาเดียวกัน อัตราการเรียนรู้ที่สูงจะทำให้เกิดความแตกต่างในการเพิ่มประสิทธิภาพ เนื่องจากคุณเสี่ยงที่จะข้ามผ่านส่วนที่ลึกแต่แคบของฟังก์ชันการสูญเสีย ลองใช้การตั้งเวลาความเร็วเพื่อลดความเร็วขณะฝึกโครงข่ายประสาทเทียม อัปเดตด้วย CS231n
การไล่ระดับสี — การตัดการไล่ระดับพารามิเตอร์ระหว่างการเผยแพร่กลับด้วยค่าสูงสุดหรือบรรทัดฐานส่วนเพิ่ม มีประโยชน์สำหรับการแก้ปัญหาการไล่ระดับสีแบบระเบิดที่คุณอาจพบในจุดที่สาม
การทำให้เป็นมาตรฐานแบบแบตช์ - ใช้เพื่อทำให้ข้อมูลอินพุตของแต่ละเลเยอร์เป็นมาตรฐาน ซึ่งช่วยให้เราสามารถแก้ปัญหาการเปลี่ยนแปลงโควาเรียตภายในได้ หากคุณใช้ Dropout และ Batch Norma ร่วมกัน
โคตรลาดสุ่ม (SGD) — มี SGD หลายประเภทที่ใช้โมเมนตัม อัตราการเรียนรู้แบบปรับตัว และวิธีการ Nesterov อย่างไรก็ตาม ไม่มีข้อใดมีข้อได้เปรียบที่ชัดเจนทั้งในแง่ของประสิทธิภาพการเรียนรู้และลักษณะทั่วไป (
การทำให้เป็นมาตรฐาน - เป็นสิ่งสำคัญสำหรับการสร้างแบบจำลองที่สามารถสรุปได้ทั่วไป เนื่องจากจะเพิ่มบทลงโทษสำหรับความซับซ้อนของโมเดลหรือค่าพารามิเตอร์ที่รุนแรง นี่เป็นวิธีลดความแปรปรวนของโมเดลโดยไม่เพิ่มอคติอย่างมีนัยสำคัญ มากกว่า
หากต้องการประเมินทุกอย่างด้วยตัวเอง คุณต้องปิดใช้งานการทำให้เป็นมาตรฐานและตรวจสอบระดับการสูญเสียข้อมูลด้วยตนเอง
ลาออก เป็นอีกวิธีหนึ่งในการปรับปรุงเครือข่ายของคุณเพื่อป้องกันความแออัด ในระหว่างการฝึกการออกกลางคันจะดำเนินการโดยการรักษากิจกรรมของเซลล์ประสาทด้วยความน่าจะเป็นที่แน่นอนเท่านั้น p (ไฮเปอร์พารามิเตอร์) หรือตั้งค่าเป็นศูนย์ในกรณีตรงกันข้าม ด้วยเหตุนี้ เครือข่ายจึงต้องใช้ชุดย่อยของพารามิเตอร์ที่แตกต่างกันสำหรับชุดการฝึกแต่ละชุด ซึ่งจะช่วยลดการเปลี่ยนแปลงในพารามิเตอร์บางตัวที่มีความสำคัญมากขึ้น
สิ่งสำคัญ: หากคุณใช้ทั้งการดร็อปเอาท์และการทำให้เป็นมาตรฐานแบบแบทช์ โปรดใช้ความระมัดระวังเกี่ยวกับลำดับของการดำเนินการเหล่านี้ หรือแม้แต่การใช้ร่วมกัน ทั้งหมดนี้ยังคงมีการหารือและเสริมอย่างแข็งขัน ต่อไปนี้เป็นการอภิปรายที่สำคัญสองประการในหัวข้อนี้
การควบคุมการทำงาน
เป็นเรื่องเกี่ยวกับการบันทึกขั้นตอนการทำงานและการทดลอง ถ้าคุณไม่บันทึกอะไรเลย คุณอาจลืม เช่น อัตราการเรียนรู้หรือน้ำหนักของชั้นเรียนที่ใช้ ด้วยการควบคุม คุณสามารถดูและสร้างการทดสอบก่อนหน้านี้ซ้ำได้อย่างง่ายดาย ซึ่งจะทำให้คุณสามารถลดจำนวนการทดสอบซ้ำได้
อย่างไรก็ตาม การจัดทำเอกสารด้วยตนเองอาจกลายเป็นงานที่ยากในกรณีที่มีงานจำนวนมาก นี่คือจุดที่เครื่องมืออย่าง Comet.ml เข้ามาช่วยคุณบันทึกชุดข้อมูล การเปลี่ยนแปลงโค้ด ประวัติการทดลอง และโมเดลการผลิตโดยอัตโนมัติ รวมถึงข้อมูลสำคัญเกี่ยวกับโมเดลของคุณ (ไฮเปอร์พารามิเตอร์ ตัววัดประสิทธิภาพของโมเดล และข้อมูลด้านสิ่งแวดล้อม)
โครงข่ายประสาทเทียมอาจมีความไวต่อการเปลี่ยนแปลงเล็กๆ น้อยๆ และอาจส่งผลให้ประสิทธิภาพของโมเดลลดลง การติดตามและบันทึกงานของคุณเป็นขั้นตอนแรกที่คุณสามารถทำได้เพื่อสร้างมาตรฐานให้กับสภาพแวดล้อมและการสร้างแบบจำลองของคุณ
ฉันหวังว่าโพสต์นี้จะเป็นจุดเริ่มต้นสำหรับคุณในการเริ่มแก้ไขจุดบกพร่องโครงข่ายประสาทเทียมของคุณ
Skillbox แนะนำ:
- หลักสูตรภาคปฏิบัติสองปี
"ฉันเป็นนักพัฒนาเว็บ PRO" .- คอร์สออนไลน์
"นักพัฒนา C # จาก 0" .- หลักสูตรปีปฏิบัติ
"นักพัฒนา PHP จาก 0 ถึง PRO" .
ที่มา: will.com