ฟังก์ชั่นการสูญเสีย XGBoost ประมาณด้วยการขยายตัวของเทย์เลอร์


28

ยกตัวอย่างเช่นใช้ฟังก์ชันวัตถุประสงค์ของโมเดล XGBoost ในการวนซ้ำ 'th:เสื้อ

L(เสื้อ)=Σผม=1n(Yผม,Y^ผม(เสื้อ-1)+เสื้อ(xผม))+Ω(เสื้อ)

ที่เป็นฟังก์ชั่นการสูญเสียเป็น 'เอาท์พุทต้นไม้ TH และเป็นกู หนึ่งในขั้นตอนสำคัญ (มากมาย) สำหรับการคำนวณที่รวดเร็วคือการประมาณ:เสื้อเสื้อΩ

L(t)i=1n(yi,y^i(t1))+gtft(xi)+12hift2(xi)+Ω(ft),

โดยที่และเป็นอนุพันธ์อันดับหนึ่งและสองของฟังก์ชันการสูญเสียgihi

สิ่งที่ฉันขอคือข้อโต้แย้งที่น่าเชื่อถือเพื่อทำให้เข้าใจผิดว่าเหตุใดการประมาณข้างต้นจึงทำงาน:

1) XGBoost ที่มีการประมาณด้านบนเปรียบเทียบกับ XGBoost กับฟังก์ชั่นวัตถุประสงค์ได้อย่างไร สิ่งที่น่าสนใจพฤติกรรมที่มีลำดับสูงกว่าจะหายไปในการประมาณ?

2) มันค่อนข้างยากที่จะเห็นภาพ (และขึ้นอยู่กับฟังก์ชั่นการสูญเสีย) แต่ถ้าฟังก์ชั่นการสูญเสียมีองค์ประกอบลูกบาศก์ขนาดใหญ่แล้วการประมาณอาจจะล้มเหลว มันเป็นวิธีการที่ไม่ก่อให้เกิดปัญหาสำหรับ XGBoost?

คำตอบ:


62

นี่เป็นคำถามที่น่าสนใจมาก เพื่อที่จะเข้าใจสิ่งที่เกิดขึ้นฉันต้องผ่านสิ่งที่ XGBoost พยายามทำและวิธีการอื่น ๆ ที่เรามีในกล่องเครื่องมือของเราเพื่อจัดการกับมัน คำตอบของฉันมีมากกว่าวิธีการแบบดั้งเดิมและวิธี / ทำไม XGBoost คือการปรับปรุง หากคุณต้องการเพียงสัญลักษณ์แสดงหัวข้อย่อยมีการสรุปในตอนท้าย

การไล่ระดับสีแบบดั้งเดิมเพิ่ม

พิจารณาอัลกอริธึมการไล่ระดับสีไล่โทนสีแบบดั้งเดิม(Wikipedia) :

  • คำนวณพื้นฐานรุ่นH0
  • สำหรับm1:M
    • Compute หลอกเหลือrim=(yi,Hm1(xi))Hm1(xi)
    • พอดีกับผู้เรียนพื้นฐานhm(x)กับของเทียมหลอก
    • คำนวณคูณγที่ช่วยลดค่าใช้จ่ายที่γ=argminγi=1N(yi,Hm1(xi)+γhm(xi)) (โดยใช้การค้นหาบรรทัด)
    • อัพเดทรุ่นHm(x)=Hm1(x)+γhm(x) )
  • คุณจะได้รับรูปแบบการเพิ่มขึ้นของคุณHM(x) )

การประมาณฟังก์ชั่นมีความสำคัญสำหรับส่วนต่อไปนี้

พอดีกับผู้เรียนพื้นฐานhm(x)กับของเทียมหลอก

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

