exponenta event banner

adamupdate

Обновление параметров с использованием адаптивной оценки момента (Адам)

Описание

Обновление сетевых обучаемых параметров в пользовательском учебном цикле с использованием алгоритма адаптивной оценки момента (Adam).

Примечание

Эта функция применяет алгоритм оптимизации Adam для обновления параметров сети в пользовательских учебных циклах, использующих сети, определенные как dlnetwork объекты или функции модели. При необходимости обучения сети, определенной как Layer массив или как LayerGraph, используйте следующие функции:

пример

[dlnet,averageGrad,averageSqGrad] = adamupdate(dlnet,grad,averageGrad,averageSqGrad,iteration) обновляет обучаемые параметры сети dlnet используя алгоритм Адама. Используйте этот синтаксис в учебном цикле для итеративного обновления сети, определенной как dlnetwork объект.

пример

[params,averageGrad,averageSqGrad] = adamupdate(params,grad,averageGrad,averageSqGrad,iteration) обновляет обучаемые параметры в params используя алгоритм Адама. Используйте этот синтаксис в учебном цикле для итеративного обновления обучаемых параметров сети, определенной с помощью функций.

пример

[___] = adamupdate(___learnRate,gradDecay,sqGradDecay,epsilon) также указывает значения для глобальной скорости обучения, градиентного спада, квадратного градиентного спада и малого постоянного эпсилона в дополнение к входным аргументам в предыдущих синтаксисах.

Примеры

свернуть все

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

Создайте параметры и градиенты параметров в виде числовых массивов.

params = rand(3,3,4);
grad = ones(3,3,4);

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

iteration = 1;
averageGrad = [];
averageSqGrad = [];

Задайте пользовательские значения для глобальной скорости обучения, коэффициента градиентного затухания и коэффициента градиентного затухания в квадрате.

learnRate = 0.05;
gradDecay = 0.75;
sqGradDecay = 0.95;

Обновление обучаемых параметров с помощью adamupdate.

[params,averageGrad,averageSqGrad] = adamupdate(params,grad,averageGrad,averageSqGrad,iteration,learnRate,gradDecay,sqGradDecay);

Обновить счетчик итераций.

iteration = iteration + 1;

Использовать adamupdate для обучения сети с использованием алгоритма Адама.

Загрузка данных обучения

Загрузите данные обучения по цифрам.

[XTrain,YTrain] = digitTrain4DArrayData;
classes = categories(YTrain);
numClasses = numel(classes);

Определение сети

Определите сеть и укажите среднее значение изображения с помощью 'Mean' в слое ввода изображения.

