Aracılığıyla paylaş


CNTK'da epoch_size, minibatch_size_in_samples ve MinibatchSource.next_minibatch yorumlama

Bu makalede Python'da aşağıdaki parametrelerin ve işlevlerin yorumlanmasını ve kullanımını netleştireceğiz:

epoch_size

Her dönemdeki etiket örneklerinin sayısı (dinamik eksen boyunca tensörler). epoch_size in CNTK, daha sonra belirli ek eylemlerin gerçekleştirildiği etiket örneklerinin sayısıdır.

  • denetim noktası modelini kaydetme (eğitim buradan yeniden başlatılabilir)
  • çapraz doğrulama
  • öğrenme hızı denetimi
  • minibatch ölçeklendirme

Etiket örneklerinin sayısının tanımının , minibatch_size_in_samples için kullanılan örnek sayısına benzer olduğunu unutmayın. öğesinin epoch_size tanımı, giriş örnekleri değil etiket örnekleri olan tanımından minibatch_size_in_samplesepoch_size farklıdır.

Bu nedenle, daha da önemlisi, sıralı veriler için örnek, bir dizinin tek bir öğesidir. Bu nedenle, CNTK'lerepoch_size bir diziye değil, minibatch'i oluşturan sıra etiketlerindeki sıra öğelerinin sayısına başvurur.

Aynı derecede önemlidir, epoch_size giriş örneklerini değil etiket örneklerini ifade eder ve dizi başına etiket sayısı mutlaka giriş örneği sayısı değildir. Örneğin, dizi başına bir etikete sahip olmak ve her dizi için birçok örneğin (bu durumda epoch_size dizi sayısı gibi davranır) olması mümkündür ve bir dizide örnek başına bir etiket olması mümkündür ve bu durumda epoch_size her örnek (dizi değil) sayıldığında olduğu gibi minibatch_size_in_samples davranır.

Daha küçük veri kümesi boyutları epoch_size için genellikle veri kümesi boyutuna eşit olarak ayarlanır. Python'da bunun için belirtebilirsiniz cntk.io.INFINITELY_REPEAT . Yalnızca Python'da bunu cntk.io.FULL_DATA_SWEEPolarak da ayarlayabilirsiniz. Burada tüm veri boyutu bir kez geçtikten sonra işleme durdurulacaktır.

Büyük veri kümelerinde, denetim noktası oluşturma yoluyla seçiminize epoch_size yol göstermek isteyebilirsiniz. Örneğin, güç kesintisi veya ağ arızası durumunda en fazla 30 dakikalık hesaplamayı kaybetmek istiyorsanız, yaklaşık 30 dakikada bir bir denetim noktası oluşturulmasını (eğitimin sürdürülebileceği) isteyebilirsiniz. İşlemin tamamlanması yaklaşık 30 dakika süren örnek sayısını seçin epoch_size .

minibatch_size_in_samples

Not: BrainScript kullanıcıları için minibatch boyutu parametresi; minibatchSizePython kullanıcıları için parametresidir minibatch_size_in_samples.

CNTK parametresinin minibatch_size_in_samples çok özel bir tanımı vardır: Model güncelleştirmeleri arasındaki örnek sayısını belirtir. Buradaki bir örnek , sistem üzerinden akan bir vektör veya tensor olarak tanımlanır. Örneğin, bir görüntü tanıma görevinde bir görüntü bir örnektir.