คุณกำลังพยายามที่จะหาสิ่งที่ดีที่สุดรุ่นhm(x)ที่ลดค่าใช้จ่าย(yi,Hm1(xi)+hm(xi)) ) แต่การทำเช่นนั้นคุณกำลังปรับโมเดลการถดถอยอย่างง่ายให้กับส่วนที่เหลือโดยใช้ MSE เป็นฟังก์ชันวัตถุประสงค์ โปรดสังเกตว่าคุณไม่ได้ลดสิ่งที่คุณต้องการโดยตรง แต่ใช้ส่วนที่เหลือและ MSE เป็นพร็อกซีในการทำเช่นนั้น ส่วนที่ไม่ดีคือไม่จำเป็นต้องให้ทางออกที่ดีที่สุด ส่วนที่ดีคือมันใช้งานได้

โคตรลาดแบบดั้งเดิม

สิ่งนี้คล้ายกับการไล่ระดับสีแบบไล่โทนสี (Wikipedia)ซึ่งคุณพยายามลดฟังก์ชันค่าใช้จ่ายf(x)โดยทำตามการไล่ระดับสี (ลบของ) ฟังก์ชันf(x)ในทุกขั้นตอน

x(i+1)=x(i)f(x(i))

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

การแสดงสลับฉาก

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

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

วิธีอื่น ๆ ในการเลือกรุ่นที่ดีที่สุดhm(x)

ถ้าเราดูที่ AdaBoost เป็นกรณีพิเศษของการเพิ่มระดับความลาดชันมันไม่ได้เลือก regressors แต่ตัวแยกประเภทเป็นผู้เรียนที่อ่อนแอ หากเราตั้งค่าhm(x){1,1}วิธีที่ AdaBoost เลือกรุ่นที่ดีที่สุดคือการค้นหา

hm=argmaxhmi=1Nwihm(xi)

ที่wiมีเหลือ ( แหล่งที่มาเริ่มต้นที่สไลด์ 20 ) เหตุผลสำหรับการใช้งานฟังก์ชั่นวัตถุประสงค์นี้คือถ้าwiและhm(xi)ไปในทิศทางเดียวกัน / มีเครื่องหมายเดียวกันจุดกำลังเคลื่อนที่ไปในทิศทางที่ถูกต้องและคุณพยายามเพิ่มจำนวนสูงสุด ของการเคลื่อนไหวในทิศทางที่ถูกต้อง

แต่อีกครั้งนี้ไม่ได้โดยตรงที่วัดhmลดขนาด(yi,Hm1(xi)+hm(xi)) ) มันเป็นวิธีการที่ดีวัดย้ายhmเป็นด้วยความเคารพกับทิศทางโดยรวมที่คุณควรไปเป็นวัดที่มีความคลาดเคลื่อนwiซึ่งยังประมาณ คนตกค้างบอกคุณว่าคุณควรไปทางไหนโดยใช้สัญลักษณ์ของพวกเขาและโดยประมาณตามขนาดของพวกเขา แต่พวกเขาไม่ได้บอกคุณว่าคุณควรหยุดอยู่ตรงไหน

โคตรลาดที่ดีขึ้น

