Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

13.1. Получение максимальной отдачи от моделей    507

Преодолению.этого.разрыва.и.посвящена.предпоследняя.глава.данной.книги.. В.ней.я.постараюсь.передать.толику.передового.опыта,.который.понадобится.вам. на.пути.от.студента,.изучающего.машинное.обучение,.до.полноценного.инженера. по.машинному.обучению..Мы.рассмотрим.основные.методы.систематического. улучшения.качества.моделей:.настройку.гиперпараметров.и.ансамблирование. моделей..Затем.поговорим.о.том,.как.расширить.масштабы.и.ускорить.обучение. моделей.с.применением.методов.обучения.со.смешанной.точностью.и.с.использованием.нескольких.GPU.и.TPU,.а.также.удаленных.вычислительных. ресурсов.в.облаке.

13.1. ПОЛУЧЕНИЕ МАКСИМАЛЬНОЙ ОТДАЧИ ОТ МОДЕЛЕЙ

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

13.1.1. Оптимизация гиперпараметров

При.создании.модели.глубокого.обучения.приходится.принимать.множество. решений,.кажущихся.произвольными..Сколько.слоев.включить.в.стек?.Сколько. параметров.или.фильтров.должно.быть.в.каждом.слое?.Использовать.ли.функцию. активации.relu.или.какую-то.другую?.Использовать.ли.BatchNormalization.после. данного.слоя?.Какой.шаг.прореживания.выбрать?.И.так.далее..Все.эти.архитектурные.параметры.называют.гиперпараметрами,.чтобы.отличать.их.от.параметров. модели,.которые.обучаются.посредством.обратного.распространения.ошибки.

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

508    Глава 13. Методы и приемы для применения на практике

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

Вот.как.выглядит.типичный.процесс.оптимизации.гиперпараметров.

1.. Выбрать.набор.гиперпараметров.(автоматически).

2.. Создать.соответствующую.модель.

3.. Обучить.ее.на.обучающих.данных.и.оценить.качество.на.проверочных.данных.

4.. Выбрать.следующий.набор.гиперпараметров.(автоматически). 5.. Повторить.

6.. Получить.окончательную.оценку.качества.на.контрольных.данных.

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

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

.Пространство.гиперпараметров.обычно.состоит.из.дискретных.решений. и.поэтому.не.является.непрерывным.и.дифференцируемым..Как.следствие,. метод.градиентного.спуска.нельзя.применить.в.пространстве.гиперпараметров..Вместо.этого.приходится.полагаться.на.другие.приемы.оптимизации,. не.такие.эффективные,.как.градиентный.спуск.

.Вычисление.сигнала.обратной.связи.(действительно.ли.данный.набор.гиперпараметров.ведет.к.улучшению.качества.модели.для.данной.задачи?). может.обходиться.очень.дорого:.для.этого.нужно.создать.и.обучить.новую. модель.с.нуля.

.Сигнал.обратной.связи.может.искажаться.посторонними.шумами:.если.модель,.обученная.с.новым.набором.гиперпараметров,.оказалась.на.0,2.%.лучше. прежней,.как.определить,.чем.обусловлен.этот.прирост.—.лучшей.конфигу- рацией.модели.или.простым.везением.в.выборе.начальных.значений.весов?

К.счастью,.существует.инструмент,.упрощающий.настройку.гиперпараметров:. KerasTuner..Давайте.познакомимся.с.ним.

Выбор гиперпараметров из объекта hp. После выбора эти значения (такие как переменная "units"
здесь) становятся обычными константами Python

13.1. Получение максимальной отдачи от моделей    509

KerasTuner

Начнем.с.установки.KerasTuner:

!pip install keras-tuner -q

KerasTuner.позволяет.заменять.жестко.запрограммированные.значения.гиперпараметров.(такие.как.units=32).диапазоном.возможных.вариантов,.например:.

Int(name="units", .min_value=16, .max_value=64, .step=16)..Это.множество.вариантов.называется.пространством поиска.процесса.настройки.гиперпараметров.

