Eğitim döngüsü

Bir makine öğrenimi modelini eğitirken, eğitim verilerinin alındığı (veya oluşturulduğu), grupların bir model üzerinden çalıştırıldığı, degradelerin elde edildiği ve modelin bir optimize edici aracılığıyla güncellendiği bir döngüye sahip olmak yaygındır. Her eğitim uygulaması için kendinize ait bir eğitim döngüsü yazabilseniz de TensorFlow için Swift, bu süreci basitleştirebilecek deneysel bir eğitim döngüsü soyutlaması sağlar.

Model deposundaki TrainingLoop modülü, bu deneysel genelleştirilmiş eğitim döngüsünün güncel sürümünü içerir. Kolay veri alımı için Epochs API'sine uygun veri kümesi sarmalayıcılarıyla entegre olacak ve optimum performansa ulaşmak için modellerin, veri kümelerinin ve optimize edicilerin hızlandırıcı arka uçları ile etkileşimini otomatikleştirecek şekilde yapılandırılmıştır. Geri aramalar kullanılarak eğitim sürecinin yoğun şekilde özelleştirilmesi sağlanabilir.

Model deposundaki görüntü tabanlı örneklerin çoğu, denetimli metin modeli eğitim örneklerinin yanı sıra bu eğitim döngüsü soyutlamasını kullanacak şekilde dönüştürülmüştür. Ancak eğitim döngüsü mevcut tasarımıyla tüm makine öğrenimi modelleri için uygun olmayabilir.

TensorFlow'un genelleştirilmiş eğitim döngüsü için Swift'in uygulanması fastai'nin Learner'ından büyük ölçüde etkilenmiştir. Tasarımları hakkında daha fazla bilgi için lütfen "fastai: Derin Öğrenme için Katmanlı Bir API" ve Sylvain Gugger'ın "Fast.ai - Sonsuz şekilde özelleştirilebilir bir eğitim döngüsü" sunumuna bakın.

Kullanım

ResNet-CIFAR10 örneği, bu eğitim döngüsünün pratikte nasıl kullanılacağına dair iyi bir gösterim sağlar. İlk önce modülü içe aktarın:

import TrainingLoop

daha sonra bir Device ayarlayarak bir hızlandırıcı arka ucu seçin. Bu durumda X10 XLA tabanlı arka ucu seçeceğiz ve mevcut ilk hızlandırıcıyı kullanacağız:

let device = Device.defaultXLA

Bir sonraki adım, eğitim döngünüzle kullanılacak veri kümesini, modeli ve optimize ediciyi yapılandırmaktır:

let dataset = CIFAR10(batchSize: 10, on: device)
var model = ResNet(classCount: 10, depth: .resNet56, downsamplingInFirstStage: false)
var optimizer = SGD(for: model, learningRate: 0.001)

ve ardından eğitim döngüsünü ayarlayın:

var trainingLoop = TrainingLoop(
  training: dataset.training,
  validation: dataset.validation,
  optimizer: optimizer,
  lossFunction: softmaxCrossEntropy,
  metrics: [.accuracy])

Eğitim döngüsü, kullandığınız veri kümesinin Epochs API'sine uygun olduğunu varsayar ve eğitim ve doğrulama için veri kümesi içindeki hangi bölünmelerin kullanılacağını belirlemenize olanak tanır. softmaxCrossEntropy burada gibi uyumlu bir sarmalayıcıya yerleştirildikten sonra herhangi bir kayıp işlevi kullanılabilir.

Yakalanabilecek mevcut ölçümler şunları içerir:

  • loss
  • accuracy
  • top5Accuracy
  • matthewsCorrelationCoefficient
  • perplexity

Son olarak, eğitimi gerçekleştirmek için aşağıdakileri çağırırsınız:

try! trainingLoop.fit(&model, epochs: 10, on: device)

Bu, belirttiğimiz hızlandırıcı arka ucunu kullanarak modeli 10 dönem boyunca eğitecektir. İstatistikler, eğitim sırasında animasyonlu bir komut istemi kullanılarak konsolda görüntülenecektir.

Geri aramalar

Bu genelleştirilmiş eğitim döngüsünün özelleştirilmesi, geri aramaların kullanılmasıyla gerçekleşir. Bu geri aramalar döngü içindeki çeşitli noktalara bağlanabilir.

Çeşitli yerleşik geri aramalar, herhangi bir eğitim döngüsüne eklenebilecek işlevsellik sağlar. Bunlar şunları içerir:

  • İstatistikleri virgülle ayrılmış değer (CSV) dosyalarına kaydetme
  • Öğrenme oranını özel bir programa göre ayarlama
  • TensorBoard aracılığıyla eğitim ilerlemesinin izlenmesi ve grafiklenmesi

Bunlara ek olarak, standart bir eğitim döngüsüne bir dizi ek işlevsellik eklemek için kendi özel geri aramalarınızı oluşturabilirsiniz.

CSV günlüğü

CSVLogger sınıfı, eğitim istatistiklerini virgülle ayrılmış değer biçiminde seçtiğiniz bir dosyaya yazacak bir geri çağırmayı kapsüller. Bu dosya, epoch , batch etiketli sütunlarla ve eğitim döngünüzde etkinleştirdiğiniz ölçümlerle başlayacaktır. Daha sonra her parti için bu sütunların geçerli değerleriyle bir satır yazılacaktır.