ตัวอย่างสามตัวอย่างถัดไปไม่จำเป็นสำหรับคำอธิบายและเป็นเพียงที่นี่เพื่อนำเสนอวิธีที่จะทำได้ดีกว่าเชื้อสายการไล่ระดับสีวานิลลาเพื่อสนับสนุนแนวคิดที่ว่าสิ่งใดที่ XGBoost ทำนั้นเป็นอีกวิธีหนึ่งในการพัฒนาเชื้อสายไล่ระดับสี ในการตั้งค่าการไล่ระดับสีแบบดั้งเดิมเมื่อพยายามลดf(x)เป็นไปได้ที่จะทำได้ดีกว่าเพียงแค่ไล่ตามการไล่ระดับสี ส่วนขยายจำนวนมากได้รับการเสนอชื่อ(วิกิพีเดีย) นี่คือบางส่วนของพวกเขาแสดงให้เห็นว่ามันเป็นไปได้ที่จะทำดีให้เวลาในการคำนวณมากขึ้นหรือคุณสมบัติอื่น ๆ ของฟังก์ชันฉf

  • การค้นหาบรรทัด / การย้อนรอย:ในการไล่ระดับสีเมื่อการไล่ระดับสีf(x(i))ถูกคำนวณจุดถัดไปควรเป็น

    x(i+1)=x(i)f(x(i))

    แต่การไล่ระดับสีให้ทิศทางเดียวเท่านั้นที่ควรเคลื่อนย้ายไม่ใช่โดย "เท่าใด" ดังนั้นจึงสามารถใช้ขั้นตอนอื่นเพื่อค้นหาc>0ดีที่สุดเช่นนั้น

    xc(i+1)=x(i)cf(x(i))

    ลดฟังก์ชั่นค่าใช้จ่าย ซึ่งจะดำเนินการตรวจสอบความf(xc(i+1))สำหรับบางcและตั้งแต่ฟังก์ชั่นfควรจะนูนมันค่อนข้างง่ายที่จะทำผ่านทางสายการค้นหา (Wikipedia)หรือย้อนรอยสายการค้นหา (วิกิพีเดีย) นี่คือค่าใช้จ่ายหลักคือการประเมินผลf(x) ) ดังนั้นส่วนขยายนี้ทำงานได้ดีที่สุดถ้าfง่ายต่อการคำนวณ โปรดทราบว่าอัลกอริทึมทั่วไปสำหรับการไล่ระดับสีใช้การค้นหาบรรทัดดังที่แสดงในตอนต้นของคำตอบของฉัน

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

  • Stochastic Gradient Descent และวิธี Momentum:ใน Stochastic Gradient Descent คุณไม่ได้ประเมินค่าการไล่ระดับสีในทุกจุด แต่จะอยู่ในเซตย่อยของคะแนนเหล่านั้นเท่านั้น คุณทำตามขั้นตอนแล้วคำนวณการไล่ระดับสีบนแบตช์อื่นแล้วดำเนินการต่อ Stochastic Gradient Descent อาจถูกนำมาใช้เนื่องจากการคำนวณในทุกจุดมีราคาแพงมากหรืออาจเป็นคะแนนทั้งหมดที่ไม่เหมาะกับหน่วยความจำ สิ่งนี้ช่วยให้คุณทำตามขั้นตอนมากขึ้นเร็วขึ้น แต่แม่นยำน้อยลง

    เมื่อทำเช่นนั้นทิศทางของการไล่ระดับสีอาจเปลี่ยนแปลงได้ขึ้นอยู่กับจุดที่สุ่มตัวอย่าง ในการต่อต้านผลกระทบนี้วิธีการโมเมนตัมจะรักษาค่าเฉลี่ยเคลื่อนที่ของทิศทางสำหรับแต่ละมิติลดความแปรปรวนในแต่ละการเคลื่อนไหว

x(i)

x(i+1)=x(i)f(x(i))

f(x(i))ff(x(i+1))<f(x(i))x(i)

x(i+1)=x(i)f(x(i))Hessf(x(i))

Hessf(x)fxx(i+1)f(x(i+1))=0ff เป็นพหุนามอันดับที่สองจากนั้นวิธีของนิวตันควบคู่กับการค้นหาบรรทัดควรจะสามารถค้นหาขั้นต่ำได้ในขั้นตอนเดียว

วิธีการของนิวตันตัดกับ Stochastic gradient descent ใน Stochastic Gradient Descent เราใช้จุดที่น้อยลงเพื่อใช้เวลาน้อยลงในการคำนวณทิศทางที่เราควรทำเพื่อให้ได้มากขึ้นโดยหวังว่าเราจะไปที่นั่นเร็วขึ้น ในวิธีการของนิวตันเราใช้เวลามากขึ้นในการคำนวณทิศทางที่เราต้องการโดยหวังว่าเราจะต้องทำตามขั้นตอนน้อยลงเพื่อไปที่นั่น

f(x+a)

f(x)+f(x)xa+122f(x)x2a2+=n=01n!nf(x)xnan.

kf(x+a)n=0k1n!nf(x)xnanhk(x)akhka

exlog(x)

