TensorFlow Eklentileri Optimize Edicileri: CyclicalLearningRate,TensorFlow Eklentileri Optimize Edicileri: CyclicalLearningRate

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

genel bakış

Bu öğretici, Eklentiler paketinden Döngüsel Öğrenme Hızının kullanımını gösterir.

Döngüsel Öğrenme Oranları

Bir sinir ağı için eğitim ilerledikçe öğrenme oranını ayarlamanın faydalı olduğu gösterilmiştir. Semer noktası kurtarmadan geri yayılım sırasında ortaya çıkabilecek sayısal kararsızlıkları önlemeye kadar çok çeşitli faydaları vardır. Ancak, belirli bir eğitim zaman damgasına göre ne kadar ayarlama yapılacağını nasıl bilebiliriz? 2015'te Leslie Smith, kayıp ortamında daha hızlı ilerlemek için öğrenme oranını artırmak istediğinizi, ancak yakınsamaya yaklaşırken öğrenme oranını da azaltmak isteyeceğinizi fark etti. Bu fikri gerçekleştirmek için, o önerdi Konjonktürel Öğrenme düşük bir fonksiyonun döngüleri göre öğrenme hızını ayarlayabilir (CLR). Görsel bir gösteri için, kontrol edebilirsiniz bu blogu . CLR artık bir TensorFlow API'si olarak mevcuttur. Daha fazla ayrıntı için orijinal makaleye göz atın burada .

Kurmak

pip install -q -U tensorflow_addons
from tensorflow.keras import layers
import tensorflow_addons as tfa
import tensorflow as tf

import numpy as np
import matplotlib.pyplot as plt

tf.random.set_seed(42)
np.random.seed(42)

Veri kümesini yükleyin ve hazırlayın

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()

x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)

Hiperparametreleri tanımlayın

BATCH_SIZE = 64
EPOCHS = 10
INIT_LR = 1e-4
MAX_LR = 1e-2

Model oluşturma ve model eğitim yardımcı programlarını tanımlayın

def get_training_model():
    model = tf.keras.Sequential(
        [
            layers.InputLayer((28, 28, 1)),
            layers.experimental.preprocessing.Rescaling(scale=1./255),
            layers.Conv2D(16, (5, 5), activation="relu"),
            layers.MaxPooling2D(pool_size=(2, 2)),
            layers.Conv2D(32, (5, 5), activation="relu"),
            layers.MaxPooling2D(pool_size=(2, 2)),
            layers.SpatialDropout2D(0.2),
            layers.GlobalAvgPool2D(),
            layers.Dense(128, activation="relu"),
            layers.Dense(10, activation="softmax"),
        ]
    )
    return model

def train_model(model, optimizer):
    model.compile(loss="sparse_categorical_crossentropy", optimizer=optimizer,
                       metrics=["accuracy"])
    history = model.fit(x_train,
        y_train,
        batch_size=BATCH_SIZE,
        validation_data=(x_test, y_test),
        epochs=EPOCHS)
    return history

Tekrarlanabilirlik açısından, deneylerimizi yürütmek için kullanacağınız ilk model ağırlıkları serileştirilmiştir.

initial_model = get_training_model()
initial_model.save("initial_model")
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
2021-11-12 19:14:52.355642: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: initial_model/assets

CLR'siz bir modeli eğitme

standard_model = tf.keras.models.load_model("initial_model")
no_clr_history = train_model(standard_model, optimizer="sgd")
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.
Epoch 1/10
938/938 [==============================] - 5s 4ms/step - loss: 2.2089 - accuracy: 0.2180 - val_loss: 1.7581 - val_accuracy: 0.4137
Epoch 2/10
938/938 [==============================] - 3s 3ms/step - loss: 1.2951 - accuracy: 0.5136 - val_loss: 0.9583 - val_accuracy: 0.6491
Epoch 3/10
938/938 [==============================] - 3s 3ms/step - loss: 1.0096 - accuracy: 0.6189 - val_loss: 0.9155 - val_accuracy: 0.6588
Epoch 4/10
938/938 [==============================] - 3s 3ms/step - loss: 0.9269 - accuracy: 0.6572 - val_loss: 0.8495 - val_accuracy: 0.7011
Epoch 5/10
938/938 [==============================] - 3s 3ms/step - loss: 0.8855 - accuracy: 0.6722 - val_loss: 0.8361 - val_accuracy: 0.6685
Epoch 6/10
938/938 [==============================] - 3s 3ms/step - loss: 0.8482 - accuracy: 0.6852 - val_loss: 0.7975 - val_accuracy: 0.6830
Epoch 7/10
938/938 [==============================] - 3s 3ms/step - loss: 0.8219 - accuracy: 0.6941 - val_loss: 0.7630 - val_accuracy: 0.6990
Epoch 8/10
938/938 [==============================] - 3s 3ms/step - loss: 0.7995 - accuracy: 0.7011 - val_loss: 0.7280 - val_accuracy: 0.7263
Epoch 9/10
938/938 [==============================] - 3s 3ms/step - loss: 0.7830 - accuracy: 0.7059 - val_loss: 0.7156 - val_accuracy: 0.7445
Epoch 10/10
938/938 [==============================] - 3s 3ms/step - loss: 0.7636 - accuracy: 0.7136 - val_loss: 0.7026 - val_accuracy: 0.7462

CLR zamanlamasını tanımlayın

tfa.optimizers.CyclicalLearningRate bir optimizasyon geçirilen doğrudan zamanlama iade modülü. Program, girdi olarak bir adım alır ve kağıtta düzenlendiği gibi CLR formülü kullanılarak hesaplanan bir değer verir.

