Bu çok ilginç bir soru. Neler olup bittiğini tam olarak anlamak için, XGBoost'un ne yapmaya çalıştığını ve araç kutumuzda bununla başa çıkmak için başka hangi yöntemleri uygulamam gerektiğine bakmak zorunda kaldım. Cevabım geleneksel yöntemlere ve XGBoost'un nasıl / niçin bir gelişme olduğuna değiniyor. Eğer sadece mermi noktaları istiyorsanız, sonunda bir özet var.
Geleneksel Gradyan Artırma
Geleneksel Gradyan Artırma Algoritmasını düşünün (Wikipedia) :
- H0
- m←1:M
- rim=−∂ℓ(yi,Hm−1(xi))∂Hm−1(xi)
- hm(x)
- γγ=argminγ∑Ni=1ℓ(yi,Hm−1(xi)+γhm(xi))
- modelini güncelleyin .Hm(x)=Hm−1(x)+γhm(x)
- modelinizi .HM(x)
Fonksiyon yaklaşımı aşağıdaki kısım için önemlidir.
bir taban öğrenicisi yerleştirin.hm(x)
Gradient Boost Algoritmasını saf olarak nerede inşa edeceğinizi hayal edin. Var olan regresyon ağaçlarını zayıf öğrenenler olarak kullanarak yukarıdaki algoritmayı kurarsınız. Zayıf öğrencilerin var olan uygulamalarını değiştirmeme hakkınız olmadığını varsayalım. In Matlab varsayılan bölünmüş kriter ortalama karesel hata olduğunu. Aynı bilim seti öğrenmek için de geçerli .
Maliyeti en aza indiren en iyi modelini bulmaya çalışıyorsunuz . Ancak bunu yapmak için, MSE'yi nesnel işlev olarak kullanan artıklara basit bir regresyon modeli uyguluyorsunuz. İstediğinizi doğrudan küçültmediğiniz, ancak artıkları ve MSE'yi bir proxy olarak kullandığınıza dikkat edin. Kötü yanı, mutlaka en uygun çözümü vermemesidir. İyi yanı, işe yaraması.hm(x)ℓ(yi,Hm−1(xi)+hm(xi))
Geleneksel Degrade İniş
Bu, her adımda işlevinin gradyanını izleyerek maliyet işlevini en aza indirmeye çalıştığınız geleneksel Gradient İnişine (Wikipedia) benzer .f(x)−∇f(x)
x(i+1)=x(i)−∇f(x(i))
Bir adımdan sonra asgari değeri bulmanıza izin vermez, ancak her adım sizi asgari seviyeye yaklaştırır (işlev dışbükey ise). Bu bir yaklaşımdır, ancak çok iyi çalışır ve örneğin lojistik bir regresyon yapmak için geleneksel olarak kullandığımız algoritmadır.
interlüd
Bu noktada, anlaşılması gereken şey, genel gradyan artırılması algoritması maliyet fonksiyonunu hesaplamak olmamasıdır o artığı sığdırmak için regresyon zayıf öğrenen maliyeti işlevini kullanır, her olası bölünme için.ℓ
Sorunuz, "gerçek XGBoost" un her bölmenin maliyet işlevini hesaplaması gerektiği ve "yaklaşık XGBoost" un yaklaşık değerlerini bulmak için bir sezgisel kullandığı anlamına geliyor. Bunu bu şekilde görebilirsiniz, ancak tarihsel olarak, geçerli noktadaki türev dışında, maliyet işlevi hakkında bilgi kullanmayan genel gradyan artırma algoritmasına sahibiz. XGBoost, gradyandan daha doğru bir yaklaşım kullanarak zayıf regresyon ağaçlarını büyütme konusunda daha akıllı olmaya çalışan Gradient Boost'un bir uzantısıdır.
En iyi modeli diğer yollarıhm(x)
AdaBoost'a özel gradyan artırma durumu olarak bakarsak, regresörleri seçmez, zayıf öğreniciler olarak sınıflandırır. Eğer ayarladıysak, en iyi modeli seçme şekli bulmaktır.hm(x)∈{−1,1}
hm=argmaxhm∑i=1Nwihm(xi)
burada artıklar ( kaynak, slayt 20'de başlar ). Bu amaç fonksiyonunun kullanılmasının nedeni, eğer ve aynı yöne giderse / aynı işarete , noktanın doğru yöne doğru hareket etmesi ve maksimum hareket miktarını maksimize etmeye çalışıyor olmasıdır. doğru yönwiwihm(xi)
Fakat bir kez daha, bu doğrudan en aza ölçüm değildir . hareketinin ne kadar iyi olduğunu ölçmek , gitmeniz gereken genel yöne göre , aynı zamanda bir yaklaşım olan artıklarıyla ölçülen şekilde . Artıklar size işareti ile hangi yöne hareket etmelisiniz ve kabaca büyüklüklerine göre kabaca, ama tam olarak nerede durmanız gerektiğini söylemiyorlar.hmℓ(yi,Hm−1(xi)+hm(xi))hmwi
Daha İyi Degrade İniş
Sonraki üç örnek açıklama için gerekli değildir ve sadece bir vanilya gradyanı inişinden daha iyi yapmanın bazı yollarını sunmak, XGBoost'un yaptığı şeyin degrade inişini iyileştirmenin başka bir yolu olduğu fikrini desteklemek için buradayız. Geleneksel bir gradyan iniş ayarında, seviyesini en aza indirmeye çalışırken , sadece gradyanı izlemekten daha iyisini yapmak mümkündür. Birçok uzantı önerildi (Wikipedia) . İşte bunlardan bazıları, daha fazla hesaplama süresi veya daha fazla özelliği göz önüne alındığında, daha iyisini yapmanın mümkün olduğunu göstermek için .f(x)f
Çizgi arama / Geri izleme: Degrade İnişinde, degradesi hesaplandıktan sonra, bir sonraki nokta olmalıdır.−∇f(x(i))
x(i+1)=x(i)−∇f(x(i))
Ancak gradyan, yalnızca birinin "ne kadar" olduğundan değil, hareket etmesi gereken yönü verir, böylece en iyi değerini bulmak için başka bir prosedür kullanılabilir .c>0
x(i+1)c=x(i)−c∇f(x(i))
Maliyet fonksiyonunu en aza indirir. Bu değerlendirmede be yapılır bazıları için fonksiyonu beri ve dışbükey olmalı, bu nispeten kolay aracılığıyla yapmaktır Hat Arama (Vikipedi) veya Geri İzleme Hattı Arama (Wikipedia) . Burada ana maliyet değerlendirmesidir . Bu yüzden, hesaplanması kolaysa, bu uzantı en iyi şekilde çalışır . Degrade yükseltme için genel algoritmanın cevabımın başında gösterildiği gibi satır araması kullandığını unutmayın.f(x(i+1)c)cff(x)f
Hızlı proksimal gradyan yöntemi: En aza indirgeme işlevi kuvvetli bir şekilde dışbükey ise ve gradyanı pürüzsüzse ( Lipschitz (Wikipedia) ), o zaman yakınsaklığı hızlandıran özellikleri kullanan bir numara vardır.
Stokastik Degrade İniş ve Momentum yöntemi: Stokastik Degrade İniş'te, gradyanı tüm noktalarda değerlendirmezsiniz, ancak yalnızca bu noktaların bir alt kümesinde değerlendirirsiniz. Bir adım atar, sonra gradyanı başka bir toplu işlemde hesaplar ve devam edin. Stokastik Degrade İnişi kullanılabilir, çünkü tüm noktalardaki hesaplamalar çok pahalıdır, ya da belki bütün bu noktalar hafızaya bile sığmaz. Bu, daha hızlı, ancak daha az doğru şekilde daha fazla adım atmanıza olanak sağlar.
Bunu yaparken degradenin yönü, hangi noktaların örneklendiğine bağlı olarak değişebilir. Bu etkiyle başa çıkmak için, momentum yöntemleri her bir boyut için yönün hareketli ortalamasını koruyarak her hareketteki farkı azaltır.
XGBoost tartışmamızdaki gradyan inişine en uygun uzantı Newton'un yöntemidir (Wikipedia) . Sadece gradyanı hesaplamak ve onu takip etmek yerine, gitmesi gereken yön hakkında daha fazla bilgi toplamak için ikinci derece türevini kullanır. Degrade iniş kullanırsak, her yinelemede bunu yaparız, noktamızı aşağıdaki şekilde güncelleriz,x(i)
x(i+1)=x(i)−∇f(x(i))
Ve bu yana gradyan en yüksek artış yönünde işaret , en yüksek azalma yönünde olumsuz noktaları ve umut . Degrade yönünde çok ileri gidebileceğimiz için bu durum geçerli olmayabilir (bu nedenle, satır arama uzantısı), ancak bu iyi bir yaklaşımdır. Newton'un yönteminde, aşağıdaki gibi güncelleriz ,∇f(x(i))ff(x(i+1))<f(x(i))x(i)
x(i+1)=x(i)−∇f(x(i))Hessf(x(i))
Burada Hessian olan içinde . Bu güncelleştirme yönü artık en yüksek düşüş yönü yani, hesap ikinci sipariş bilgileri içine alır, ancak daha kesin işaret etmelidir doğru , öyle ki (veya sıfır olmadığında minimum olduğu nokta ). Eğer sonra ikinci bir polinom, bir çizgi arama ile birleştiğinde Newton yöntemi tek adımda minimum bulmak mümkün olmalıdır.Hessf(x)fxx(i+1)f(x(i+1))=0ff
Newton'un yöntemi, Stokastik gradyan inişiyle tezat oluşturuyor. Stokastik Gradyan İnişinde, daha hızlı bir şekilde oraya gitme umuduyla daha fazla yol almak için gitmemiz gereken yönü hesaplamak için daha az zaman harcarız. Newton'un yönteminde, gitmek istediğimiz yönü hesaplamak için daha fazla zaman harcıyoruz, umarım oraya ulaşmak için daha az adım atmamız gerekir.
Şimdi, Newton'un yönteminin çalışmasının nedeni, XGBoost yaklaşımının neden çalıştığıyla aynıdır ve Taylor'un genişlemesine (Wikipedia) ve Taylor teoremine (Wikipedia) dayanır . Bir noktasında bir fonksiyonun Taylor genleşme (veya Taylor serisi) birf(x+a)
f(x)+∂f(x)∂xa+12∂2f(x)∂x2a2+⋯=∑n=0∞1n!∂nf(x)∂xnan.
Bu ifade ile XGBoost'un kullandığı yaklaşık değer arasındaki benzerliğe dikkat edin. Taylor Teoremi, genişleme sırasını durdurursanız , o zaman hatayı veya ve arasındaki farkı belirtir. , en fazla olduğu , gibi sıfıra gider güzel bir özelliği ile bir fonksiyonu olan sıfıra gider.kf(x+a)∑kn=01n!∂nf(x)∂xnanhk(x)akhka
Bazı fonksiyonların ne kadar iyi olduğuna dair görselleştirme istiyorsanız, wikipedia sayfalarına bir göz atın, , gibi polinom olmayan fonksiyonların yaklaşıklığı için bazı grafikleri vardır .exlog(x)
Nota şey yaklaşımı çok iyi sen değerini hesaplamak istiyorsanız çalışmasıdır yakınında çok küçük değişiklikler için vardır, . Yükseltme'de yapmak istediğimiz şey bu. Elbette en büyük değişikliği yapan ağacı bulmak istiyoruz. Eğer inşa ettiğimiz zayıf öğrenciler çok iyiyse ve çok büyük bir değişiklik yapmak istiyorlarsa, yalnızca veya uygulayarak keyfi olarak engelleyebilirizfxa0.10.01etkisi. Bu, gradyan inişinin adım büyüklüğü veya öğrenme oranıdır. Bu kabul edilebilir, çünkü eğer zayıf öğrenicilerimiz çok iyi çözümler alıyorlarsa, bu ya problemin kolay olduğu anlamına gelir, bu durumda yine de iyi bir çözümle sonuçlanacağız ya da biraz fazla ya da çok Bu kötü yönde çok temel sorunu değiştirmez.
Peki XGBoost ne yapıyor ve neden çalışıyor?
XGBoost, regresyon ağaçlarını zayıf öğrenenler olarak inşa eden bir Gradyan Artırma algoritmasıdır. Geleneksel Gradyan Artırma algoritması, gidilecek yönün mevcut zayıf öğrenicilerden çekildiği bir çizgi arama ile bir degrade inişine çok benzer. Gradient Boost'un naif uygulaması, zayıf öğrencinin maliyet fonksiyonunu artıklara sığdırmak için kullanır. Bu hesaplanması pahalı olan yeni modelin maliyetini en aza indiren bir vekil. XGBoost'un yaptığı şey, gerçek sipariş fonksiyonuna bir yaklaşım olarak Taylor iki numaralı seriyi kullanarak, aldığı ağacın iyi olduğundan daha emin olacağı şekilde, ağaçlara uyacak özel bir maliyet işlevi oluşturmaktır. Bu bağlamda ve bir basitleştirme olarak, XGBoost, Newton'un Yönteminin Degrade İnişe Kadar Olduğunu Degrade Etmektir.
Neden böyle inşa ettiler?
Bu yaklaşımın neden kullanıldığına dair sorunuz bir maliyet / performans değişiminin olması. Bu maliyet fonksiyonu, regresyon ağaçlarının potansiyel bölünmelerini karşılaştırmak için kullanılır, eğer puanlarımız ortalama 10 farklı değerle 50 özelliğe sahipse, her düğümde 500 potansiyel bölme vardır, bu yüzden işlevin 500 değerlendirmesi. Sürekli bir özelliği düşürürseniz, bölmelerin sayısı artar ve bölünmenin değerlendirmesine gittikçe daha fazla şey denir (XGBoost'un sürekli özelliklerle başa çıkmak için başka bir numarası vardır, ancak bu kapsam dışındadır). Algoritma zamanının çoğunu bölmeleri değerlendirerek geçireceğinden, algoritmayı hızlandırmanın yolu ağaç değerlendirmesini hızlandırmaktır.
Ağacı tam maliyet işleviyle değerlendirdiyseniz, , her yeni bölme için yeni bir hesaplamadır. Maliyet fonksiyonunun hesabında optimizasyon yapmak için, Gradyan Arttırmanın esas noktası olan maliyet fonksiyonu hakkında bilgi sahibi olmanız gerekir: Her maliyet fonksiyonu için çalışması gerekir.ℓ
İkinci mertebeden yaklaşım hesaplamalı olarak iyidir, çünkü çoğu terimler verilen bir yinelemede aynıdır. Belirli bir yineleme için ifadenin çoğu bir kez hesaplanabilir ve tüm bölmeler için sabit olarak yeniden kullanılabilir:
L(t)≈∑i=1nℓ(yi,y^(t−1)i)constant+giconstantft(xi)+12hiconstantf2t(xi)+Ω(ft),
Yani hesaplamanız gereken tek şey ve , ve sonra kalan şey çoğunlukla eklemeler ve bazı çarpımlar. Dahası, eğer XGBoost kağıdına (arxiv) bakarsanız, ifadeyi daha kolay hale getirmek için bir ağaç dizini oluşturduklarını, çok, çok hızlı olan bir miktar indeks toplamına kadar kullandıklarını göreceksiniz.ft(xi)Ω(ft)
özet
XGBoost'u (yaklaşık olarak) kesin çözümden bir gerileme, "gerçek XGBoost" un yaklaşık bir değerlendirmesini, kesin bir değerlendirme ile görebilirsiniz. Ancak kesin değerlendirme çok maliyetli olduğu için, başka bir büyük veri setinde, yaklaşımın gerçekçi olarak yapabileceğimiz tek şey olduğunu ve bu yaklaşımın birinci dereceli yaklaşımdan daha kesin ve “naif” bir gradyan artırma algoritmasının yapacağı şekilde olduğunu söyleyebiliriz. .
Kullanımdaki yaklaşım Newton'un Yöntemine benzer ve Taylor Series (Wikipedia) ve Taylor Theorem (Wikipedia) tarafından haklı .
Yüksek dereceli bilgiler gerçekten tam olarak kullanılmamaktadır, ancak gerekli değildir, çünkü başlangıç noktamızın yakınında iyi bir yaklaşım istiyoruz .
Görselleştirme için, Taylor Serisi / Taylor Teoremi'nin Vikipedi sayfasını veya Taylor Serisi yaklaşımı üzerine Khan Academy'yi veya polinom olmayanların polinomu yaklaşımıyla ilgili MathDemo sayfasını kontrol edin.