fxa0.10.01ของผลกระทบ นี่คือขนาดขั้นตอนหรืออัตราการเรียนรู้ของการไล่ระดับสี สิ่งนี้เป็นที่ยอมรับได้เพราะหากผู้เรียนที่อ่อนแอของเราได้รับการแก้ปัญหาที่ดีมากนั่นหมายความว่าปัญหาเป็นเรื่องง่ายซึ่งในกรณีนี้เราจะจบลงด้วยวิธีการแก้ปัญหาที่ดีอยู่ดีหรือเรากำลังพยายามมากเกินไป มากไปในทิศทางที่ไม่ดีนี้จะไม่เปลี่ยนปัญหาพื้นฐาน

ดังนั้น XGBoost กำลังทำอะไรและเหตุใดจึงใช้งานได้

XGBoost เป็นอัลกอริทึมการไล่ระดับสีแบบไล่ระดับที่สร้างต้นไม้การถดถอยในฐานะผู้เรียนที่อ่อนแอ อัลกอริธึมการไล่ระดับสีแบบดั้งเดิมนั้นคล้ายคลึงกับการไล่ระดับสีแบบไล่ระดับด้วยการค้นหาเส้นตรงซึ่งทิศทางที่จะไปนั้นถูกดึงมาจากผู้เรียนที่อ่อนแอ การใช้งาน Gradient Boosting อย่างไร้เดียงสาจะใช้ฟังก์ชันต้นทุนของผู้เรียนที่อ่อนแอเพื่อให้เหมาะสมกับส่วนที่เหลือ นี่คือพร็อกซีเพื่อลดค่าใช้จ่ายของรุ่นใหม่ซึ่งมีราคาแพงในการคำนวณ สิ่งที่ XGBoost กำลังทำคือการสร้างฟังก์ชั่นค่าใช้จ่ายที่กำหนดเองเพื่อให้พอดีกับต้นไม้โดยใช้ชุดลำดับที่สองของเทย์เลอร์เป็นค่าประมาณสำหรับฟังก์ชั่นค่าใช้จ่ายจริงซึ่งจะทำให้แน่ใจได้มากขึ้นว่า ในแง่นี้และเพื่อให้เข้าใจได้ง่าย XGBoost คือการไล่ระดับสีเพื่อเพิ่มประสิทธิภาพของวิธีการของนิวตันในการไล่ระดับสี

ทำไมพวกเขาถึงสร้างมันขึ้นมาแบบนั้น

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

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

L(t)i=1n(yi,y^i(t1))constant+giconstantft(xi)+12hiconstantft2(xi)+Ω(ft),

ft(xi)Ω(ft)

สรุป

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

ประมาณในการใช้งานจะคล้ายกับวิธีของนิวตันและเป็นธรรมโดยเทย์เลอร์ซีรีส์ (วิกิพีเดีย)และเทย์เลอร์ทฤษฎีบท (วิกิพีเดีย)

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

สำหรับการสร้างภาพข้อมูลให้ตรวจสอบหน้าวิกิพีเดียของทฤษฎีบทเทย์เลอร์ซีรีส์ / ของเทย์เลอร์หรือข่านสถาบันการศึกษาเกี่ยวกับเทย์เลอร์ซีรีส์หรือหน้า MathDemo เกี่ยวกับการประมาณพหุนามของพหุนามไม่ใช่


2
+1 ฉันต้องสารภาพว่าฉันยังไม่ได้อ่านคำตอบนี้ (ยัง?) และไม่สามารถตัดสินได้เพราะมันอยู่นอกเหนือความเชี่ยวชาญของฉัน แต่มันก็ดูน่าประทับใจมากที่ฉันมีความสุขมาก ทำได้ดี [ดูเหมือน]!
อะมีบาพูดว่า Reinstate Monica

นั่นเป็นคำตอบที่ยอดเยี่ยม ฉันมีหนึ่งคำถามว่าอัลกอริทึมการไล่ระดับสีเหมาะกับต้นไม้การถดถอยกับการไล่ระดับสีเชิงลบที่มีเกณฑ์แยก mse โครงสร้างของต้นไม้ถูกกำหนดใน XGBoost อย่างไร?
gnikol

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