Keras'taki batch_size, sonuçların kalitesini etkiliyor mu?


38

2-3 milyon makale içeren büyük bir LSTM ağı eğitmek üzereyim ve Bellek Hatalarıyla mücadele ediyorum (AWS EC2 g2x2large kullanıyorum).

Bir çözümün bunu azaltmak olduğunu öğrendim batch_size. Ancak, bu parametrenin yalnızca bellek verimliliği sorunlarıyla mı ilgili olduğunu veya sonuçlarımı etkileyip etkilemediğinden emin değilim. Nitekim, batch_sizeörneklerde kullanılanın ikisinin de gücü olduğunu, anlamadığım da olduğunu gördüm.

Ağımın eğitilmesi daha uzun sürerse umrumda değil, ancak batch_sizeazalan tahminlerimin kalitesini düşürüp düşürmeyeceğini bilmek istiyorum.

Teşekkürler.


Bu soru, keraslara özgü değildir. Sanırım genel itiraz, daha küçük örneklem boyutlarının daha yavaş birleştiğine, ancak yerel minimumda sıkışıp kalmaya daha az eğilimli olduğunu düşünüyorum
Alex

Çok büyük bir parti büyüklüğünün aynı sayıda eğitim çağında bile yakınsamayı önleyebileceği durumlar gördüm.
Curtis White,

Yanıtlar:


43

Bir buçuk yıl sonra, cevabıma geri döndüm, çünkü önceki cevabım yanlıştı.

Parti büyüklüğü öğrenmeyi önemli ölçüde etkiler. Ağınız üzerinden bir toplu iş başlattığınızda gerçekleşen şey, gradyanları ortalamalandırmanızdır. Konsept, eğer parti büyüklüğünüz yeterince büyükse, bu tam veri kümesinin gradyanının ne olacağı konusunda yeterince kararlı bir tahmin sağlayacaktır. Veri kümenizden örnekler alarak, hesaplama maliyetini önemli ölçüde düşürürken gradyanı tahmin edersiniz. Ne kadar düşük olursa, tahmininiz o kadar az doğru olacaktır, ancak bazı durumlarda bu gürültülü degradeler gerçekte yerel minimum noktalardan kurtulmaya yardımcı olabilir. Çok düşük olduğunda, verilerinizin gürültülü olması durumunda ağ ağırlıklarınız sadece atlayabilir ve öğrenemiyor olabilir veya çok yavaş bir şekilde birleşiyorsa, bu da toplam hesaplama süresini olumsuz olarak etkiler.

Gruplamanın başka bir avantajı da GPU hesaplaması için GPU'lar, eğer hesaplamanın bir kısmı aynıysa (örneğin, ağınızın aynı ağırlık matrisi üzerinde tekrarlanan matris çarpımı) sinir ağlarında gerçekleşen hesaplamaları paralel hale getirmede çok iyidir. Bu, 16 büyüklüğündeki parti büyüklüğünün 8 büyüklüğündeki parti büyüklüğünün iki katından daha az alacağı anlamına gelir.

Daha büyük parti boyutlarına ihtiyaç duymanız durumunda ancak GPU'nuza sığmayacaksa, küçük bir parti besleyebilir, degrade tahminlerini kaydedebilir ve bir veya daha fazla partiyi besleyebilir ve ardından bir ağırlık güncellemesi yapabilirsiniz. Bu yolla daha kararlı bir gradyan elde edersiniz, çünkü sanal parti boyutunuzu arttırırsınız.