layers = [
    imageInputLayer([28 28 1], 'Name','input','Mean',mean(XTrain,4))
    convolution2dLayer(5,20,'Name','conv1')
    reluLayer('Name', 'relu1')
    convolution2dLayer(3,20,'Padding',1,'Name','conv2')
    reluLayer('Name','relu2')
    convolution2dLayer(3,20,'Padding',1,'Name','conv3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(numClasses,'Name','fc')
    softmaxLayer('Name','softmax')];
lgraph = layerGraph(layers);

Создать dlnetwork объект из графа слоев.

dlnet = dlnetwork(lgraph);

Определение функции градиентов модели

Создание вспомогательной функции modelGradients, перечисленных в конце примера. Функция принимает dlnetwork объект dlnet и мини-пакет входных данных dlX с соответствующими метками Y, и возвращает потери и градиенты потерь относительно обучаемых параметров в dlnet.

Укажите параметры обучения

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

miniBatchSize = 128;
numEpochs = 20;
numObservations = numel(YTrain);
numIterationsPerEpoch = floor(numObservations./miniBatchSize);

Обучение на GPU, если он доступен. Для использования графического процессора требуется Toolbox™ параллельных вычислений и поддерживаемое устройство графического процессора. Сведения о поддерживаемых устройствах см. в разделе Поддержка графического процессора по выпуску (Parallel Computing Toolbox).

executionEnvironment = "auto";

Визуализация хода обучения на графике.

plots = "training-progress";

Железнодорожная сеть

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

Инициализируйте график хода обучения.

if plots == "training-progress"
    figure
    lineLossTrain = animatedline('Color',[0.85 0.325 0.098]);
    ylim([0 inf])
    xlabel("Iteration")
    ylabel("Loss")
    grid on
end

Инициализируйте средние градиенты и средние градиенты в квадрате.

averageGrad = [];
averageSqGrad = [];

Обучение сети.

iteration = 0;
start = tic;

for epoch = 1:numEpochs
    % Shuffle data.
    idx = randperm(numel(YTrain));
    XTrain = XTrain(:,:,:,idx);
    YTrain = YTrain(idx);
    
    for i = 1:numIterationsPerEpoch
        iteration = iteration + 1;
        
        % Read mini-batch of data and convert the labels to dummy
        % variables.
        idx = (i-1)*miniBatchSize+1:i*miniBatchSize;
        X = XTrain(:,:,:,idx);
        
        Y = zeros(numClasses, miniBatchSize, 'single');
        for c = 1:numClasses
            Y(c,YTrain(idx)==classes(c)) = 1;
        end
        
        % Convert mini-batch of data to a dlarray.
        dlX = dlarray(single(X),'SSCB');
        
        % If training on a GPU, then convert data to a gpuArray.
        if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu"
            dlX = gpuArray(dlX);
        end
        
        % Evaluate the model gradients and loss using dlfeval and the
        % modelGradients helper function.
        [grad,loss] = dlfeval(@modelGradients,dlnet,dlX,Y);
        
        % Update the network parameters using the Adam optimizer.
        [dlnet,averageGrad,averageSqGrad] = adamupdate(dlnet,grad,averageGrad,averageSqGrad,iteration);
        
        % Display the training progress.
        if plots == "training-progress"
            D = duration(0,0,toc(start),'Format','hh:mm:ss');
            addpoints(lineLossTrain,iteration,double(gather(extractdata(loss))))
            title("Epoch: " + epoch + ", Elapsed: " + string(D))
            drawnow
        end
    end
end

Тестовая сеть

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

[XTest, YTest] = digitTest4DArrayData;

Преобразование данных в dlarray с форматом размера 'SSCB'. Для прогнозирования GPU также преобразуйте данные в gpuArray.

dlXTest = dlarray(XTest,'SSCB');
if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu"
    dlXTest = gpuArray(dlXTest);
end

Классификация изображений с помощью dlnetwork объект, используйте predict и найти классы с самыми высокими баллами.

dlYPred = predict(dlnet,dlXTest);
[~,idx] = max(extractdata(dlYPred),[],1);
YPred = classes(idx);

Оцените точность классификации.

accuracy = mean(YPred==YTest)
accuracy = 0.9896

Функция градиентов модели

modelGradients функция помощника принимает dlnetwork объект dlnet и мини-пакет входных данных dlX с соответствующими метками Yи возвращает потери и градиенты потерь относительно обучаемых параметров в dlnet. Для автоматического вычисления градиентов используйте dlgradient функция.

function [gradients,loss] = modelGradients(dlnet,dlX,Y)

    dlYPred = forward(dlnet,dlX);
    
    loss = crossentropy(dlYPred,Y);
    
    gradients = dlgradient(loss,dlnet.Learnables);
    
end

Входные аргументы

свернуть все

Сеть, указанная как dlnetwork объект.

Функция обновляет dlnet.Learnables имущества dlnetwork объект. dlnet.Learnables - таблица с тремя переменными:

  • Layer - имя слоя, указанное как строковый скаляр.

  • Parameter - имя параметра, указанное как строковый скаляр.

  • Value - значение параметра, указанное как массив ячеек, содержащий dlarray.

Входной аргумент grad должна быть таблица той же формы, что и dlnet.Learnables.

Сетевые обучаемые параметры, указанные как dlarray, числовой массив, массив ячеек, структуру или таблицу.

При указании params в качестве таблицы она должна содержать следующие три переменные:

  • Layer - имя слоя, указанное как строковый скаляр.

  • Parameter - имя параметра, указанное как строковый скаляр.

  • Value - значение параметра, указанное как массив ячеек, содержащий dlarray.

Можно указать params в качестве контейнера обучаемых параметров для сети с использованием массива ячеек, структуры или таблицы или вложенных массивов или структур ячеек. Доступные для изучения параметры в массиве, структуре или таблице ячейки должны быть dlarray или числовые значения типа данных double или single.

Входной аргумент grad должны иметь точно такой же тип данных, порядок и поля (для структур) или переменные (для таблиц), как params.

Типы данных: single | double | struct | table | cell

Градиенты потерь, указанные как dlarray, числовой массив, массив ячеек, структуру или таблицу.

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

ВходОбучаемые параметрыГрадиенты
dlnetСтол dlnet.Learnables содержа Layer, Parameter, и Value переменные. Value переменная состоит из массивов ячеек, которые содержат каждый обучаемый параметр в качестве dlarray. Таблица с тем же типом данных, переменными и порядком, что и dlnet.Learnables. grad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат градиент каждого обучаемого параметра.
paramsdlarraydlarray с тем же типом данных и порядком, что и params
Числовой массивЧисловой массив с тем же типом данных и порядком, что и params
Массив ячеекМассив ячеек с теми же типами данных, структурой и порядком, что и params
СтруктураСтруктура с теми же типами данных, полями и порядком, что и params
Таблица с Layer, Parameter, и Value переменные. Value переменная должна состоять из массивов ячеек, которые содержат каждый обучаемый параметр в качестве dlarray.Таблица с теми же типами данных, переменными и порядком, что и params. grad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат градиент каждого обучаемого параметра.

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

Скользящее среднее градиентов параметров, указанное как пустой массив, a dlarray, числовой массив, массив ячеек, структуру или таблицу.

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

ВходОбучаемые параметрыСредние градиенты
dlnetСтол dlnet.Learnables содержа Layer, Parameter, и Value переменные. Value переменная состоит из массивов ячеек, которые содержат каждый обучаемый параметр в качестве dlarray. Таблица с тем же типом данных, переменными и порядком, что и dlnet.Learnables. averageGrad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат средний градиент каждого обучаемого параметра.
paramsdlarraydlarray с тем же типом данных и порядком, что и params
Числовой массивЧисловой массив с тем же типом данных и порядком, что и params
Массив ячеекМассив ячеек с теми же типами данных, структурой и порядком, что и params
СтруктураСтруктура с теми же типами данных, полями и порядком, что и params
Таблица с Layer, Parameter, и Value переменные. Value переменная должна состоять из массивов ячеек, которые содержат каждый обучаемый параметр в качестве dlarray.Таблица с теми же типами данных, переменными и порядком, что и params. averageGrad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат средний градиент каждого обучаемого параметра.

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

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

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

ВходОбучаемые параметрыСредние квадратичные градиенты
dlnetСтол dlnet.Learnables содержа Layer, Parameter, и Value переменные. Value переменная состоит из массивов ячеек, которые содержат каждый обучаемый параметр в качестве dlarray. Таблица с тем же типом данных, переменными и порядком, что и dlnet.Learnables. averageSqGrad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат среднеквадратичный градиент каждого обучаемого параметра.
paramsdlarraydlarray с тем же типом данных и порядком, что и params
Числовой массивЧисловой массив с тем же типом данных и порядком, что и params
Массив ячеекМассив ячеек с теми же типами данных, структурой и порядком, что и params
СтруктураСтруктура с теми же типами данных, полями и порядком, что и params
Таблица с Layer, Parameter, и Value переменные. Value переменная должна состоять из массивов ячеек, которые содержат каждый обучаемый параметр в качестве dlarray.Таблица с теми же типами данных, переменными и порядком, что и params. averageSqGrad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат среднеквадратичный градиент каждого обучаемого параметра.

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

Номер итерации, указанный как положительное целое число. Для первого вызова adamupdate, используйте значение 1. Необходимо увеличить iteration около 1 для каждого последующего вызова в серии вызовов adamupdate. Алгоритм Адама использует это значение для коррекции смещения в скользящих средних в начале набора итераций.

Глобальная скорость обучения, заданная как положительный скаляр. Значение по умолчанию learnRate является 0.001.

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

Коэффициент градиентного спада, заданный как положительный скаляр между 0 и 1. Значение по умолчанию gradDecay является 0.9.

Коэффициент распада градиента в квадрате, заданный как положительный скаляр между 0 и 1. Значение по умолчанию sqGradDecay является 0.999.

Малая константа для предотвращения ошибок деления на ноль, заданная как положительный скаляр. Значение по умолчанию epsilon является 1e-8.

Выходные аргументы

свернуть все

Сеть, возвращенная как dlnetwork объект.

Функция обновляет dlnet.Learnables имущества dlnetwork объект.

Обновленные сетевые обучаемые параметры, возвращенные в виде dlarray, числовой массив, массив ячеек, структура или таблица с Value переменная, содержащая обновленные обучаемые параметры сети.

Обновленное скользящее среднее градиентов параметров, возвращаемое как dlarray, числовой массив, массив ячеек, структуру или таблицу.

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

Подробнее

свернуть все

Адам

Функция использует алгоритм адаптивной оценки момента (Адам) для обновления обучаемых параметров. Дополнительные сведения см. в определении алгоритма Адама в разделе Стохастический градиентный спуск на trainingOptions справочная страница.

Расширенные возможности

Представлен в R2019b