แนะนำ Random Search

การปรับ Hyperparameter ใน Python

Alex Scriven

Data Scientist

สิ่งที่รู้อยู่แล้ว

 

คล้ายกับ grid search มาก:

  • กำหนด estimator, hyperparameter ที่ต้องการปรับ และช่วงค่าของแต่ละ hyperparameter
  • ยังคงกำหนด cross-validation scheme และฟังก์ชัน scoring เหมือนเดิม

 

แต่ เราจะ สุ่ม เลือก grid squares แทน

การปรับ Hyperparameter ใน Python

ทำไมวิธีนี้จึงได้ผล?

Bengio & Bergstra (2012):

งานวิจัยนี้แสดงให้เห็นทั้งเชิงประจักษ์และเชิงทฤษฎีว่า การเลือกทดลองแบบสุ่มมีประสิทธิภาพมากกว่าการทดลองแบบ grid สำหรับการปรับ hyper-parameter

เหตุผลหลัก 2 ข้อ:

  1. ไม่ใช่ทุก hyperparameter ที่สำคัญเท่ากัน
  2. เทคนิคเล็กน้อยจากทฤษฎีความน่าจะเป็น
การปรับ Hyperparameter ใน Python

เทคนิคความน่าจะเป็น

Grid search:

โมเดลต่าง ๆ ในตาราง 10x10

ต้องรันโมเดลกี่ครั้งจึงจะมีโอกาส 95% ที่จะได้ช่องสีเขียว?

โมเดลที่ดีที่สุด:

โมเดลต่าง ๆ ในตาราง 10x10

การปรับ Hyperparameter ใน Python

เทคนิคความน่าจะเป็น

 

หากสุ่มเลือกชุดค่า hyperparameter อย่างสม่ำเสมอ ลองพิจารณาโอกาสที่จะ MISS ทุกครั้ง เพื่อแสดงว่าสิ่งนี้ไม่น่าจะเกิดขึ้น

  • ครั้งที่ 1 = โอกาสสำเร็จ 0.05 และพลาด (1 - 0.05)

    • ครั้งที่ 2 = พลาดช่วงนั้น (1-0.05) x (1-0.05)
      • ครั้งที่ 3 = พลาดอีก (1-0.05) x (1-0.05) x (1-0.05)
  • เมื่อทดลอง n ครั้ง โอกาสที่ทุกครั้งจะพลาดจุดที่ต้องการคือ (1-0.05)^n

การปรับ Hyperparameter ใน Python

เทคนิคความน่าจะเป็น

 

ต้องทดลองกี่ครั้งจึงจะมีโอกาสสูง (95%) ที่จะอยู่ในช่วงนั้น?

  • โอกาสพลาดทั้งหมดคือ (1-0.05)^n
  • ดังนั้นโอกาสที่จะเข้าถึงช่วงนั้นคือ (1-(1-0.05)^n)
  • แก้สมการ 1-(1-0.05)^n >= 0.95 ได้ n >= 59
การปรับ Hyperparameter ใน Python

เทคนิคความน่าจะเป็น

 

หมายความว่าอะไร?

  • การสุ่มเลือกจุดใหม่มีโอกาสน้อยมากที่จะพลาด "พื้นที่ดี" ไปตลอด
  • Grid search อาจเสียเวลามากในพื้นที่ที่ไม่ดี เพราะต้องครอบคลุมทุกจุดอย่างครบถ้วน
การปรับ Hyperparameter ใน Python

ข้อควรระวัง

 

ข้อควรจำ:

  1. ค่าสูงสุดที่ได้ยังขึ้นอยู่กับ grid ที่กำหนดเท่านั้น!

  2. เพื่อเปรียบเทียบกับ grid search อย่างยุติธรรม ต้องใช้ "งบประมาณ" การสร้างโมเดลเท่ากัน

การปรับ Hyperparameter ใน Python

การสร้างชุดค่า hyperparameter แบบสุ่ม

สร้างชุดค่า hyperparameter แบบสุ่มเองได้ดังนี้:

# Set some hyperparameter lists
learn_rate_list = np.linspace(0.001,2,150)
min_samples_leaf_list = list(range(1,51))
# Create list of combinations
from itertools import product
combinations_list = [list(x) for x in 
                    product(learn_rate_list, min_samples_leaf_list)]
# Select 100 models from our larger set
random_combinations_index = np.random.choice(
                            range(0,len(combinations_list)), 100, 
                            replace=False)
combinations_random_chosen = [combinations_list[x] for x in 
                            random_combinations_index]
การปรับ Hyperparameter ใน Python

การแสดงผล Random Search

วิเคราะห์การครอบคลุมของ random search ด้วยการพล็อตค่า hyperparameter บนแกน X และ Y ได้เช่นกัน

กราฟแสดงการครอบคลุมของ random search

สังเกตว่าจุดกระจายในช่วงกว้าง แต่ไม่หนาแน่นในจุดใดจุดหนึ่ง?

การปรับ Hyperparameter ใน Python

มาฝึกกันเถอะ!

การปรับ Hyperparameter ใน Python

Preparing Video For Download...