มีวิธีใดในการวัดความซับซ้อนของ Machine Learning Model ใน Python อย่างชัดเจน

Aug 20 2020

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

มันทำให้เกิดคำถามของฉัน:

สมมติว่าคุณมีโมเดล Ensembleและโมเดล Linear สำหรับงานการจัดหมวดหมู่"ดูเหมือนเป็นเรื่องธรรมดาที่จะคิดว่าโมเดลทั้งมวลนั้นซับซ้อนกว่าโมเดลเชิงเส้น"

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

  2. มีการใช้งาน python ที่สามารถช่วยงานดังกล่าวได้หรือไม่?

คำตอบ

4 CarlosMougan Aug 24 2020 at 14:56

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

คุณสามารถแก้ไขปัญหาโดยใช้รุ่นต่างๆในตระกูล

  • สำหรับโมเดลเชิงเส้นคุณสามารถนับจำนวนพารามิเตอร์ที่ไม่ใช่ศูนย์ที่ใช้อยู่ จำนวนคุณสมบัติที่ใช้สำหรับการคาดคะเน

  • สำหรับต้นไม้การตัดสินใจคุณสามารถนับความลึกสูงสุดที่ต้นไม้บรรลุได้

  • สำหรับNeural Networksคุณสามารถนับจำนวนพารามิเตอร์ที่ NN ของคุณกำลังปรับให้เหมาะสม

  • สำหรับวิธีการทั้งมวล (ฟอเรสต์แบบสุ่มการเพิ่มการไล่ระดับสี) คุณสามารถใช้การรวมตัวของผู้เรียนที่อ่อนแอต่างกันที่ใช้ในโมเดล

สำหรับการใช้งาน python มีการใช้งานหลายอย่างขึ้นอยู่กับรุ่นที่คุณต้องการวัด บางคนถ้าคุณสังเกตว่าง่ายต่อการวัด

มันยากที่จะเปรียบเทียบความซับซ้อนระหว่างตระกูลโมเดลต่างๆ การถดถอยเชิงเส้นที่ซับซ้อนกว่าด้วยสัมประสิทธิ์ 4 หรือต้นไม้การตัดสินใจที่มี max_depth = 3 คืออะไร?

ในเรื่องของการเรียนรู้ที่ซับซ้อนลึกฮินตัน Oriol เจฟฟ์คณบดีตีพิมพ์บทความกลั่นความรู้ของเครือข่ายประสาท พวกเขาพูดถึงการทำให้ความซับซ้อนของ Neural Network ง่ายขึ้น

3 Erwan Aug 20 2020 at 03:26

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

ในการประมาณคร่าวๆเราสามารถคำนวณขนาดของวัตถุที่แสดงโมเดลใน python ได้ (สมมติว่าการเป็นตัวแทนของโมเดลนั้นประหยัดพื้นที่อาจไม่เป็นเช่นนั้นเสมอไป)

3 cag51 Aug 23 2020 at 14:03

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

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

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

สำหรับฟังก์ชั่นหลามที่นับจำนวนของพารามิเตอร์สุวินัยนี้จะขึ้นอยู่กับว่าคุณกำลังใช้ Keras, Tensorflow, PyTorch ฯลฯ ใน Keras model.count_params()นี้เป็นหนึ่งบรรทัด: ใน PyTorch คุณสามารถคำนวณได้จากmodel.parameters()ตามที่กล่าวไว้ที่นี่

3 NicholasJamesBailey Aug 24 2020 at 15:43

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

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

2 BrianSpiering Aug 20 2020 at 03:56

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

การใช้งาน BIC หนึ่งรายการอยู่ในRegscorePyแพ็คเกจ

2 Dhanushkumar Aug 27 2020 at 14:26

1. แต่จะมีวิธีใดในการวัดความซับซ้อนของโมเดลในเชิงตัวเลขเพื่อให้สามารถเปรียบเทียบแบบจำลองสองแบบหรือมากกว่าในเงื่อนไขดังกล่าวได้?

คุณสามารถใช้มิติ VC เพื่อวัดความซับซ้อนของโมเดลในรูปแบบตัวเลข ดูมิติ Vapnik-Chervonenkis วิกิพีเดีย

2. มีการใช้งาน python ที่สามารถช่วยงานดังกล่าวได้หรือไม่?

มีลิงก์การแลกเปลี่ยนสแต็กที่อธิบายเกี่ยวกับมิติ VC อยู่แล้ว วิธีคำนวณ VC-Dimension