Đây là một câu hỏi rất thú vị. Để hiểu đầy đủ những gì đang diễn ra, tôi đã phải xem qua những gì XGBoost đang cố gắng thực hiện và những phương pháp khác mà chúng tôi có trong hộp công cụ của mình để đối phó với nó. Câu trả lời của tôi đi qua các phương pháp truyền thống và làm thế nào / tại sao XGBoost là một cải tiến. Nếu bạn chỉ muốn các gạch đầu dòng, có một bản tóm tắt ở cuối.
Tăng cường Gradient truyền thống
Hãy xem xét thuật toán tăng cường độ dốc truyền thống (Wikipedia) :
- Tính toán mô hình cơ sởH0
- Đối vớim←1:M
- Tính toán giả dưrim=−∂ℓ(yi,Hm−1(xi))∂Hm−1(xi)
- Phù hợp với người học cơ sở với phần dư giảhm(x)
- Tính hệ số nhân giảm thiểu chi phí, , (sử dụng tìm kiếm dòng)γγ=argminγ∑Ni=1ℓ(yi,Hm−1(xi)+γhm(xi))
- Cập nhật mô hình .Hm(x)=Hm−1(x)+γhm(x)
- Bạn nhận được mô hình tăng cường .HM(x)
Hàm gần đúng là quan trọng đối với phần sau,
Điều chỉnh một người học cơ sở cho các phần dư giả.hm(x)
Hãy tưởng tượng bạn ở đâu để xây dựng thuật toán Gradient Boosting của bạn một cách ngây thơ. Bạn sẽ xây dựng thuật toán ở trên bằng cách sử dụng các cây hồi quy hiện có như những người học yếu. Giả sử bạn không được phép điều chỉnh việc thực hiện hiện tại của những người học yếu. Trong Matlab , tiêu chí phân chia mặc định là Lỗi bình phương trung bình. Điều tương tự cũng xảy ra với scikit learn .
Bạn đang cố gắng tìm mô hình tốt nhất để giảm thiểu chi phí . Nhưng để làm như vậy, bạn đang điều chỉnh mô hình hồi quy đơn giản cho phần dư sử dụng MSE làm hàm mục tiêu. Lưu ý rằng bạn không trực tiếp thu nhỏ những gì bạn muốn, nhưng sử dụng phần dư và MSE làm proxy để thực hiện điều đó. Phần xấu là nó không nhất thiết mang lại giải pháp tối ưu. Phần tốt là nó hoạt động.hm(x)ℓ(yi,Hm−1(xi)+hm(xi))
Giảm dần truyền thống
Điều này tương tự với Gradient Descent truyền thống (Wikipedia) , nơi bạn đang cố gắng giảm thiểu hàm chi phí bằng cách làm theo độ dốc (âm của) của hàm, ở mỗi bước.f(x)−∇f(x)
x(i+1)=x(i)−∇f(x(i))
Nó không cho phép bạn tìm mức tối thiểu chính xác sau một bước, nhưng mỗi bước sẽ đưa bạn đến gần mức tối thiểu (nếu hàm này lồi). Đây là một xấp xỉ, nhưng nó hoạt động rất tốt và đó là thuật toán mà chúng ta thường sử dụng để thực hiện hồi quy logistic, ví dụ.
Kết hợp
Tại thời điểm này, điều cần hiểu là thuật toán tăng cường độ dốc chung không tính toán hàm chi phí cho mỗi phân tách có thể, nó sử dụng hàm chi phí của người học yếu hồi quy để phù hợp với phần dư.ℓ
Điều mà câu hỏi của bạn dường như ngụ ý là "XGBoost thực sự" sẽ tính toán hàm chi phí cho mỗi lần phân tách và "XGBoost gần đúng" đang sử dụng phương pháp phỏng đoán để ước tính nó. Bạn có thể thấy nó theo cách đó, nhưng trong lịch sử, chúng tôi đã có thuật toán tăng cường độ dốc chung, không sử dụng thông tin về hàm chi phí, ngoại trừ đạo hàm tại điểm hiện tại. XGBoost là một phần mở rộng cho Gradient Boosting, cố gắng thông minh hơn trong việc phát triển các cây hồi quy yếu bằng cách sử dụng một xấp xỉ chính xác hơn là chỉ độ dốc.
Các cách khác để chọn mô hình tốt nhấthm(x)
Nếu chúng ta xem AdaBoost là trường hợp đặc biệt của việc tăng cường độ dốc, thì nó không chọn các biến hồi quy mà phân loại là những người học yếu. Nếu chúng ta đặt , cách AdaBoost chọn mô hình tốt nhất là bằng cách tìmhm(x)∈{−1,1}
hm=argmaxhm∑i=1Nwihm(xi)
trong đó là phần dư ( nguồn, bắt đầu từ slide 20 ). Lý do cho việc sử dụng hàm mục tiêu này là nếu và đi cùng hướng / có cùng dấu, điểm đang di chuyển sang đúng hướng và bạn đang cố gắng tối đa hóa lượng chuyển động tối đa trong Đúng hướng.wiw i h m ( x i )wihm(xi)
Nhưng một lần nữa, đây không phải là phép đo trực tiếp mà thu nhỏ . Nó đang đo mức độ di chuyển của tốt như thế nào , tương ứng với hướng chung mà bạn nên đi, như được đo với phần dư , cũng là một xấp xỉ. Phần dư cho bạn biết bạn nên di chuyển theo hướng nào bởi dấu hiệu của chúng và khoảng chừng độ lớn của chúng, nhưng chúng không cho bạn biết chính xác nơi bạn nên dừng lại.hmℓ ( ytôi, Hm - 1(xtôi) + hm(xtôi) )hmwtôi
Giảm độ dốc tốt hơn
Ba ví dụ tiếp theo không cần thiết cho lời giải thích và chỉ ở đây để trình bày một số cách để làm tốt hơn so với việc giảm độ dốc vanilla, để hỗ trợ ý tưởng rằng những gì XGBoost làm chỉ là một cách khác để cải thiện độ dốc. Trong cài đặt giảm độ dốc truyền thống, khi cố gắng giảm thiểu , có thể làm tốt hơn là chỉ tuân theo độ dốc. Nhiều phần mở rộng đã được đề xuất (Wikipedia) . Dưới đây là một số trong số chúng, để chỉ ra rằng có thể làm tốt hơn, với thời gian tính toán nhiều hơn hoặc nhiều thuộc tính của hàm .f( x )ff
Tìm kiếm dòng / Quay lui: Trong Gradient Descent, khi độ dốc được tính toán, điểm tiếp theo sẽ là- ∇ f( x( tôi ))
x( i + 1 )=x(i)−∇f(x(i))
Nhưng độ dốc chỉ đưa ra hướng mà người ta nên di chuyển, không thực sự bằng "bao nhiêu", vì vậy một quy trình khác có thể được sử dụng, để tìm ra tốt nhất sao choc>0
x(i+1)c=x(i)−c∇f(x(i))
giảm thiểu chức năng chi phí. Điều này được thực hiện khi đánh giá cho một số và vì hàm nên lồi, nên việc tìm kiếm Line (Wikipedia) hoặc Backtracking Line Search (Wikipedia) tương đối dễ dàng . Ở đây, chi phí chính là đánh giá . Vì vậy, phần mở rộng này hoạt động tốt nhất nếu dễ tính toán. Lưu ý rằng thuật toán chung để tăng cường độ dốc sử dụng tìm kiếm dòng, như thể hiện trong phần đầu câu trả lời của tôi.f(x(i+1)c)cff ( x ) ff(x)f
Phương pháp độ dốc gần nhanh: Nếu chức năng thu nhỏ tối đa lồi mạnh và độ dốc của nó trơn tru ( Lipschitz (Wikipedia) ), thì có một số mẹo sử dụng các thuộc tính này để tăng tốc độ hội tụ.
Stochastic Gradient Descent và phương pháp Động lượng: Trong Stochastic Gradient Descent, bạn không đánh giá độ dốc trên tất cả các điểm, mà chỉ trên một tập hợp con của các điểm đó. Bạn thực hiện một bước, sau đó tính toán độ dốc trên một lô khác và tiếp tục. Stochastic Gradient Descent có thể được sử dụng vì tính toán trên tất cả các điểm rất tốn kém hoặc có thể tất cả những điểm đó thậm chí không vừa với bộ nhớ. Điều này cho phép bạn thực hiện nhiều bước hơn, nhanh hơn, nhưng ít chính xác hơn.
Khi làm như vậy, hướng của gradient có thể thay đổi tùy thuộc vào điểm nào được lấy mẫu. Để chống lại hiệu ứng này, các phương pháp động lượng giữ trung bình di chuyển của hướng cho mỗi chiều, làm giảm phương sai trong mỗi lần di chuyển.
Phần mở rộng có liên quan nhất để giảm độ dốc trong cuộc thảo luận của chúng tôi về XGBoost là phương pháp của Newton (Wikipedia) . Thay vì chỉ tính toán độ dốc và theo nó, nó sử dụng đạo hàm bậc hai để thu thập thêm thông tin về hướng mà nó sẽ đi vào. Nếu chúng ta sử dụng độ dốc gốc, chúng ta có điều đó ở mỗi lần lặp, chúng ta cập nhật điểm như sau,x( tôi )
x( i + 1 )= x( tôi )- ∇ f( x( tôi ))
Và vì độ dốc chỉ ra hướng tăng cao nhất của , điểm âm của nó theo hướng giảm cao nhất và chúng tôi hy vọng rằng . Điều này có thể không giữ được, vì chúng ta có thể đi quá xa theo hướng của gradient (do đó là phần mở rộng tìm kiếm dòng), nhưng đó là một xấp xỉ tốt. Trong phương pháp của Newton, chúng tôi cập nhật như sau,∇ f( x( tôi ))ff( x( i + 1 )) < f( x( tôi ))x( tôi )
x( i + 1 )= x( tôi )- ∇ f( x( tôi ))Hess f( x( tôi ))
Trong đó là Hessian của trong . Bản cập nhật này tính đến thông tin đơn hàng thứ hai, do đó, hướng không còn là hướng giảm cao nhất, mà nên chỉ chính xác hơn về phía sao cho (hoặc điểm mà là tối thiểu, nếu không có 0). Nếu là đa thức bậc hai, thì phương pháp của Newton kết hợp với tìm kiếm dòng sẽ có thể tìm thấy mức tối thiểu trong một bước.Hess f( x )fxx( i + 1 )f( x( i + 1 )) = 0ff
Phương pháp của Newton tương phản với độ dốc dốc Stochastic. Trong Stochastic Gradient Descent, chúng tôi sử dụng ít điểm hơn để mất ít thời gian hơn để tính toán hướng chúng tôi nên đi, để tạo ra nhiều hơn trong số họ, với hy vọng chúng tôi sẽ đến đó nhanh hơn. Theo phương pháp của Newton, chúng tôi mất nhiều thời gian hơn để tính toán hướng đi mà chúng tôi muốn đi, với hy vọng chúng tôi phải thực hiện ít bước hơn để đến đó.
Bây giờ, lý do tại sao phương pháp của Newton hoạt động giống như lý do tại sao phép tính gần đúng XGBoost hoạt động và nó dựa vào sự mở rộng của Taylor (Wikipedia) và định lý của Taylor (Wikipedia) . Bản mở rộng Taylor (hoặc chuỗi Taylor) của hàm tại điểm làf( x + a )
f( X ) + ∂f( x )∂xa + 12∂2f( x )∂x2một2+ ⋯ = ∑n = 0∞1n !∂nf( x )∂xnmộtn.
Lưu ý sự giống nhau giữa biểu thức này và XGBoost gần đúng đang sử dụng. Định lý của Taylor nói rằng nếu bạn dừng việc mở rộng theo thứ tự , thì lỗi hoặc sự khác biệt giữa và , là tại hầu hết các , nơi là một chức năng với các tài sản tốt đẹp mà nó đi để không như đi không.kf( x + a )Σkn = 01n !∂nf( x )∂xnmộtnhk( x ) akhkmột
Nếu bạn muốn một số hình dung về mức độ gần đúng của một số hàm, hãy xem các trang wikipedia, chúng có một số biểu đồ để tính gần đúng hàm không đa thức như , .exđăng nhập( x )
Điều cần lưu ý là phép tính gần đúng hoạt động rất tốt nếu bạn muốn tính giá trị của trong vùng lân cận của , nghĩa là, đối với những thay đổi rất nhỏ . Đây là những gì chúng tôi muốn làm trong Boosting. Tất nhiên chúng tôi muốn tìm cây tạo ra sự thay đổi lớn nhất. Nếu những người học yếu mà chúng tôi xây dựng rất giỏi và muốn tạo ra một thay đổi lớn, thì chúng tôi có thể tùy tiện cản trở nó bằng cách chỉ áp dụng hoặcfxmột0,10,01tác dụng của nó. Đây là kích thước bước hoặc tốc độ học tập của độ dốc. Điều này có thể chấp nhận được, bởi vì nếu những người học yếu của chúng tôi đang nhận được giải pháp rất tốt, điều này có nghĩa là vấn đề đó rất dễ dàng, trong trường hợp đó chúng tôi sẽ kết thúc với một giải pháp tốt, hoặc chúng tôi đang sử dụng quá nhiều, nên sẽ đi một chút hoặc rất nhiều theo hướng xấu này không thay đổi vấn đề tiềm ẩn.
Vậy XGBoost đang làm gì và tại sao nó hoạt động?
XGBoost là một thuật toán Tăng cường Gradient, xây dựng cây hồi quy như những người học yếu. Thuật toán Gradient Boosting truyền thống rất giống với việc giảm độ dốc với tìm kiếm dòng, trong đó hướng đi sẽ được rút ra từ những người học yếu có sẵn. Việc triển khai Gradient Boosting ngây thơ sẽ sử dụng hàm chi phí của người học yếu để phù hợp với phần còn lại. Đây là một proxy để giảm thiểu chi phí của mô hình mới, tốn kém để tính toán. Những gì XGBoost đang làm là xây dựng hàm chi phí tùy chỉnh để phù hợp với cây, sử dụng chuỗi Taylor thứ tự hai như một xấp xỉ cho hàm chi phí thực, để có thể chắc chắn hơn rằng cây mà nó chọn là một cây tốt. Về mặt này, và như một sự đơn giản hóa, XGBoost là để Gradient Boosting phương thức của Newton là Gradient Descent.
Tại sao họ xây dựng nó theo cách đó
Câu hỏi của bạn là tại sao sử dụng xấp xỉ này lại đi đến sự đánh đổi chi phí / hiệu suất. Hàm chi phí này được sử dụng để so sánh các phân chia tiềm năng cho các cây hồi quy, do đó, nếu các điểm của chúng tôi có 50 tính năng, với trung bình 10 giá trị khác nhau, mỗi nút có 500 phân tách tiềm năng, do đó, 500 đánh giá của hàm. Nếu bạn bỏ một tính năng liên tục, số lần phân tách sẽ phát nổ và việc đánh giá phân tách được gọi ngày càng nhiều (XGBoost có một mẹo khác để xử lý các tính năng liên tục, nhưng đó là ngoài phạm vi). Vì thuật toán sẽ dành phần lớn thời gian để đánh giá các phần tách, nên cách để tăng tốc thuật toán là tăng tốc độ đánh giá cây.
Nếu bạn đã đánh giá cây với hàm chi phí đầy đủ, , thì đó là một tính toán mới cho mỗi phân chia mới. Để thực hiện tối ưu hóa tính toán của hàm chi phí, bạn cần có thông tin về hàm chi phí, đó là toàn bộ điểm của Gradient Boosting: Nó nên hoạt động cho mọi hàm chi phí.ℓ
Phép tính gần đúng thứ hai là tốt đẹp về mặt tính toán, bởi vì hầu hết các thuật ngữ đều giống nhau trong một lần lặp nhất định. Đối với một lần lặp nhất định, hầu hết các biểu thức có thể được tính một lần và được sử dụng lại dưới dạng hằng số cho tất cả các phân tách:
L( t )≈ ∑i = 1nℓ ( ytôi, y^( t - 1 )tôi)không thay đổi+ gtôikhông thay đổift( xtôi) + 12htôikhông thay đổif2t( xtôi) + Ω ( ft) ,
Vì vậy, điều duy nhất bạn phải tính toán là và , và sau đó những gì còn lại chủ yếu là bổ sung và một số phép nhân. Hơn nữa, nếu bạn xem bài báo XGBoost (arxiv) , bạn sẽ thấy rằng họ sử dụng thực tế là họ đang xây dựng một cây để đơn giản hóa biểu thức xuống một loạt các chỉ mục, rất nhanh chóng.ft( xtôi)Ω ( ft)
Tóm lược
Bạn có thể xem XGBoost (với xấp xỉ) là một hồi quy từ giải pháp chính xác, một xấp xỉ của "XGBoost thực", với đánh giá chính xác. Nhưng vì việc đánh giá chính xác rất tốn kém, nên một cách khác để thấy là trên các bộ dữ liệu khổng lồ, phép tính gần đúng là tất cả những gì chúng ta có thể làm một cách thực tế, và phép tính gần đúng này chính xác hơn so với thuật toán tăng cường độ dốc "ngây thơ" sẽ làm .
Phép tính gần đúng được sử dụng tương tự như Phương pháp của Newton và được chứng minh bởi Taylor Series (Wikipedia) và Định lý Taylor (Wikipedia) .
Thông tin thứ tự cao hơn thực sự không được sử dụng hoàn toàn, nhưng nó không cần thiết, bởi vì chúng tôi muốn có một xấp xỉ tốt trong vùng lân cận của điểm xuất phát của chúng tôi .
Để trực quan hóa, hãy kiểm tra trang Wikipedia của Định lý Taylor Series / Định lý Taylor hoặc Khan Academy về xấp xỉ Sê-ri Taylor hoặc trang MathDemo về xấp xỉ đa thức của đa thức