steps_per_epoch = len(x_train) // BATCH_SIZE
clr = tfa.optimizers.CyclicalLearningRate(initial_learning_rate=INIT_LR,
    maximal_learning_rate=MAX_LR,
    scale_fn=lambda x: 1/(2.**(x-1)),
    step_size=2 * steps_per_epoch
)
optimizer = tf.keras.optimizers.SGD(clr)

Burada, öğrenme hızının alt ve üst sınırlarını belirtmek ve zamanlama bu aralıktaki arasına salınım yapacaktır ([1e-4, 1e-2] Bu durumda). scale_fn büyütmek ve belirli bir döngü içinde öğrenme oranı aşağı ölçek olur fonksiyonunu tanımlamak için kullanılır. step_size tek bir döngü süresini tanımlar. Bir step_size 2 araçlarının tek döngüsünü tamamlamak için 4 tekrarlamalar toplam gerekir. İçin önerilen değer step_size aşağıdaki gibidir:

factor * steps_per_epoch burada [2, 8] aralığı içinde bir faktör yatar.

Aynı olarak CLR kağıt Leslie da hızını öğrenmek için sınırları seçmek için bir basit ve zarif bir yöntem sundu. Bunu da kontrol etmeniz önerilir. Bu blog yayını yöntemine güzel bir giriş sağlar.

Aşağıda, nasıl görselleştirmek clr zamanlama görünüyor gibi.

step = np.arange(0, EPOCHS * steps_per_epoch)
lr = clr(step)
plt.plot(step, lr)
plt.xlabel("Steps")
plt.ylabel("Learning Rate")
plt.show()

png

CLR'nin etkisini daha iyi görselleştirmek için, programı artan sayıda adımla çizebilirsiniz.

step = np.arange(0, 100 * steps_per_epoch)
lr = clr(step)
plt.plot(step, lr)
plt.xlabel("Steps")
plt.ylabel("Learning Rate")
plt.show()

png

Eğer bu eğitimde kullandığınız fonksiyon olarak adlandırılır triangular2 CLR kağıtta yöntemle. Yani orada araştırıldı diğer iki işlev vardır triangular ve exp (kısa üstel için).

Bir modeli CLR ile eğitin

clr_model = tf.keras.models.load_model("initial_model")
clr_history = train_model(clr_model, optimizer=optimizer)
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.
Epoch 1/10
938/938 [==============================] - 4s 4ms/step - loss: 2.3005 - accuracy: 0.1165 - val_loss: 2.2852 - val_accuracy: 0.2378
Epoch 2/10
938/938 [==============================] - 3s 4ms/step - loss: 2.1931 - accuracy: 0.2398 - val_loss: 1.7386 - val_accuracy: 0.4530
Epoch 3/10
938/938 [==============================] - 3s 4ms/step - loss: 1.3132 - accuracy: 0.5052 - val_loss: 1.0110 - val_accuracy: 0.6482
Epoch 4/10
938/938 [==============================] - 3s 4ms/step - loss: 1.0746 - accuracy: 0.5933 - val_loss: 0.9492 - val_accuracy: 0.6622
Epoch 5/10
938/938 [==============================] - 3s 4ms/step - loss: 1.0528 - accuracy: 0.6028 - val_loss: 0.9439 - val_accuracy: 0.6519
Epoch 6/10
938/938 [==============================] - 3s 4ms/step - loss: 1.0198 - accuracy: 0.6172 - val_loss: 0.9096 - val_accuracy: 0.6620
Epoch 7/10
938/938 [==============================] - 3s 4ms/step - loss: 0.9778 - accuracy: 0.6339 - val_loss: 0.8784 - val_accuracy: 0.6746
Epoch 8/10
938/938 [==============================] - 3s 4ms/step - loss: 0.9535 - accuracy: 0.6487 - val_loss: 0.8665 - val_accuracy: 0.6903
Epoch 9/10
938/938 [==============================] - 3s 4ms/step - loss: 0.9510 - accuracy: 0.6497 - val_loss: 0.8691 - val_accuracy: 0.6857
Epoch 10/10
938/938 [==============================] - 3s 4ms/step - loss: 0.9424 - accuracy: 0.6529 - val_loss: 0.8571 - val_accuracy: 0.6917

Beklendiği gibi, kayıp normalden daha yüksek başlar ve döngüler ilerledikçe dengelenir. Bunu aşağıdaki grafiklerle görsel olarak teyit edebilirsiniz.

Kayıpları görselleştirin

(fig, ax) = plt.subplots(2, 1, figsize=(10, 8))

ax[0].plot(no_clr_history.history["loss"], label="train_loss")
ax[0].plot(no_clr_history.history["val_loss"], label="val_loss")
ax[0].set_title("No CLR")
ax[0].set_xlabel("Epochs")
ax[0].set_ylabel("Loss")
ax[0].set_ylim([0, 2.5])
ax[0].legend()

ax[1].plot(clr_history.history["loss"], label="train_loss")
ax[1].plot(clr_history.history["val_loss"], label="val_loss")
ax[1].set_title("CLR")
ax[1].set_xlabel("Epochs")
ax[1].set_ylabel("Loss")
ax[1].set_ylim([0, 2.5])
ax[1].legend()

fig.tight_layout(pad=3.0)
fig.show()

png

Bu oyuncak örneğin, CLR etkilerini çok görmedim ama arkasındaki ana maddelerden biri olduğu unutulmamalıdır rağmen Süper Yakınsama ve olabilir gerçekten iyi etkiyi büyük ölçekli ortamlarda eğitim yaparken.