Kısa cevap:
- Birçok büyük veri ayarında (milyonlarca veri noktası diyelim), maliyet veya eğimin hesaplanması çok uzun zaman alır, çünkü tüm veri noktalarını toplamamız gerekir.
- Belirli bir yinelemede maliyeti düşürmek için kesin bir eğime sahip olmamız GEREKMEZ . Bazı degrade yaklaşımları işe yarayacaktır.
- Stokastik degrade düzgün (SGD), yalnızca bir veri noktası kullanarak degradeye yaklaşır. Böylece, gradyanı değerlendirmek tüm verilerin toplanmasıyla karşılaştırıldığında çok zaman kazandırır.
- "Makul" iterasyon sayısı ile (bu sayı binlerce olabilir ve milyonlarca veri noktası sayısından çok daha az olabilir), stokastik gradyan insana yakışır bir iyi çözüm elde edebilir.
Uzun cevap:
Benim gösterimim Andrew NG'in makine öğrenimi Coursera kursunu takip ediyor. Buna aşina değilseniz, burada ders serilerini inceleyebilirsiniz .
Kare kayıpta gerileme olduğunu varsayalım, maliyet fonksiyonu
J( θ ) = 12 mΣi = 1m( sθ( x( i )) - y( i ))2
ve degrade
dJ( θ )dθ= 1mΣi = 1m( sθ( x( i )) - y( i )) x( i )
degrade düzgün (GD) için parametreyi
θn e w= θo l d- α 1mΣi = 1m( sθ( x( i )) - y( i )) x( i )
1 / mx( i ), y( i )
θn e w= θo l d- α ⋅ ( sθ( x( i )) - y( i )) x( i )
Zamandan tasarruf etmemizin nedeni budur:
Diyelim ki 1 milyar veri noktamız var.
GD'de, parametreleri bir kez güncellemek için, (kesin) degradeye sahip olmamız gerekir. Bu, 1 güncelleme gerçekleştirmek için bu 1 milyar veri noktasının toplanmasını gerektirir.
SGD'de bunu tam degrade yerine yaklaşık bir degrade elde etmeye çalışmak olarak düşünebiliriz . Yaklaşıklık bir veri noktasından (veya mini toplu iş adı verilen birkaç veri noktasından) gelir. Bu nedenle, SGD'de parametreleri çok hızlı bir şekilde güncelleyebiliriz. Buna ek olarak, tüm veriler üzerinde "döngü" yaparsak (bir çağ denir), aslında 1 milyar güncellememiz var.
İşin püf noktası, SGD'de 1 milyar yinelemeye / güncellemeye sahip olmanıza gerek yok, ancak 1 milyon gibi çok daha az yineleme / güncellemeye ihtiyacınız var ve kullanmak için "yeterince iyi" modeliniz olacak.
Fikri tanıtmak için bir kod yazıyorum. İlk önce lineer sistemi normal denklemle çözdükten sonra SGD ile çözdük. Sonra sonuçları parametre değerleri ve nihai objektif fonksiyon değerleri açısından karşılaştırıyoruz. Daha sonra görselleştirmek için ayarlamak için 2 parametremiz olacak.
set.seed(0);n_data=1e3;n_feature=2;
A=matrix(runif(n_data*n_feature),ncol=n_feature)
b=runif(n_data)
res1=solve(t(A) %*% A, t(A) %*% b)
sq_loss<-function(A,b,x){
e=A %*% x -b
v=crossprod(e)
return(v[1])
}
sq_loss_gr_approx<-function(A,b,x){
# note, in GD, we need to sum over all data
# here i is just one random index sample
i=sample(1:n_data, 1)
gr=2*(crossprod(A[i,],x)-b[i])*A[i,]
return(gr)
}
x=runif(n_feature)
alpha=0.01
N_iter=300
loss=rep(0,N_iter)
for (i in 1:N_iter){
x=x-alpha*sq_loss_gr_approx(A,b,x)
loss[i]=sq_loss(A,b,x)
}
Sonuçlar:
as.vector(res1)
[1] 0.4368427 0.3991028
x
[1] 0.3580121 0.4782659
124.1343123.0355
İşte iterasyonlar üzerindeki maliyet fonksiyonu değerleri, kaybı etkili bir şekilde azaltabildiğini görebiliriz, bu da fikri gösterir: degradeye yaklaşmak ve "yeterince iyi" sonuçlar elde etmek için bir veri alt kümesi kullanabiliriz.
1000sq_loss_gr_approx
3001000