Stokastik degrade iniş, standart degrade inişe kıyasla zamandan nasıl tasarruf edebilir?


16

Standart Degrade İniş, tüm eğitim veri kümesi için degradeyi hesaplar.

for i in range(nb_epochs):
  params_grad = evaluate_gradient(loss_function, data, params)
  params = params - learning_rate * params_grad

Önceden tanımlanmış bir dönem sayısı için, ilk olarak parametre vektör parametrelerimizle tüm veri kümesi için kayıp fonksiyonunun gradient vektörü ağırlıkları_gradını hesaplıyoruz.

Stokastik Degrade İniş, buna karşılık her bir eğitim örneği x (i) ve etiket y (i) için bir parametre güncellemesi gerçekleştirir.

for i in range(nb_epochs):
  np.random.shuffle(data)
  for example in data:
    params_grad = evaluate_gradient(loss_function, example, params)
    params = params - learning_rate * params_grad

SGD'nin çok daha hızlı olduğu söyleniyor. Ancak, hala tüm veri noktaları üzerinde bir döngü varsa nasıl çok daha hızlı olabileceğini anlamıyorum. GD'deki degradenin hesaplanması, her veri noktası için ayrı ayrı GD'nin hesaplanmasından çok daha yavaş mı?

Kod buradan geliyor .


1
İkinci durumda, tüm veri kümesini yaklaşık olarak tahmin etmek için küçük bir grup alırsınız. Bu genellikle oldukça iyi çalışır. Bu yüzden kafa karıştırıcı kısım muhtemelen her iki durumda da dönem sayısının aynı olduğu, ancak 2. durumda çok fazla döneme ihtiyaç duymayacağınızdır. "Hiperparametreler" bu iki yöntem için farklı olacaktır: GD nb_epochs! = SGD nb_epochs. Argümanın amacı için diyelim: GD nb_epochs = SGD örnekleri * nb_epochs, böylece toplam döngü sayısı aynıdır, ancak eğimin hesaplanması SGD'de çok daha hızlıdır.
Nima Mousavi

Özgeçmiş üzerine bu cevap iyi ve ilgili bir cevaptır .
Zhubarb

Yanıtlar:


24

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(θ)=12mΣben=1m(hθ(x(ben))-y(ben))2

ve degrade

dJ(θ)dθ=1mΣben=1m(hθ(x(ben))-y(ben))x(ben)

degrade düzgün (GD) için parametreyi

θnew=θÖld-α1mΣben=1m(hθ(x(ben))-y(ben))x(ben)

1/mx(ben),y(ben)

θnew=θÖld-α(hθ(x(ben))-y(ben))x(ben)

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.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

1000sq_loss_gr_approx3001000


Ben "hız" argümanı daha yerel bir optimum yakınsama için kaç işlem / yineleme gerekli hakkında olduğunu düşündüm? (Ve ayrıca bu stokastik gradyan inişi daha iyi
optima'ya

Anladığım kadarıyla, python kodunda "veri" değişkeninin aynı olduğunu sağladım. Mini toplu degrade düzgün kod SDG'den farklıdır (ve tam olarak orada verilerin sadece küçük bir kısmını kullanır). Ayrıca, verdiğiniz açıklamada, SDG'deki toplamdan kurtulmamıza rağmen, yine de her veri noktası için güncellemeyi hesaplıyoruz. Her veri noktasında döngü yaparken bir parametreyi güncellemenin aynı anda tüm veri noktaları üzerinde bir toplamı almaktan daha hızlı olduğunu hala anlamıyorum.
Alina

@ GeoMatt22 Sağladığım bağlantıda şöyle diyor: "Öte yandan, SGD aşmaya devam edeceği için bu sonuçta yakınsama tam olarak en aza indirgeniyor." Yani daha iyi optima ile birleşmez. Yoksa yanlış mı anladım?
Alina

@Tonja Uzman değilim, ancak derin öğrenmedeki bu son derece etkili makale, stokastik gradyanlı iniş için "daha hızlı ve daha güvenilir eğitim" argümanı veriyor. "Raw" sürümünü kullanmadığını, ancak (koordinat bağımlı) öğrenme hızını ayarlamak için çeşitli eğrilik tahminlerini kullandığını unutmayın.
GeoMatt22

1
@Tonja, evet. eğimin herhangi bir "zayıf" yaklaşımı işe yarayacaktır. Benzer bir fikir olan "gradyan artırma" yı kontrol edebilirsiniz. Öte yandan, fikri tanıtmak için bazı kodlar yazıyorum. Hazır olduğunda göndereceğim.
Haitao Du
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.