Настройте гиперпараметры эксперимента при помощи байесовой оптимизации

В этом примере показано, как использовать Байесовую оптимизацию в Experiment Manager, чтобы найти оптимальные сетевые гиперпараметры и опции обучения для сверточных нейронных сетей. Байесова оптимизация предоставляет альтернативную стратегию широким гиперпараметрам в эксперименте. Вы указываете диапазон значений для каждого гиперпараметра и выбираете метрику, чтобы оптимизировать, и Experiment Manager ищет комбинацию гиперпараметров, которая оптимизирует вашу выбранную метрику. Байесова оптимизация требует Statistics and Machine Learning Toolbox™.

В этом примере вы обучаете сеть, чтобы классифицировать изображения от набора данных CIFAR-10. Эксперимент использует Байесовую оптимизацию, чтобы найти комбинацию гиперпараметров, которая минимизирует пользовательскую метрическую функцию. Гиперпараметры включают опции алгоритма настройки, а также параметры самой сетевой архитектуры. Пользовательская метрическая функция определяет ошибку классификации на случайным образом выбранном наборе тестов. Для получения дополнительной информации об определении пользовательских метрик в Experiment Manager смотрите, Оценивают Эксперименты Глубокого обучения при помощи Метрических функций.

В качестве альтернативы можно найти оптимальные гиперзначения параметров программно путем вызова bayesopt функция. Для получения дополнительной информации смотрите, что Глубокое обучение Использует Байесовую Оптимизацию.

Открытый эксперимент

Во-первых, откройте пример. Experiment Manager загружает проект с предварительно сконфигурированным экспериментом, который можно смотреть и запустить. Чтобы открыть эксперимент, в панели Браузера Эксперимента, дважды кликают имя эксперимента (BayesOptExperiment).

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

Поле Description содержит текстовое описание эксперимента. В данном примере описание:

Find optimal hyperparameters and training options for convolutional neural network.
Hyperparamters determine the network section depth, initial learning rate,
stochastic gradient descent momentum, and L2 regularization strength.

Раздел Hyperparameters задает стратегию (Bayesian Optimization) и опции гиперпараметра, чтобы использовать для эксперимента. Для каждого гиперпараметра задайте эти опции:

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

  • Введите — выбирают real (гиперпараметр с действительным знаком), integer (гиперпараметр с целочисленным знаком), или categorical (категориальный гиперпараметр).

  • Преобразуйте — выбирают none (никакое преобразование) или log (логарифмическое преобразование). Для log, гиперпараметром должен быть real или integer и положительный. При использовании этой опции гиперпараметр ищется и моделируется на логарифмическом масштабе.

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

  • SectionDepth — Этот параметр управляет глубиной сети. Общим количеством слоев в сети является 9*SectionDepth+7. В функции настройки эксперимента количество сверточных фильтров в каждом слое пропорционально 1/sqrt(SectionDepth), таким образом, количество параметров и необходимое количество расчета для каждой итерации являются примерно тем же самым для различных глубин раздела.

  • InitialLearnRate — Если скорость обучения является слишком низкой, то обучение занимает много времени. Если скорость обучения слишком высока, то обучение может достигнуть субоптимального результата или отличаться. Лучшая скорость обучения может зависеть от ваших данных, а также сети, вы - обучение.

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

  • L2Regularization — Используйте регуляризацию L2, чтобы предотвратить сверхподбор кривой. Ищите пробел силы регуляризации, чтобы найти хорошее значение. Увеличение данных и нормализация партии. также помогают упорядочить сеть.

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

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

  • Загрузите загрузки Обучающих данных и изображения извлечений и метки от набора данных CIFAR-10. Набор данных составляет приблизительно 175 Мбайт. В зависимости от вашего интернет-соединения может занять время процесс загрузки. Для обучающих данных этот пример создает augmentedImageDatastore путем применения случайных переводов и горизонтальных отражений. Увеличение данных помогает препятствовать тому, чтобы сеть сверхсоответствовала и запомнила точные детали учебных изображений. Чтобы включить сетевую валидацию, пример использует 5 000 изображений без увеличения. Для получения дополнительной информации об этом наборе данных смотрите Наборы Данных изображения.

