วิธีที่รวดเร็วในการค้นหา metaparameters ที่ดีที่สุดของ SVM (เร็วกว่าการค้นหาแบบกริด)


17

ฉันใช้โมเดล SVM เพื่อทำการพยากรณ์ระยะสั้นของมลพิษทางอากาศ ในการฝึกอบรมโมเดลใหม่ฉันต้องการค้นหาพารามิเตอร์ที่เหมาะสมสำหรับโมเดล SVM (ฉันหมายถึง C, แกมม่าและอื่น ๆ )

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

มีวิธีใดที่ดีกว่าในการหา metaparameters ที่ดีที่สุด (หรือใกล้เคียงที่สุด)? สำหรับฉันแล้วมันเป็นเรื่องของเวลาในการคำนวณ - การค้นหากริดหนึ่งครั้งของปัญหานี้ใช้เวลาประมาณสองชั่วโมง (หลังจากที่ฉันทำการปรับให้เหมาะสมแล้ว)

ข้อดีของการค้นหากริด:

  • มันสามารถทำให้ขนานได้ง่าย - ถ้าคุณมี 20 CPU มันจะทำงานเร็วขึ้น 20 เท่าการขนานวิธีอื่นยากกว่า
  • คุณตรวจสอบพื้นที่ส่วนใหญ่ของ metaparameter ดังนั้นหากมีทางออกที่ดีคุณจะพบว่า

คำตอบ:


10

ข้อเสียของการค้นหากริดคือการที่รันไทม์โตเร็วเท่าผลผลิตของจำนวนตัวเลือกสำหรับแต่ละพารามิเตอร์

นี่คือรายการในบล็อกของ Alex Smolaที่เกี่ยวข้องกับคำถามของคุณ

นี่คือคำพูด:

