Thursday, June 23, 2022

Deep Learning Neural Networks Trained Using Stochastic Gradient Descent Algorithm

 Задача оптимизатора — сделать функцию потерь как можно меньше, чтобы найти подходящие параметры для выполнения определенной задачи. В настоящее время основными оптимизаторами, используемыми при обучении моделей, являются SGD, RMSProp, Adam, AdaDelt и так далее. Оптимизаторы SGD с импульсом широко используются в научных кругах и промышленности, поэтому большинство выпускаемых моделей обучаются с помощью оптимизатора SGD с импульсом. Но у SGD-оптимизатора с импульсом есть два недостатка: во-первых, скорость сходимости низкая, во-вторых, трудно установить начальную скорость обучения, однако, если начальная скорость обучения установлена ​​​​правильно, а модели обучены в достаточном количестве итераций. , модели, обученные SGD с помощью импульса, могут достигать более высокой точности по сравнению с моделями, обученными другими оптимизаторами. Некоторые другие оптимизаторы с адаптивной скоростью обучения, такие как Adam, RMSProp и т. д., стремятся сходиться быстрее, но окончательная точность сходимости будет немного хуже. Если вы хотите обучить модель с более высокой скоростью сходимости, мы рекомендуем вам использовать оптимизаторы с адаптивной скоростью обучения, но если вы хотите обучить модель с более высокой точностью, мы рекомендуем вам использовать оптимизатор SGD с импульсом.

Концепция скорости обучения: скорость обучения — это гиперпараметр для управления скоростью обучения, чем ниже скорость обучения, тем медленнее изменяется значение потерь, хотя использование низкой скорости обучения может гарантировать, что вы не пропустите ни один локальный минимум, но это также означает, что скорость конвергенции медленная, особенно когда градиент попадает в область градиентного плато.

=========================

Нейронные сети глубокого обучения обучаются с использованием алгоритма стохастического градиентного спуска.

Стохастический градиентный спуск — это алгоритм оптимизации, который оценивает градиент ошибки для текущего состояния модели, используя примеры из обучающего набора данных, а затем обновляет веса модели, используя алгоритм обратного распространения ошибок, называемый просто обратным распространением.

Величина, на которую веса обновляются во время обучения, называется размером шага или «скоростью обучения».

В частности, скорость обучения — это настраиваемый гиперпараметр, используемый при обучении нейронных сетей, который имеет небольшое положительное значение, часто в диапазоне от 0,0 до 1,0.Скорость обучения определяет, насколько быстро модель адаптируется к проблеме. Меньшие скорости обучения требуют большего количества эпох обучения, учитывая меньшие изменения, вносимые в веса при каждом обновлении, тогда как более высокие скорости обучения приводят к быстрым изменениям и требуют меньшего количества эпох обучения.Слишком большая скорость обучения может привести к слишком быстрой сходимости модели к неоптимальному решению, тогда как слишком маленькая скорость обучения может привести к зависанию процесса.

Задача обучения нейронных сетей глубокого обучения заключается в тщательном выборе скорости обучения. Это может быть самый важный гиперпараметр для модели.

============================

Стратегия снижения скорости обучения:Во время обучения, если мы всегда используем одну и ту же скорость обучения, мы не можем получить модель с максимальной точностью, поэтому скорость обучения следует регулировать во время обучения. На ранней стадии обучения веса находятся в состоянии случайной инициализации, а градиенты имеют тенденцию к снижению, поэтому мы можем установить относительно большую скорость обучения для более быстрой сходимости. На поздней стадии обучения веса близки к оптимальным значениям, оптимальное значение не может быть достигнуто при относительно большой скорости обучения, поэтому следует использовать относительно меньшую скорость обучения. Во время обучения многие исследователи используют стратегию снижения скорости обучения piecewise_decay, которая представляет собой пошаговое снижение скорости обучения. Например, при обучении ResNet50 начальная скорость обучения, которую установили, равна 0,1, и скорость обучения падает до 1/10 каждые 30 эпох, общее количество эпох для обучения равно 120. Помимо кусочного_распада, многие исследователи также предлагали другие способы уменьшить скорость обучения, например, polynomial_decay, exponential_decay и cosine_decay и т. д. Среди них cosine_decay стал предпочтительным методом снижения скорости обучения для повышения точности модели, поскольку нет необходимости настраивать гиперпараметры, а надежность относительно высока. Кривые скорости обучения cosine_decay и piecewise_decay показаны на следующих рисунках, легко заметить, что в течение всего процесса обучения cosine_decay сохраняет относительно большую скорость обучения, поэтому его сходимость медленнее, но конечная точность сходимости лучше, чем у один с использованием piecewise_decay.