Her dönem için minibatch boyutu örneklerde (dinamik eksen boyunca tensorlar) verilir. 256 varsayılan değerdir. Farklı dönemler için farklı değerler kullanabilirsiniz; Örneğin ( 128*2 + 1024 Python'da), ilk iki dönem için 128 ve geri kalanlar için 1024 minibatch boyutu kullanmak anlamına gelir. CNTK'daki 'minibatch boyutu'nun model güncelleştirmeleri arasında işlenen örnek sayısı anlamına geldiğini unutmayın. Bu tanım, çalışanlar arasında paralel hale getirildiğinde de geçerlidir (örneğin, çalışanlar için K her çalışanın işleyeceği örnek sayısı olur minibatch_size_in_samples/K). Değişken uzunlukta girişler söz konusu olduğunda, dizi sayısı değil, minibatch_size_in_samples bu dizilerdeki öğelerin sayısını ifade eder. SGD, toplam örnekleri aşmayan minibatch_size_in_samples minibatch'e mümkün olduğunca çok dizi sığdırmaya çalışır. Birkaç giriş verilirse, girişlerden biri değerini aşana minibatch_size_in_sampleskadar geçerli minibatch'e tensor eklenir.

Daha da önemlisi, sıralı veriler için örnek, bir dizinin tek bir öğesidir. Bu nedenle, CNTK'ler minibatch_size_in_samples minibatch içindeki dizi sayısına değil, minibatch'i oluşturan diziler genelindeki dizi öğelerinin/belirteçlerinin toplam sayısına başvurur. CNTK, değişken uzunluklu diziler için yerel desteğe sahiptir; örneğin, demetleme gibi geçici çözümlere gerek kalmadan aynı minibatch içinde çok çeşitli uzunluklarda dizileri barındırabilir. CNTK örnek başına öğrenme oranını belirtme (minibatch ortalaması yerine) ile birlikte, herhangi bir uzunluktaki dizilerin her öğesi gradyan için aynı katkıyı sağlayarak tutarlı yakınsamaya yol açar. (Diğer birçok araç seti, minibatch içindeki sıra sayısı olarak sıralı veriler için minibatch boyutunu tanımlar. Bu, özellikle gradyanlar CNTK minibatch toplamları yerine minibatch ortalamaları olarak tanımlanıyorsa, bir dizideki her belirteçten veya adımdan gradyana yapılan katkı sıra uzunluğuyla ters orantılı olacağından sorunludur. CNTK yaklaşımı bunu önler.)

Birden çok giriş kullanıldığında, tüm girişlerin aynı dizi uzunluğuna sahip olmaması mümkündür. Örneğin, sıra sınıflandırmasında her dizinin etiketi tek bir belirteçtir. Bu durumda, en fazla örnek sayısına sahip giriş minibatch boyutunu denetler. (Bazı girişler için belirterek defines_mb_size=True bu davranışı değiştirebilirsiniz, ardından minibatch boyutu bu girişten gelen dizilere göre sayılır. Birkaç giriş belirtildiğinde, yalnızca tek bir giriş defines_mb_size olarak ayarlanabilir True.)

Model güncelleştirmeleri minibatch_size_in_samples arasındaki örnek sayısı olarak net tanımımıza rağmen, tanımı gevşetmemiz gereken iki durum vardır:

  • sıralı veriler: Değişken uzunluklu diziler genellikle tam olarak istenen minibatch boyutuna kadar toplamaz. Bu durumda, istenen minibatch boyutunu aşmadan mümkün olduğunca çok dizi bir minibatch içine paketlenir (bir özel durumla: Rastgele corpustaki bir sonraki dizi minibatch boyutunun uzunluğunu aşarsa, minibatch boyutu bu diziden oluşur).
  • veri paralelliği: Burada, öbek tabanlı rastgele seçme algoritmamız her çalışanın tam olarak aynı sayıda örnek almasını garanti edemediğinden, minibatch boyutu yaklaşıktır.

Yukarıdaki tüm önemli noktalar için epoch_sizede geçerlidir, ancak epoch_size bazı farklılıkları vardır, yukarıya bakın.

MinibatchSource.next_minibatch

MinibatchSource.next_minibatch() yöntemi, tüm giriş akışları için verileri içeren bir minibatch okur. Eğitim sırasında çağrıldığında, MinibatchSource.next_minibatch(minibatch_size_in_samples, input_map) eğitim veri kümesinden rastgele bir örnek alt kümesi k seçer; burada k=minibatch_size_in_samples.

Uygulama, zaman olarak çağrıldığında next_minibatchN (burada N = number_of_training_samples/minibatch_size_in_samples) eğitim veri kümesinin tamamının çağrısının Nnext_minibatchsonunda ele alınmasını sağlar. Bu, zaman çağrıldığında next_minibatch2*N veri kümesinin tamamının iki kez kapsandığı anlamına da gelir.

Ek bilgiler:

  • Veriler arasında her döngünün farklı bir rastgele sırası olacaktır.
  • Minibatch boyutunuzu iki katına çıkarmanız durumunda, bir minibatch artık tam olarak daha önce karşılık gelen iki ardışık minibatın içerebileceği örnekleri içerir (değişken uzunlukta dizileriniz varsa bu yaklaşık olabilir). Yani yalnızca minibatch boyutu farklı olan iki çalıştırma verileri aynı sırada işler.
  • Denetim noktasından kesintiye uğratır ve yeniden başlatırsanız, eğitimi kesintiye uğratmamış gibi aynı rastgele sırayı elde edersiniz. Bu, şu basit algoritmayla okuma/rastgele seçme işlemini nominal bir zaman eksenine topraklayarak uygulanır:
    • Eğitim, nominal sonsuz zaman ekseninde ilerler. 256 boyutunda bir minibatch getirirseniz nominal süre 256'ya kadar ilerler.
    • Eğitim corpusu bu zaman ekseninde sonsuz sayıda çoğaltılır. Örnekleriniz varsa M , ilk çoğaltma nominal zamana 0..M-1; ikinci M..2M-1, vb. yayılıyor demektir.
    • Her çoğaltma, çoğaltma sınırları içinde rastgele karıştırılır ancak çoğaltma sınırları arasında karıştırılmaz. Örneğin, örnekleri tam olarak M işledikten sonra, her örneği tam olarak bir kez gördünüz.
    • Çağrısı next_minibatch(K) , bu yeniden karıştırılmış sonsuz zaman çizelgesinde size sonraki K örnekleri verir. Zaman aramakla next_minibatch(1)K aynı şey.
    • Bunların hepsi tembelce yapılır.
    • Denetim noktasından yeniden başlatmak, nominal zamanı denetim noktasının oluşturulduğu nominal saate sıfırlamak kadar basittir.