datadir = tempdir;
downloadCIFARData(datadir);
[XTrain,YTrain,XTest,YTest] = loadCIFARData(datadir);
idx = randperm(numel(YTest),5000);
XValidation = XTest(:,:,:,idx);
YValidation = YTest(idx);
imageSize = [32 32 3];
pixelRange = [-4 4];
imageAugmenter = imageDataAugmenter( ...
    RandXReflection=true, ...
    RandXTranslation=pixelRange, ...
    RandYTranslation=pixelRange);
augimdsTrain = augmentedImageDatastore(imageSize,XTrain,YTrain, ...
    DataAugmentation=imageAugmenter);
  • Архитектура Сети Define задает архитектуру для сверточной нейронной сети для классификации глубокого обучения. В этом примере сеть, чтобы обучаться имеет три блока, произведенные функцией помощника convBlock, который перечислен в Приложении 2 в конце этого примера. Каждый блок содержит SectionDepth идентичные сверточные слои. Каждый сверточный слой сопровождается слоем нормализации партии. и слоем ReLU. Сверточные слои добавили дополнение так, чтобы их пространственный выходной размер всегда был тем же самым как входным размером. Между блоками макс. объединяющие слои прореживают пространственные размерности на коэффициент два. Гарантировать, что объем расчета, требуемого в каждом сверточном слое, является примерно тем же самым, количеством увеличений фильтров на коэффициент два от одного раздела до следующего. Количество просачивается, каждый сверточный слой пропорционален 1/sqrt(SectionDepth), так, чтобы сети различных глубин имели примерно то же количество параметров и потребовали о то же самом значении расчета на итерацию.

numClasses = numel(unique(YTrain));
numF = round(16/sqrt(params.SectionDepth));
layers = [
    imageInputLayer(imageSize)
    convBlock(3,numF,params.SectionDepth)
    maxPooling2dLayer(3,Stride=2,Padding="same")
    convBlock(3,2*numF,params.SectionDepth)
    maxPooling2dLayer(3,Stride=2,Padding="same")
    convBlock(3,4*numF,params.SectionDepth)
    averagePooling2dLayer(8)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];
  • Укажите, что Опции обучения задают trainingOptions объект для эксперимента с помощью значений для опций обучения 'InitialLearnRate', 'Momentum', и 'L2Regularization' сгенерированный Байесовым алгоритмом оптимизации. Пример обучает сеть для постоянного числа эпох, подтверждая однажды в эпоху и понижая скорость обучения на коэффициент 10 в течение прошлых эпох, чтобы уменьшать шум обновлений параметра и позволить сетевым параметрам успокаиваться ближе к минимуму функции потерь.

miniBatchSize = 256;
validationFrequency = floor(numel(YTrain)/miniBatchSize);
options = trainingOptions("sgdm", ...
    InitialLearnRate=params.InitialLearnRate, ...
    Momentum=params.Momentum, ...
    MaxEpochs=60, ...
    LearnRateSchedule="piecewise", ...
    LearnRateDropPeriod=40, ...
    LearnRateDropFactor=0.1, ...
    MiniBatchSize=miniBatchSize, ...
    L2Regularization=params.L2Regularization, ...
    Shuffle="every-epoch", ...
    Verbose=false, ...
    ValidationData={XValidation,YValidation}, ...
    ValidationFrequency=validationFrequency);

Чтобы смотреть функцию настройки, под Функцией Setup, нажимают Edit. Функция настройки открывается в Редакторе MATLAB®. Кроме того, код для функции настройки появляется в Приложении 1 в конце этого примера.

Раздел Metrics задает дополнительные функции, которые оценивают результаты эксперимента. Experiment Manager выполняет эти функции каждый раз, когда он закончил обучать сеть. Чтобы смотреть метрическую функцию, выберите имя метрической функции и нажмите Edit. Метрическая функция открывается в редакторе MATLAB.

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

Поля Optimize и Direction указывают на метрику, которую Байесов алгоритм оптимизации использует в качестве целевой функции. Для этого эксперимента Experiment Manager стремится минимизировать значение ErrorRate метрика.

Запустите эксперимент