Кроме того, мы также можем видеть из рисунков, что количество эпох с небольшой скоростью обучения в cosine_decay меньше, что повлияет на итоговую точность, поэтому, чтобы заставить cosine_decay играть лучше, рекомендуется использовать cosine_decay в большие эпохи, например, 200 эпох.

ResNet50 — это вариант модели ResNet, который имеет 48 слоев свертки, а также 1 слой MaxPool и 1 средний пул. 

Он имеет 3,8 x 10 ^ 9 операций с плавающей запятой. Это широко используемая модель ResNet и ее архитектура хорошо известна.

========================================

Эффект адаптивных скоростей обучения

========================================

Скорость обучения и графики скорости обучения сложны в настройке и имеют решающее значение для производительности модели нейронной сети с глубоким обучением.Keras предоставляет ряд различных популярных вариантов стохастического градиентного спуска с адаптивной скоростью обучения, таких как:

Adaptive Gradient Algorithm (AdaGrad).

Root Mean Square Propagation (RMSprop).

Adaptive Moment Estimation (Adam).

Каждый из них предоставляет различную методологию адаптации скорости обучения для каждого веса в сети.

Не существует единственного лучшего алгоритма, и результаты алгоритмов гоночной оптимизации для одной задачи вряд ли можно будет перенести на новые задачи.Мы можем изучить динамику различных методов адаптивной скорости обучения в задаче о каплях. Функцию fit_model() можно обновить, чтобы она брала имя алгоритма оптимизации для оценки, которое можно указать в аргументе «оптимизатор» при компиляции модели MLP. Затем будут использоваться параметры по умолчанию для каждого метода.


(.env) boris@boris-All-Series:~/LEARNINGRATE$ cat  AdaptLearnRates.py

# study of sgd with adaptive learning rates in the blobs problem

from sklearn.datasets import make_blobs

from keras.layers import Dense

from keras.models import Sequential

from keras.optimizers import SGD

from keras.utils import to_categorical

from keras.callbacks import Callback

from keras import backend

from matplotlib import pyplot

 

# prepare train and test dataset

def prepare_data():

# generate 2d classification dataset

X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)

# one hot encode output variable

y = to_categorical(y)

# split into train and test

n_train = 500

trainX, testX = X[:n_train, :], X[n_train:, :]

trainy, testy = y[:n_train], y[n_train:]

return trainX, trainy, testX, testy

 

# fit a model and plot learning curve

def fit_model(trainX, trainy, testX, testy, optimizer):

# define model

model = Sequential()

model.add(Dense(50, input_dim=2, activation='relu', kernel_initializer='he_uniform'))

model.add(Dense(3, activation='softmax'))

# compile model

model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

# fit model

history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=200, verbose=0)

# plot learning curves

pyplot.plot(history.history['accuracy'], label='train')

pyplot.plot(history.history['val_accuracy'], label='test')

pyplot.title('opt='+optimizer, pad=-80)

 

# prepare dataset

trainX, trainy, testX, testy = prepare_data()

# create learning curves for different optimizers

momentums = ['sgd', 'rmsprop', 'adagrad', 'adam']

for i in range(len(momentums)):

# determine the plot number

plot_no = 220 + (i+1)

pyplot.subplot(plot_no)

# fit model and plot learning curves for an optimizer

fit_model(trainX, trainy, testX, testy, momentums[i])

# show learning curves

pyplot.show()















===========================

Затухание скорости обучения

===========================