Чтобы.задать.пространство.поиска,.нужно.определить.функцию.создания.модели. (как.показано.в.следующем.листинге)..Она.принимает.параметр.hp,.с.помощью. которого.можно.задавать.диапазоны.гиперпараметров,.и.возвращает.скомпилированную.модель.Keras.

Листинг 13.1. Функция создания модели для KerasTuner

from tensorflow import keras

from tensorflow.keras import layers

def build_model(hp):

units = hp.Int(name="units", min_value=16, max_value=64, step=16)

model = keras.Sequential([

Доступны разные типы

 

layers.Dense(units, activation="relu"),

 

 

layers.Dense(10, activation="softmax")

гиперпараметров: Int,

 

])

 

Float, Boolean, Choice

 

 

 

 

 

optimizer = hp.Choice(name="optimizer", values=["rmsprop", "adam"])

 

 

 

 

model.compile(

 

 

 

optimizer=optimizer,

 

 

 

loss="sparse_categorical_crossentropy",

Функция возвращает

metrics=["accuracy"])

скомпилированную модель

return model

 

 

 

 

 

При.желании.можно.использовать.более.модульный.и.настраиваемый.подход. к.созданию.модели,.а.также.создать.подкласс.класса.HyperModel .и.определить. метод.build,.как.показано.ниже.

Листинг 13.2. Создание производного класса от HyperModel в KerasTuner

import kerastuner as kt

Используя объектно-ориентированный подход, можно

 

настраивать константы модели с помощью аргументов

class SimpleMLP(kt.HyperModel):

конструктора (вместо жесткого их определения

def __init__(self, num_classes):

в функции создания модели)

self.num_classes = num_classes

 

 

 

 

Метод build() играет ту же роль, что

def build(self, hp): и использовавшаяся прежде функция build_model()

units = hp.Int(name="units", min_value=16, max_value=64, step=16) model = keras.Sequential([

layers.Dense(units, activation="relu"), layers.Dense(self.num_classes, activation="softmax")

])

510    Глава 13. Методы и приемы для применения на практике

optimizer = hp.Choice(name="optimizer", values=["rmsprop", "adam"]) model.compile(

optimizer=optimizer, loss="sparse_categorical_crossentropy", metrics=["accuracy"])

return model

hypermodel = SimpleMLP(num_classes=10)

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

. выбирает.набор.значений.гиперпараметров;

. вызывает.функцию.создания.модели.с.этими.значениями;

. обучает.модель.и.сохраняет.полученные.метрики.

KerasTuner.имеет.несколько.встроенных.тюнеров.—.RandomSearch,.BayesianOpti­ mization.и.Hyperband..Попробуем.BayesianOptimization.—.тюнер,.пытающийся.ин- теллектуально.подбирать.новые.значения.гиперпараметров.с.учетом.предыдущего. выбора,.которые,.вероятно,.будут.обеспечивать.более.высокое.качество.модели:

 

Указать функцию создания модели

 

Указать метрику, которую должен оптимизировать

 

 

 

(или экземпляра HyperModel)

 

тюнер. Всегда указывайте метрики, получаемые

 

tuner = kt.BayesianOptimization(

 

на проверочных данных, потому что цель процесса

 

 

поиска — найти модель с хорошей общностью!

 

 

build_model,

 

 

 

 

 

 

 

 

 

 

 

 

 

objective="val_accuracy",

 

 

 

 

Максимальное количество конфигураций

 

 

 

 

 

 

 

 

 

max_trials=100,

 

 

 

моделей («попыток») для апробации

 

 

 

 

 

executions_per_trial=2,

 

 

 

 

перед завершением процесса поиска

 

 

directory="mnist_kt_test",

 

Чтобы уменьшить дисперсию метрик, можно обучить

 

 

 

 

 

overwrite=True,

 

 

 

 

 

 

)

 

 

 

 

 

одну и ту же модель несколько раз и усреднить

 

 

 

 

 

 

 

 

 

 

 

 

 

 

результаты. executions_per_trial определяет количество

 