Когда вы запускаете эксперимент, Experiment Manager ищет лучшую комбинацию гиперпараметров относительно выбранной метрики. Каждое испытание в эксперименте использует новую комбинацию гиперзначений параметров на основе результатов предыдущих испытаний. По умолчанию Experiment Manager запускает одно испытание за один раз. Если у вас есть Parallel Computing Toolbox™, можно запустить несколько испытаний одновременно. Для лучших результатов, прежде чем вы запустите свой эксперимент, начинают параллельный пул со стольких же рабочих сколько графические процессоры. Для получения дополнительной информации смотрите Использование Experiment Manager, чтобы Обучить нейронные сети параллельно и Поддержка графического процессора Релизом (Parallel Computing Toolbox).

  • Чтобы запустить один суд над экспериментом за один раз, на панели инструментов Experiment Manager, нажимают Run.

  • Чтобы запустить несколько испытаний одновременно, нажмите Use Parallel и затем Запуск. Если нет никакого текущего параллельного пула, Experiment Manager запускает тот с помощью кластерного профиля по умолчанию. Experiment Manager затем выполняет несколько одновременных испытаний, в зависимости от количества параллельных доступных рабочих.

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

Чтобы определить испытание, которое оптимизирует выбранную метрику, Experiment Manager использует лучший критерий точки 'min-observed'. Для получения дополнительной информации см. Байесов Алгоритм Оптимизации (Statistics and Machine Learning Toolbox) и bestPoint (Statistics and Machine Learning Toolbox).

Оцените результаты

Чтобы протестировать лучшее испытание в вашем эксперименте, сначала выберите строку в таблице результатов с самым низким коэффициентом ошибок.

Чтобы отобразить матрицу беспорядка для выбранного испытания, нажмите Confusion Matrix.

Чтобы выполнить дополнительные расчеты, экспортируйте обучивший сеть в рабочую область.

  1. На панели инструментов Experiment Manager нажмите Export.

  2. В диалоговом окне введите имя переменной рабочей области для экспортируемой сети. Именем по умолчанию является trainedNetwork.

  3. Используйте экспортируемую сеть в качестве входа к функции помощника testSummary, который перечислен в Приложении 4 в конце этого примера. Например, в командном окне MATLAB, введите:

testSummary(trainedNetwork)

Эта функция оценивает сеть несколькими способами:

  • Это предсказывает метки целого набора тестов и вычисляет тестовую ошибку. Поскольку Experiment Manager определяет лучшую сеть, не подвергая сеть целому набору тестов, тестовая ошибка может быть выше, чем значение пользовательского метрического ErrorRate.

  • Это вычисляет стандартную погрешность (testErrorSE) и аппроксимированный 95%-й доверительный интервал (testError95CI) из коэффициента ошибок обобщения путем обработки классификации каждого изображения в наборе тестов как независимое событие с определенной вероятностью успеха. Используя это предположение, количество неправильно классифицированных изображений следует за биномиальным распределением. Этот метод часто называется Вальдовым методом.

  • Это отображает некоторые тестовые изображения вместе с их предсказанными классами и вероятностями тех классов.

Функция отображает сводные данные этих статистических данных в командном окне MATLAB.

******************************************
Test error rate: 0.1776
Standard error: 0.0038
95% confidence interval: [0.1701, 0.1851]
******************************************

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

  1. В таблице результатов щелкните правой кнопкой по ячейке ErrorRate лучшего испытания.

  2. Выберите Add Annotation.

  3. В панели Аннотаций введите свои наблюдения в текстовое поле.

Для получения дополнительной информации смотрите сортировку, Фильтр, и Аннотируйте Результаты Эксперимента.

Закройте эксперимент

В панели Браузера Эксперимента щелкните правой кнопкой по имени проекта и выберите Close Project. Experiment Manager закрывает все эксперименты и результаты, содержавшиеся в проекте.

Приложение 1: функция Setup

Эта функция конфигурирует обучающие данные, сетевую архитектуру и опции обучения для эксперимента.

Входной параметр

  • params структура с полями от гипертаблицы параметров Experiment Manager.

Вывод

  • augimdsTrain увеличенный datastore изображений для обучающих данных.

  • layers график слоев, который задает архитектуру нейронной сети.

  • options trainingOptions объект.

function [augimdsTrain,layers,options] = BayesOptExperiment_setup1(params)

datadir = tempdir;
downloadCIFARData(datadir);

[XTrain,YTrain,XTest,YTest] = loadCIFARData(datadir);
idx = randperm(numel(YTest),5000);
XValidation = XTest(:,:,:,idx);
YValidation = YTest(idx);