Выполнение примера создает единую фигуру, содержащую четыре линейных графика для различных оцененных значений затухания скорости обучения. Точность классификации в обучающем наборе данных отмечена синим цветом, тогда как точность в тестовом наборе данных отмечена оранжевым цветом.

(.env) boris@boris-All-Series:~/LEARNINGRATE$ cat learnRateKeras.py

# study of decay rate on accuracy for blobs problem

from sklearn.datasets import make_blobs

from keras.layers import Dense

from keras.models import Sequential

from keras.optimizers import SGD

from keras.utils import to_categorical

from matplotlib import pyplot

# prepare train and test dataset

def prepare_data():

# generate 2d classification dataset

X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)

# one hot encode output variable

y = to_categorical(y)

# split into train and test

n_train = 500

trainX, testX = X[:n_train, :], X[n_train:, :]

trainy, testy = y[:n_train], y[n_train:]

return trainX, trainy, testX, testy

 

# fit a model and plot learning curve

def fit_model(trainX, trainy, testX, testy, decay):

# define model

model = Sequential()

model.add(Dense(50, input_dim=2, activation='relu', kernel_initializer='he_uniform'))

model.add(Dense(3, activation='softmax'))

# compile model

opt = SGD(learning_rate=0.01, decay=decay)

model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

# fit model

history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=200, verbose=0)

# plot learning curves

pyplot.plot(history.history['accuracy'], label='train')

pyplot.plot(history.history['val_accuracy'], label='test')

pyplot.title('decay='+str(decay), pad=-80)

 

# prepare dataset

trainX, trainy, testX, testy = prepare_data()

# create learning curves for different decay rates

decay_rates = [1E-1, 1E-2, 1E-3, 1E-4]

for i in range(len(decay_rates)):

# determine the plot number

plot_no = 220 + (i+1)

pyplot.subplot(plot_no)

# fit model and plot learning curves for a decay rate

fit_model(trainX, trainy, testX, testy, decay_rates[i])

# show learning curves

pyplot.show()















=================================

Влияние скорости обучения и импульса

=================================

Импульсная динамика

Импульс может сгладить прогресс алгоритма обучения, что, в свою очередь, может ускорить процесс обучения

Выполнение примера создает единую фигуру, содержащую четыре линейных графика для различных оцененных значений импульса. Точность классификации в обучающем наборе данных отмечена синим цветом, тогда как точность в тестовом наборе данных отмечена оранжевым цветом.

(.env) boris@boris-All-Series:~/LEARNINGRATE$ cat MomentumDynam.py

# study of momentum on accuracy for blobs problem

from sklearn.datasets import make_blobs

from keras.layers import Dense

from keras.models import Sequential

from keras.optimizers import SGD

from keras.utils import to_categorical

from matplotlib import pyplot

 

# prepare train and test dataset

def prepare_data():

# generate 2d classification dataset

X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)

# one hot encode output variable

y = to_categorical(y)

# split into train and test

n_train = 500

trainX, testX = X[:n_train, :], X[n_train:, :]

trainy, testy = y[:n_train], y[n_train:]

return trainX, trainy, testX, testy

 

# fit a model and plot learning curve

def fit_model(trainX, trainy, testX, testy, momentum):

# define model

model = Sequential()

model.add(Dense(50, input_dim=2, activation='relu', kernel_initializer='he_uniform'))

model.add(Dense(3, activation='softmax'))

# compile model

opt = SGD(learning_rate=0.01, momentum=momentum)

model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

# fit model

history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=200, verbose=0)

# plot learning curves

pyplot.plot(history.history['accuracy'], label='train')

pyplot.plot(history.history['val_accuracy'], label='test')

pyplot.title('momentum='+str(momentum), pad=-80)

 

# prepare dataset

trainX, trainy, testX, testy = prepare_data()

# create learning curves for different momentums

momentums = [0.0, 0.5, 0.9, 0.99]

for i in range(len(momentums)):

# determine the plot number

plot_no = 220 + (i+1)

pyplot.subplot(plot_no)

# fit model and plot learning curves for a momentum

fit_model(trainX, trainy, testX, testy, momentums[i])

# show learning curves

pyplot.show()































No comments:

Post a Comment