Eğitim döngünüze CSV günlüğünü eklemek için, TrainingLoop callbacks: parametresine aşağıdakine benzer bir şey ekleyin:

try! CSVLogger(path: "file.csv").log

Örnek olarak LeNet-MNIST örneği bunu eğitim döngüsünde kullanır.

Öğrenme oranı programları

Bir modeli eğitirken, eğitim süreci sırasında bir optimize ediciye sağlanan öğrenme oranını değiştirmek yaygın bir durumdur. Bu, zaman içinde doğrusal bir azalma kadar basit olabileceği gibi karmaşık işlevlerle tanımlanan ısınma ve düşüş döngüleri kadar karmaşık da olabilir.

learningRateScheduler geri çağrısı, her biri kendi farklı şekline sahip olan farklı bölümlerden oluşan öğrenme oranı programlarını tanımlamanın yollarını sağlar. Bu, her biri bir işlev tarafından tanımlanan bir Shape , bir başlangıç ​​öğrenme hızı ve bir son öğrenme hızına sahip olan ScheduleSegment öğelerinden oluşan bir LearningRateSchedule tanımlanarak gerçekleştirilir.

Örneğin, BERT-CoLA örneği, ısınma periyodu sırasında öğrenme oranındaki doğrusal bir artışı ve bundan sonra doğrusal bir azalmayı kullanır. Bunu yapmak için öğrenme oranı çizelgesi geri araması aşağıdaki gibi tanımlanır:

learningRateScheduler(
  schedule: makeSchedule(
    [
      ScheduleSegment(shape: linear, startRate: 0, endRate: peakLearningRate, stepCount: 10),
      ScheduleSegment(shape: linear, endRate: 0)
    ]
  )
)

İki ScheduleSegment , 0'da başlayan ve 10 ayrı adımdan oluşan bir dizi boyunca doğrusal olarak peakLearningRate yükselen, daha sonra önceki adımdan son öğrenme hızında başlayan ve eğitim sürecinin sonunda doğrusal olarak 0'a düşen bir öğrenme oranını tanımlar.

TensorBoard entegrasyonu

TensorBoard, model eğitimini izlemek, tamamlandığında eğitimi analiz etmek veya eğitim çalışmalarını karşılaştırmak için güçlü bir görselleştirme aracıdır. TensorFlow için Swift, eğitim ölçümlerini günlüğe kaydeden geri aramalar sağlayan model deposundaki TensorBoard modülünün kullanımı yoluyla TensorBoard görselleştirmesini destekler.

GPT2-WikiText2 örneği, TensorBoard günlüğünü model eğitiminize nasıl ekleyeceğinizi gösterir. İlk önce TensorBoard modülünü içe aktarın. O zaman bu, TrainingLoop callbacks: dizisine tensorBoardStatisticsLogger() eklemek kadar basittir.

Varsayılan olarak bu, her eğitim çalışmasını bir run/tensorboard/stats dizinine kaydedecektir. Bunu Tensorboard'da görüntülemek için şunu çalıştırın:

tensorboard --logdir ./run/tensorboard/stats

ve TensorBoard, eğitim ölçümlerinizi görüntüleyebileceğiniz yerel bir sunucu başlatmalıdır. Eğitim ve doğrulama sonuçları ayrı ayrı gösterilmeli ve aynı modelin birden fazla çalıştırması arasında kolay karşılaştırma yapılabilmesi için her çalıştırmanın benzersiz bir zaman damgası olmalıdır.

TensorFlow TensorBoard entegrasyonu için Swift'in tasarımı tensorboardX'ten ilham aldı. TensorBoard geri aramaları doğrudan uygun olay ve özet protokol arabelleklerini oluşturur ve bunları eğitim sırasında bir günlük dosyasına yazar.

Özel geri aramalar

Yukarıda açıklanan yerleşik geri aramalara ek olarak, kendi geri aramalarınızı oluşturarak eğitim döngülerinin işlevini özelleştirme olanağına da sahipsiniz. Bu geri aramalar, aşağıdakine benzer bir imzaya sahip işlevlerdir:

func customCallback<L: TrainingLoopProtocol>(_ loop: inout L, event: TrainingLoopEvent) throws
{
  if event == .updateStart {
    ...
  }
}

Eğitim döngüsü ve ilgili durum ilk parametre olarak aktarılır. Geri aramanın yanıt verdiği döngünün mevcut kısmı event aracılığıyla sağlanır. Eğitim döngüsü olayı, her biri döngünün yaşam döngüsündeki farklı bir noktaya karşılık gelen aşağıdaki durumlardan birine sahiptir:

  • fitStart
  • fitEnd
  • epochStart
  • epochEnd
  • trainingStart
  • trainingEnd
  • validationStart
  • validationEnd
  • batchStart
  • batchEnd
  • updateStart
  • inferencePredictionEnd

Geri çağırma işleviniz, yukarıdaki durumların herhangi bir kombinasyonunda mantığını etkinleştirmeyi seçebilir; bu, eğitim döngüsünden veri çıkarılmasına veya eğitim döngüsünden birçok şekilde kontrol edilmesine olanak tanır.