imageSize = [32 32 3];
pixelRange = [-4 4];
imageAugmenter = imageDataAugmenter( ...
    RandXReflection=true, ...
    RandXTranslation=pixelRange, ...
    RandYTranslation=pixelRange);
augimdsTrain = augmentedImageDatastore(imageSize,XTrain,YTrain, ...
    DataAugmentation=imageAugmenter);

numClasses = numel(unique(YTrain));
numF = round(16/sqrt(params.SectionDepth));
layers = [
    imageInputLayer(imageSize)

    convBlock(3,numF,params.SectionDepth)
    maxPooling2dLayer(3,Stride=2,Padding="same")

    convBlock(3,2*numF,params.SectionDepth)
    maxPooling2dLayer(3,Stride=2,Padding="same")

    convBlock(3,4*numF,params.SectionDepth)
    averagePooling2dLayer(8)

    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

miniBatchSize = 256;
validationFrequency = floor(numel(YTrain)/miniBatchSize);
options = trainingOptions("sgdm", ...
    InitialLearnRate=params.InitialLearnRate, ...
    Momentum=params.Momentum, ...
    MaxEpochs=60, ...
    LearnRateSchedule="piecewise", ...
    LearnRateDropPeriod=40, ...
    LearnRateDropFactor=0.1, ...
    MiniBatchSize=miniBatchSize, ...
    L2Regularization=params.L2Regularization, ...
    Shuffle="every-epoch", ...
    Verbose=false, ...
    ValidationData={XValidation,YValidation}, ...
    ValidationFrequency=validationFrequency);

end

Приложение 2: создайте блок сверточных слоев

Эта функция создает блок numConvLayers сверточные слои, каждый с заданным filterSize и numFilters фильтры и каждый сопровождаемый слоем нормализации партии. и слоем ReLU.

function layers = convBlock(filterSize,numFilters,numConvLayers)
layers = [
    convolution2dLayer(filterSize,numFilters,Padding="same")
    batchNormalizationLayer
    reluLayer];
layers = repmat(layers,numConvLayers,1);
end

Приложение 3: вычислите коэффициент ошибок

Эта метрическая функция берет в качестве входа структуру, которая содержит поля trainedNetwork, trainingInfo, и parameters.

  • trainedNetwork SeriesNetwork объект или DAGNetwork объект возвращен trainNetwork функция.

  • trainingInfo структура, содержащая учебную информацию, возвращенную trainNetwork функция.

  • parameters структура с полями от гипертаблицы параметров.

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

function metricOutput = ErrorRate(trialInfo)

datadir = tempdir;
[~,~,XTest,YTest] = loadCIFARData(datadir);

idx = randperm(numel(YTest),5000);
XTest = XTest(:,:,:,idx);
YTest = YTest(idx);

YPredicted = classify(trialInfo.trainedNetwork,XTest);
metricOutput = 1 - mean(YPredicted == YTest);

end

Приложение 4: обобщите тестовую статистику

Эта функция вычисляет тестовую ошибку, стандартную погрешность и аппроксимированный 95%-й доверительный интервал и отображает сводные данные этих статистических данных в командном окне MATLAB. Функция также некоторый тест отображает вместе с их предсказанными классами и вероятностями тех классов.

function testSummary(net)

datadir = tempdir;
[~,~,XTest,YTest] = loadCIFARData(datadir);

[YPredicted,probs] = classify(net,XTest);
testError = 1 - mean(YPredicted == YTest);

NTest = numel(YTest);
testErrorSE = sqrt(testError*(1-testError)/NTest);
testError95CI = [testError - 1.96*testErrorSE, testError + 1.96*testErrorSE];

fprintf('\n******************************************\n\n');
fprintf('Test error rate: %.4f\n',testError);
fprintf('Standard error: %.4f\n',testErrorSE);
fprintf('95%% confidence interval: [%.4f, %.4f]\n',testError95CI(1),testError95CI(2));
fprintf('\n******************************************\n\n');

figure
idx = randperm(numel(YTest),9);
for i = 1:numel(idx)
    subplot(3,3,i)
    imshow(XTest(:,:,:,idx(i)));
    prob = num2str(100*max(probs(idx(i),:)),3);
    predClass = char(YPredicted(idx(i)));
    label = [predClass,', ',prob,'%'];
    title(label)
end
end

Смотрите также

Приложения

Функции

Похожие темы