Каталог для сохранения

 

 

 

 

 

 

 

 

раундов обучения для каждой испытуемой конфигурации

 

журналов с результатами

 

 

 

модели (попытки)

 

поиска

К вопросу, следует ли перезаписать прежние данные в каталоге перед

 

 

 

 

 

 

 

 

 

началом нового поиска. Присвойте этому параметру значение True, если

 

 

 

 

изменили функцию создания модели, и значение False, чтобы возобновить

 

 

 

 

ранее начатый поиск с той же функцией создания модели

Вывести.на.экран.состояние.пространства.поиска.можно.с.помощью.search_ space_summary():

>>> tuner.search_space_summary() Search space summary

Default search space size: 2 units (Int)

{"default": None, "conditions": [], "min_value": 128, "max_value": 1024, "step": 128, "sampling": None}

Данный метод принимает те же аргументы, что и fit() (он просто передает их в вызов функции fit() для каждой новой модели)
Зарезервировать для дальнейшего использования

13.1. Получение максимальной отдачи от моделей    511

optimizer (Choice) {"default": "rmsprop",

"conditions": [],

"values": ["rmsprop", "adam"], "ordered": False}

ЦЕЛЬ МАКСИМИЗАЦИИ И МИНИМИЗАЦИИ

Для встроенных метрик (таких как точность в нашем случае) направление (direction) изменения метрики (точность должна быть максимальной, а потери — минимальными) KerasTuner определяет автоматически. Однако при использовании своих метрик вы должны указать его явно, например:

objective = kt.Objective( name="val_accuracy", direction="max")

tuner = kt.BayesianOptimization( build_model, objective=objective,

...

)

Имя метрики, как оно отображается в журналах эпохи

Желаемое направление изменения метрики: min или max

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

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() x_train = x_train.reshape((-1, 28 * 28)).astype("float32") / 255 x_test = x_test.reshape((-1, 28 * 28)).astype("float32") / 255 x_train_full = x_train[:]

y_train_full = y_train[:] num_val_samples = 10000

x_train, x_val = x_train[:-num_val_samples], x_train[-num_val_samples:] y_train, y_val = y_train[:-num_val_samples], y_train[-num_val_samples:] callbacks = [

keras.callbacks.EarlyStopping(monitor="val_loss", patience=5),

]

tuner.search( x_train, y_train, batch_size=128,

epochs=100, validation_data=(x_val, y_val), callbacks=callbacks,

verbose=2,

)

Зарезервировать часть данных для проверочного набора

Использовать большое количество эпох (наперед неизвестно, сколько эпох потребуется для каждой модели) и обратный вызов EarlyStopping, чтобы остановить обучение, когда возникнет эффект переобучения

512    Глава 13. Методы и приемы для применения на практике

Предыдущий.пример.выполнится.всего.за.несколько.минут,.так.как.мы.рассматриваем.лишь.несколько.возможных.вариантов,.а.обучение.производится.на. наборе.данных.MNIST..Однако.в.реальности.с.типичным.пространством.поиска.и.набором.данных.для.поиска.гиперпараметров.часто.может.потребоваться. вся.ночь.или.даже.несколько.дней..Если.в.процессе.поиска.произошел.сбой,. вы.всегда.сможете.перезапустить.его.—.просто.укажите.в.настройках.тюнера. overwrite=False,.чтобы.он.смог.возобновить.перебор.настроек,.опираясь.на. сохраненные.на.диске.журналы.

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

Листинг 13.3. Запрос лучших конфигураций гиперпараметров

top_n = 4

best_hps = tuner.get_best_hyperparameters(top_n)

Вернет список объектов HyperParameter, которые можно передать в вызов функции создания модели

Часто.при.повторном.обучении.моделей.желательно.включить.проверочные. данные.в.обучающий.набор,.если.в.дальнейшем.не.предполагается.вносить. какие-либо.изменения.в.гиперпараметры:.ведь.тогда.качество.модели.на.этих. данных.больше.не.будет.оцениваться..В.нашем.примере.мы.обучим.окончательные.модели.на.всей.совокупности.обучающих.данных.из.набора.MNIST,. не.резервируя.проверочного.набора.

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

