มีวิธีใดในการวัดความซับซ้อนของ Machine Learning Model ใน Python อย่างชัดเจน
ฉันสนใจในการแก้จุดบกพร่องของโมเดลและหนึ่งในประเด็นที่แนะนำคือการเปรียบเทียบโมเดลของคุณกับโมเดลที่ "ซับซ้อนน้อยกว่า" เพื่อดูว่าประสิทธิภาพนั้นดีกว่ามากสำหรับโมเดลที่ซับซ้อนที่สุดหรือไม่
มันทำให้เกิดคำถามของฉัน:
สมมติว่าคุณมีโมเดล Ensembleและโมเดล Linear สำหรับงานการจัดหมวดหมู่"ดูเหมือนเป็นเรื่องธรรมดาที่จะคิดว่าโมเดลทั้งมวลนั้นซับซ้อนกว่าโมเดลเชิงเส้น"
แต่จะมีวิธีใดในการวัดความซับซ้อนของแบบจำลองในเชิงตัวเลขเพื่อให้สามารถเปรียบเทียบแบบจำลองสองแบบขึ้นไปในเงื่อนไขดังกล่าวได้
มีการใช้งาน python ที่สามารถช่วยงานดังกล่าวได้หรือไม่?
คำตอบ
ฉันไม่เคยได้ยินวิธีการไม่เชื่อเรื่องพระเจ้าของโมเดลใด ๆ ในการวัดความซับซ้อนของโมเดล มีหลายกลยุทธ์ แต่ขึ้นอยู่กับรุ่น
คุณสามารถแก้ไขปัญหาโดยใช้รุ่นต่างๆในตระกูล
สำหรับโมเดลเชิงเส้นคุณสามารถนับจำนวนพารามิเตอร์ที่ไม่ใช่ศูนย์ที่ใช้อยู่ จำนวนคุณสมบัติที่ใช้สำหรับการคาดคะเน
สำหรับต้นไม้การตัดสินใจคุณสามารถนับความลึกสูงสุดที่ต้นไม้บรรลุได้
สำหรับNeural Networksคุณสามารถนับจำนวนพารามิเตอร์ที่ NN ของคุณกำลังปรับให้เหมาะสม
สำหรับวิธีการทั้งมวล (ฟอเรสต์แบบสุ่มการเพิ่มการไล่ระดับสี) คุณสามารถใช้การรวมตัวของผู้เรียนที่อ่อนแอต่างกันที่ใช้ในโมเดล
สำหรับการใช้งาน python มีการใช้งานหลายอย่างขึ้นอยู่กับรุ่นที่คุณต้องการวัด บางคนถ้าคุณสังเกตว่าง่ายต่อการวัด
มันยากที่จะเปรียบเทียบความซับซ้อนระหว่างตระกูลโมเดลต่างๆ การถดถอยเชิงเส้นที่ซับซ้อนกว่าด้วยสัมประสิทธิ์ 4 หรือต้นไม้การตัดสินใจที่มี max_depth = 3 คืออะไร?
ในเรื่องของการเรียนรู้ที่ซับซ้อนลึกฮินตัน Oriol เจฟฟ์คณบดีตีพิมพ์บทความกลั่นความรู้ของเครือข่ายประสาท พวกเขาพูดถึงการทำให้ความซับซ้อนของ Neural Network ง่ายขึ้น
อาจจะดูไร้เดียงสาไปหน่อย แต่แนวคิดแรกที่อยู่ในใจคือการนับจำนวนพารามิเตอร์ที่ต้องประมาณในระหว่างการฝึกอบรม: ยิ่งต้องประมาณค่ามากเท่าไหร่โมเดลก็ยิ่งซับซ้อนมากขึ้นเท่านั้นเนื่องจากพื้นที่สมมติฐานมีขนาดใหญ่ขึ้น . ตัวอย่างเช่นแบบจำลองเชิงเส้นต้องการเท่านั้น$n+1$ พารามิเตอร์ (ด้วย $n$จำนวนคุณลักษณะ) ในขณะที่จำนวนพารามิเตอร์ในโมเดลทั้งมวลที่ต้องการคือผลรวมของจำนวนพารามิเตอร์สำหรับผู้เรียนทุกคนดังนั้นจึงมีแนวโน้มที่จะสูงกว่า แนวคิดนี้สามารถปรับแต่งให้คำนึงถึงช่วงของค่าของพารามิเตอร์
ในการประมาณคร่าวๆเราสามารถคำนวณขนาดของวัตถุที่แสดงโมเดลใน python ได้ (สมมติว่าการเป็นตัวแทนของโมเดลนั้นประหยัดพื้นที่อาจไม่เป็นเช่นนั้นเสมอไป)
อย่างที่คุณทราบกันดีอยู่แล้วว่า "ความซับซ้อน" เป็นคำศัพท์ที่ใช้ในวิทยาการคอมพิวเตอร์ โดยปกติความซับซ้อนจะวัดเป็น "สัญกรณ์ขนาดใหญ่" และเกี่ยวข้องกับวิธีการแก้ปัญหาในช่วงเวลาที่จำนวนอินพุตเพิ่มขึ้น ตัวอย่างเช่นโพสต์นี้กล่าวถึงความซับซ้อนในการคำนวณของเลเยอร์คอนโวลูชัน
อย่างไรก็ตามในการเรียนรู้เชิงลึกสถาปัตยกรรมเครือข่ายประสาทเทียมที่แข่งขันกันมักจะใช้อัลกอริทึมเดียวกัน (การแพร่กระจายกลับ) กับปัญหาประเภทเดียวกัน (เช่นการจำแนก ImageNet) ความแตกต่างเพียงอย่างเดียวคือสถาปัตยกรรม นอกจากนี้สถาปัตยกรรมส่วนใหญ่ใช้องค์ประกอบการคำนวณที่คล้ายคลึงกัน (เช่นเลเยอร์คอนโวลูชันและเลเยอร์เชิงเส้น) ดังนั้นจึงเป็นแบบแผนในการใช้จำนวนพารามิเตอร์เป็นสแตนด์อินสำหรับความซับซ้อน จริงอยู่ว่านี่เป็นเพียงการประมาณเท่านั้น: เครือข่ายสองเครือข่ายอาจมีพารามิเตอร์จำนวนเท่ากัน แต่ต้องการจำนวนการดำเนินการที่แตกต่างกัน แต่โดยทั่วไปแล้วเป็นการประมาณที่ดีเนื่องจากโดยทั่วไปแล้วสถาปัตยกรรมที่แตกต่างกันจะมีความคล้ายคลึงกันตามที่ระบุไว้ข้างต้น แต่อาจมีขนาดที่แตกต่างกันได้ตามลำดับความสำคัญหลายขนาด
เป็นข้อมูลอ้างอิงพิจารณารูปที่ 1 ในกระดาษ EfficientNet โดยใช้จำนวนพารามิเตอร์ที่ฝึกอบรมได้เป็นแบบสแตนด์อินสำหรับ "ขนาดโมเดล" และโปรดทราบว่าจำนวนพารามิเตอร์มีความสัมพันธ์เชิงเส้นมากขึ้นหรือน้อยลงกับรันไทม์
สำหรับฟังก์ชั่นหลามที่นับจำนวนของพารามิเตอร์สุวินัยนี้จะขึ้นอยู่กับว่าคุณกำลังใช้ Keras, Tensorflow, PyTorch ฯลฯ ใน Keras model.count_params()
นี้เป็นหนึ่งบรรทัด: ใน PyTorch คุณสามารถคำนวณได้จากmodel.parameters()
ตามที่กล่าวไว้ที่นี่
ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ ที่นี่เมื่อเราพูดถึงความซับซ้อนของโมเดลเรามักจะคิดถึงจำนวนพารามิเตอร์ที่โมเดลเรียนรู้ เมื่อมีคนพูดถึงการเปรียบเทียบกับโมเดลที่ซับซ้อนน้อยกว่าพวกเขามักจะหมายถึงการเปรียบเทียบกับโมเดลที่ซับซ้อนน้อยกว่าโดยสัญชาตญาณ (ไม่ว่าจะเป็นโมเดลในคลาสเดียวกันเช่นเครือข่ายประสาทที่มีเซลล์ประสาทน้อยกว่าหรือโมเดลจากคลาสที่ง่ายกว่าเช่นโมเดลเชิงเส้น แทนที่จะเป็นป่าสุ่ม)
วิธีหนึ่งในการคิดเกี่ยวกับความซับซ้อนของโมเดลระหว่างโมเดลที่แตกต่างกันมากคือKolmogorov Complexityและคุณสามารถประมาณค่านี้ได้โดยดูจากจำนวนพื้นที่ว่างที่โมเดลบันทึกไว้ (เช่นดอง) ในตัวอย่างที่คุณให้มาชุดนี้จะใช้พื้นที่ดิสก์มากกว่าแบบจำลองเชิงเส้นเว้นแต่วงดนตรีจะง่ายกว่าแบบจำลองเชิงเส้น (เช่นชุดของแบบจำลองเชิงเส้นสองแบบที่มีค่าสัมประสิทธิ์การเรียนรู้ 10 ค่าแต่ละแบบเทียบกับแบบจำลองเชิงเส้นที่มีค่าสัมประสิทธิ์การเรียนรู้ 200)
ทางเลือกหนึ่งคือเกณฑ์ข้อมูลแบบเบย์ (BIC)ซึ่งเป็นเกณฑ์การเลือกแบบจำลองที่พยายามให้รางวัลกับการสร้างแบบจำลองที่เหมาะสมโดยวัดจากความเป็นไปได้สูงสุดในขณะที่การลงโทษจำนวนพารามิเตอร์
การใช้งาน BIC หนึ่งรายการอยู่ในRegscorePyแพ็คเกจ
1. แต่จะมีวิธีใดในการวัดความซับซ้อนของโมเดลในเชิงตัวเลขเพื่อให้สามารถเปรียบเทียบแบบจำลองสองแบบหรือมากกว่าในเงื่อนไขดังกล่าวได้?
คุณสามารถใช้มิติ VC เพื่อวัดความซับซ้อนของโมเดลในรูปแบบตัวเลข ดูมิติ Vapnik-Chervonenkis วิกิพีเดีย
2. มีการใช้งาน python ที่สามารถช่วยงานดังกล่าวได้หรือไม่?
มีลิงก์การแลกเปลี่ยนสแต็กที่อธิบายเกี่ยวกับมิติ VC อยู่แล้ว วิธีคำนวณ VC-Dimension