[... ] เลือกพูด 1,000 คู่ (x, x ') โดยการสุ่มจากชุดข้อมูลของคุณคำนวณระยะทางของคู่ดังกล่าวทั้งหมดและใช้ค่ามัธยฐาน, 0.1 และ 0.9 quantile ทีนี้เลือกλเป็นค่าผกผันของสามตัวเลขเหล่านี้ ด้วย crossvalidation เล็กน้อยคุณจะคิดได้ว่าหนึ่งในสามนั้นดีที่สุด ในกรณีส่วนใหญ่คุณไม่จำเป็นต้องค้นหาเพิ่มเติม

ฉันไม่ได้ลองด้วยตัวเอง แต่ดูเหมือนว่าจะมีแนวโน้ม


สิ่งนี้เกี่ยวข้องกับคำถามอย่างไร คำถามคือเกี่ยวกับการค้นหาพารามิเตอร์ที่ดีที่สุดสำหรับรุ่น SVM (ในวิธีที่รวดเร็ว)
Roronoa Zoro

2
@Roronoa Zoro: และคำตอบก็คือ มันอธิบายวิธีการค้นหาพารามิเตอร์สำหรับฟังก์ชันพื้นฐานตามแนวรัศมีตาม SVMs (C และ \ lambda ในบล็อกโพสต์ของ Smola) ใน 3 | Cs | เวลาเมื่อเทียบกับ | \ gammas || Cs | เช่นเดียวกับในกรณีของการค้นหากริด
carlosdc

เพื่อให้ชัดเจนขึ้นเพื่อให้แน่ใจว่าฉันเข้าใจฮิวริสติกโดยทั่วไปคุณเพียงแค่ดึงจุดข้อมูล 1,000 ชุดจากชุดข้อมูลสำหรับการฝึกอบรม SVM จากนั้นจึงใช้อินเวอร์สของควอไทล์และค่ามัธยฐาน. 1, .9 และ 0.9 ผู้สมัครรับแกมม่าที่เหมาะสม?
มัส

6

หากคุณตั้งสมมติฐานว่ามีฟังก์ชั่นที่ค่อนข้างราบเรียบกับตารางของพารามิเตอร์แสดงว่ามีบางสิ่งที่คุณสามารถทำได้ ตัวอย่างหนึ่งฮิวริสติกแบบง่าย ๆ คือเริ่มต้นด้วยกริดที่หยาบมากของพารามิเตอร์จากนั้นใช้กริดที่ดีกว่ารอบการตั้งค่าพารามิเตอร์ที่ดีที่สุดจากกริดหยาบ

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

มีชุดของการอ้างอิงที่ดีที่นี่ ในอดีตที่ผ่านมาฉันได้ใช้วิธีการที่คุณสามารถประมาณช่วงของพารามิเตอร์ในเคอร์เนล hyperparameters ที่ดีโดยการตรวจสอบเคอร์เนล (เช่นในกรณีของเคอร์เนล RBF เพื่อให้แน่ใจว่าฮิสโตแกรมของค่าเคอร์เนลให้ค่าการแพร่กระจายที่ดี แทนที่จะเอียงไปที่ 0 หรือ 1 - และคุณสามารถทำสิ่งนี้ได้โดยอัตโนมัติเช่นกันโดยไม่ต้องทำงานมากเกินไป) ซึ่งหมายความว่าคุณสามารถ จำกัด ช่วงก่อนที่จะเริ่ม จากนั้นคุณสามารถมุ่งเน้นการค้นหาของคุณกับพารามิเตอร์อื่น ๆ เช่นพารามิเตอร์การทำให้เป็นมาตรฐาน / ความจุ อย่างไรก็ตามวิธีนี้ใช้ได้กับเมล็ดที่คำนวณล่วงหน้าเท่านั้นถึงแม้ว่าคุณสามารถประมาณค่านี้ในชุดย่อยของคะแนนหากคุณไม่ต้องการใช้เมล็ดที่คำนวณล่วงหน้าแล้วและฉันคิดว่าวิธีการนี้ก็ใช้ได้เช่นกัน


5

ฉันใช้การจำลองการอบอ่อนสำหรับการค้นหาพารามิเตอร์

พฤติกรรมนี้ควบคุมโดยพารามิเตอร์บางตัว:

  • k เป็นค่าคงที่ของ Boltzmann
  • T_max คืออุณหภูมิเริ่มต้นของคุณ
  • T_min เป็นเกณฑ์สิ้นสุดของคุณ
  • mu_T( μ) คืออุณหภูมิที่ลดลง ( T->T/μ)
  • i คือจำนวนการวนซ้ำที่แต่ละอุณหภูมิ
  • zคือขนาดขั้นตอน - คุณกำหนดความหมายที่แท้จริง old*(1±z)ผมสุ่มย้ายภายใน
  1. ใช้จุดเริ่มต้น (ชุดของค่าพารามิเตอร์)
  2. รับพลังงาน (มันเหมาะสมกับข้อมูลของคุณมากแค่ไหนฉันใช้ค่าไคสแควร์)
  3. ดูในทิศทางที่สุ่ม ("ก้าวไปหนึ่งก้าว")
    • หากพลังงานต่ำกว่าจุดปัจจุบันของคุณให้ย้ายไปที่นั่น
    • p = e^{-(E_{i+1} - E_i)/(kT)}ถ้ามันสูงกว่าย้ายไปที่นั่นด้วยความน่าจะเป็น
  4. ซ้ำบางครั้งลดT->T/μทุกซ้ำจนกว่าคุณจะตีiT_min

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

และGNU Scientific Libraryยังรวมถึงการหลอมจำลอง


4

หากใครสนใจที่นี่เป็นความคิดของฉันในเรื่อง:

  • ตามที่ @tdc แนะนำให้ฉันทำการค้นหากริด / หยาบ สิ่งนี้นำเสนอปัญหาที่สอง:
    • ในกรณีส่วนใหญ่ฉันจะได้รับชุดของชุด metaparameter ที่ดีที่มีพารามิเตอร์ที่แตกต่างกันอย่างมาก --- ฉันตีความมันด้วยวิธีนี้ว่าพารามิเตอร์เหล่านี้เป็นวิธีการแก้ปัญหาที่ดีที่สุด แต่เพื่อให้แน่ใจว่าฉันควรตรวจสอบกริดที่ดีทั้งหมด ที่จะใช้เวลามาก) ดังนั้นตอนนี้ฉันจะตรวจสอบพื้นที่ใกล้เคียงของการตั้งค่าพารามิเตอร์การเดิมพัน
    • ในกรณีส่วนใหญ่การค้นหาที่ดีไม่ได้เพิ่มประสิทธิภาพของ SVM (อาจเป็นเพราะความจริงที่ว่าฉันกำลังตรวจสอบเฉพาะจุดที่ดีที่สุดจากกริดหยาบ
  • ฉันสังเกตพฤติกรรมที่ใช้เวลาคำนวณส่วนใหญ่ในชุด metaparemeters ที่จะไม่ให้ผลลัพธ์ที่ดีตัวอย่างเช่นชุด metaparameter ส่วนใหญ่จะคำนวณภายใน 15 วินาที (และที่ดีที่สุดของพวกเขามีอัตราข้อผิดพลาด 15%) และบางส่วนใช้เวลา 15 นาที ( และส่วนใหญ่เหล่านี้มีอัตราความผิดพลาดมากกว่า 100%) ดังนั้นเมื่อทำการค้นหากริดฉันฆ่าจุดที่ใช้เวลามากกว่า 30 วินาทีในการคำนวณและคิดว่าพวกเขามีข้อผิดพลาดที่ไม่สิ้นสุด
  • ฉันใช้การประมวลผลหลายตัว (ซึ่งง่ายพอ)

1

หากเคอร์เนลเป็นรัศมีคุณสามารถใช้ฮิวริสติกนี้เพื่อให้ได้มาσ - การเพิ่มประสิทธิภาพ C เป็นวิธีที่ง่ายขึ้นแล้ว


ลิงค์ตาย ฮิวริสติกแบบใดที่คุณอ้างอิงถึง
Aalawlx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.