Обычно.желательно.обучать.новые.модели.дольше,.чем.во.время.поиска:.использование.агрессивного.значения.patience .в.обратном.вызове.EarlyStopping . экономит.время.в.течение.поиска,.но.может.привести.к.малопригодным.моделям.. Просто.используйте.проверочный.набор.для.поиска.лучшей.эпохи:

def get_best_epoch(hp):

Обратите внимание

 

model = build_model(hp)

 

на необычно высокое

 

callbacks=[

 

значение параметра patience

 

keras.callbacks.EarlyStopping(

 

 

 

 

monitor="val_loss", mode="min", patience=10)

 

 

 

 

]

history = model.fit( x_train, y_train,

validation_data=(x_val, y_val), epochs=100,

batch_size=128, callbacks=callbacks)

val_loss_per_epoch = history.history["val_loss"]

best_epoch = val_loss_per_epoch.index(min(val_loss_per_epoch)) + 1 print(f"Best epoch: {best_epoch}")

return best_epoch

13.1. Получение максимальной отдачи от моделей    513

Наконец,.проведем.обучение.на.полном.наборе.данных,.задав.чуть.большее.количество.эпох,.потому.что.теперь.обучение.производится.на.большем.количестве. данных..В.нашем.случае.увеличим.число.эпох.на.20.%:

def get_best_trained_model(hp): best_epoch = get_best_epoch(hp) model.fit(

x_train_full, y_train_full,

batch_size=128, epochs=int(best_epoch * 1.2)) return model

best_models = [] for hp in best_hps:

model = get_best_trained_model(hp) model.evaluate(x_test, y_test) best_models.append(model)

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

best_models = tuner.get_best_models(top_n)

ПРИМЕЧАНИЕ

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

Искусство создания правильного пространства поиска

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

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

514    Глава 13. Методы и приемы для применения на практике

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

Однако.у.меня.для.вас.есть.хорошая.новость:.используя.механизм.оптимизации. гиперпараметров,.решения.о.выборе.конфигурации,.которые.вы.должны.принимать,.переходят.из.плоскости.микрорешений.(таких.как.выбор.количества. обучаемых.параметров.в.том.или.ином.слое).в.плоскость.архитектурных.решений.более.высокого.уровня.(таких.как.необходимость.использования.остаточных.связей.в.модели)..Микрорешения.специфичны.для.определенной.модели.

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

и.того.же.шаблона.пространства.поиска.

Следуя.этой.логике,.KerasTuner.предлагает.заранее подготовленные пространства поиска.для.широких.категорий.задач.(таких.как.классификация.изображений)..Благодаря.им.вы.можете.просто.добавить.данные,.запустить.поиск. и.получить.довольно.хорошую.модель..Попробуйте.гипермодели.kt.applica­ tions.HyperXception.и.kt.applications.HyperResNet,.которые.являются.эффективно.настраиваемыми.версиями.моделей.Keras.Applications.

Будущее оптимизации гиперпараметров: автоматизированное машинное обучение

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

Поиск.по.набору.возможных.скоростей.обучения.или.размеров.слоев.—.это. только.первый.шаг..Можно.пойти.дальше.и.попытаться.разработать.подходящую.архитектуру.с.нуля.с.минимально.возможными.ограничениями:.например,. используя.обучение.с.подкреплением.или.генетические.алгоритмы..В.будущем. появятся.целые.сквозные.конвейеры.машинного.обучения,.которые.будут.ге- нерироваться.автоматически,.а.не.создаваться.инженерами-ремесленниками. вручную..Это.называется.автоматическим.машинным.обучением,.или.AutoML.. Вы.уже.можете.использовать.такие.библиотеки,.как.AutoKeras.(https://github.com/ keras-team/autokeras),.для.решения.простых.задач.машинного.обучения.с.мини- мальным.участием.с.вашей.стороны.