YANLIŞ, ESKİ CEVAP: [[[Hayır, toplu iş boyutu, ortalama olarak öğrenmenin hızını etkiler, öğrenme kalitesini etkiler. Toplu işlerin de 2 gücüne sahip olmaları gerekmez, ancak bazı paketlerin yalnızca 2 güçlerine izin verdiğini anlıyorum, ancak mümkün olan en yüksek hızı elde etmek için toplu iş_ boyutunuzu GPU'nuzun hafızasına uyan en yüksek seviyeye getirmeye çalışmalısınız .]]]]


32 tane alamıyorum ama 16 tane alabiliyorum. Ancak bunun çok yavaş olduğunu fark ettim. Sence 16-32 arasında bir değer mi denemeli yoksa 16 ile yapışmalı mıyım?
hipoglucido

Bazı değerleri dener ve zamanlarım. Her çağ aynı saatte olmalı, bu yüzden çok uzun sürmeyecek. Daha hızlı mı yoksa yavaş mı olduğunu görmek için ilk önce 17'yi deneyin, çünkü bu gücün GPU'ya ve / veya Keras'ın arka ucuna bağlı olduğu düşünülürse, bununla ilgileniyorum. Ama bence sadece ağzına kadar doldurmak en iyisi
Jan van der Vegt

9
Parti büyüklüğünün öğrenme kalitesini etkilemediğinden emin misiniz? Daha küçük partilerin daha büyük partilere göre daha gürültülü gradyanlar ürettiklerini söyledikleri bazı blogları / kağıtları (?) Okuduğumu hatırlıyorum, ancak yerel asgari notlardan kurtulmak için gürültü yararlı olabilir. Ancak bunun LSTM'ler için geçerli olup olmadığından emin değilim.
stmax,

Tamamen ikna olmadım, kendimi yeterince deneyimlemedim ama okudum. Degradelerin daha az stabil olduğunu görebiliyorum, bu yüzden kapalı olabilirim.
Jan van der Vegt,

2
Bir buçuk yıl sonra ve şimdi çok daha fazla bilgili ve aynı fikirdeyim. Cevabımı değiştireceğim
Jan van der Vegt 13:17

11

Kabul edilen cevabın muhtemelen yanlış olduğunu düşünüyorum. Degrade İniş Algoritmalarında değişkenler vardır .

  1. Vanilya Degrade İnişi : Burada Degrade, tek bir çekimdeki tüm veri noktalarında hesaplanır ve ortalama alınır. Bu nedenle degradenin daha yumuşak bir sürümüne sahip olmamız öğrenmek daha uzun sürüyor.

  2. Stokastik Gradyan İnişi : Burada bir veri noktası bir anda bu yüzden degrade agresifdir (gürültülü gradyanlar) dolayısıyla çok fazla salınım olacaktır (Momentum parametrelerini kullanırız - örneğin bunu kontrol etmek için Nesterov). Bu nedenle salınımlarınızın algoritmayı yerel asgari seviyeye ulaşmamasına neden olma ihtimali vardır (ayrışma).

  3. Mini-Toplu Degrade İnişi : Küçük bir partinin degradelerinin ortalamalarını alır. Dolayısıyla SGD gibi fazla agresif değildir ve Vanilla GD'nin asla izin vermediği Çevrimiçi Öğrenmeye izin verir.

Mini-Batch ne kadar küçük olursa, modelinizin performansı o kadar iyi olur (her zaman değil) ve tabii ki dönemlerinizle çok daha hızlı bir şekilde öğrenmek zorunda kalması gerekirdi. Büyük veri kümeleri hakkında eğitim alıyorsanız, iyi performansla daha hızlı yakınsama yapmak istersiniz, bu nedenle Batch-GD'leri seçiyoruz.

SGD sabit bir öğrenme parametresine sahipti; bu nedenle, Gradients tarihine göre öğrenme parametresini değiştiren Adam, AdaDelta, RMS Prop vb.


3) genellikle minibatch denir
Alex

@Alex: değişikliği ekledi.
Jil Jung Juk

1
Toplu iş boyutu parametresiyle ilgili bir kural olmadığını kabul ediyorum. Ancak bu açıklama - "Mini-Toplu iş ne kadar küçükse modelinizin performansı o kadar iyi olur" - genel kurallara aykırıdır. Genellikle toplu iş boyutunu en üst düzeye çıkarmak istersiniz
MonsieurBeilto

4

İşin tuhafı, daha büyük yığın büyüklüğüne sahip olan keranların birleşmek için daha fazla çağ gerektirdiğini gördüm.

Örneğin, çıkış bu senaryo keras' dayalı entegrasyon testi olduğunu

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

İlgili

Çok büyük bir toplu iş boyutu kullanmak, eğitim sırasında ağınızın doğruluğunu olumsuz etkileyebilir, çünkü bu, degrade inişinin stokastiğini azaltır.

Düzenleme: çoğu zaman, artan batch_size, hesaplamayı hızlandırmak istenir, ancak bunu yapmanın daha basit yolları vardır, örneğin daha küçük bir yer kaplayan veri türlerini dtypeargüman yoluyla , örneğin keras veya tensorflow gibi float32kullanmak gibifloat64


Daha büyük serilerle (ve bu nedenle çağ başına daha az), çağ başına daha az gradyan güncellemesine sahip olacaksınız. "epoch" sadece "antrenman sırasında verilerinizden geçmeniz" için ML jargonudur. Eğitimi hızlandırmaya çalışıyorsanız, duvar saatini ölçün ve dönemleri görmezden gelin.
Andrew Wagner
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.