exponenta event banner

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

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

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

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

Зафиксируйте начальное число случайного генератора для воспроизводимости.

rng(0)

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

Окружающая среда

В этом примере политика обучения усилению обучается в среде дискретной тележки. Цель в этой среде - сбалансировать полюс, прикладывая силы (действия) к тележке. Создание среды с помощью rlPredefinedEnv функция.

env = rlPredefinedEnv('CartPole-Discrete');

Извлеките спецификации наблюдения и действий из среды.

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

Получить количество наблюдений (numObs) и действия (numAct).

numObs = obsInfo.Dimension(1);
numAct = actInfo.Dimension(1);

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

Политика

Политика обучения усилению в этом примере является стохастической политикой дискретного действия. Он представлен глубокой нейронной сетью, которая содержит fullyConnectedLayer, reluLayer, и softmaxLayer слои. Эта сеть выводит вероятности для каждого дискретного действия, учитывая текущие наблюдения. softmaxLayer гарантирует, что представление выводит значения вероятности в диапазоне [0 1] и что все вероятности равны 1.

Создать глубокую нейронную сеть для актера.

actorNetwork = [featureInputLayer(numObs,'Normalization','none','Name','state')
                fullyConnectedLayer(24,'Name','fc1')
                reluLayer('Name','relu1')
                fullyConnectedLayer(24,'Name','fc2')
                reluLayer('Name','relu2')
                fullyConnectedLayer(2,'Name','output')
                softmaxLayer('Name','actionProb')];

Создание представления актера с помощью rlStochasticActorRepresentation объект.

actorOpts = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1);
actor = rlStochasticActorRepresentation(actorNetwork,...
    obsInfo,actInfo,'Observation','state',actorOpts);

В этом примере функция потери для политики реализована в actorLossFunction.

Установите функцию потерь с помощью setLoss функция.

actor = setLoss(actor,@actorLossFunction);

Настройка обучения

Настройте обучение для использования следующих параметров:

  • Настройте тренировку, чтобы она длилась не более 5000 эпизодов, причем каждый эпизод длится не более 250 шагов.

  • Для расчета дисконтированного вознаграждения выберите коэффициент дисконтирования 0,995.

  • Завершите обучение после достижения максимального количества эпизодов или когда среднее вознаграждение по 100 эпизодам достигнет значения 220.

numEpisodes = 5000;
maxStepsPerEpisode = 250;
discountFactor = 0.995;
aveWindowSize = 100;
trainingTerminationValue = 220;

Создайте вектор для хранения кумулятивного вознаграждения для каждого учебного эпизода.

episodeCumulativeRewardVector = [];

Создайте рисунок для визуализации обучения с помощью hBuildFigure функция помощника.

[trainingPlot,lineReward,lineAveReward] = hBuildFigure;

Индивидуальный цикл обучения

Алгоритм для пользовательского обучающего цикла выглядит следующим образом. Для каждого эпизода:

  1. Сбросьте среду.

  2. Создание буферов для хранения информации об опыте: наблюдениях, действиях и вознаграждениях.

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

  4. Сбор данных обучения в виде пакета опыта.

  5. Вычислите возврат эпизода Монте-Карло, который является дисконтированным будущим вознаграждением.

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

  7. Обновите представление актера, используя вычисленные градиенты.

  8. Обновите визуализацию обучения.

  9. Прекратить обучение, если политика достаточно обучена.

% Enable the training visualization plot.
set(trainingPlot,'Visible','on');

% Train the policy for the maximum number of episodes or until the average
% reward indicates that the policy is sufficiently trained.
for episodeCt = 1:numEpisodes
    
    % 1. Reset the environment at the start of the episode
    obs = reset(env);
    
    episodeReward = zeros(maxStepsPerEpisode,1);
    
    % 2. Create buffers to store experiences. The dimensions for each buffer
    % must be as follows.
    %
    % For observation buffer: 
    %     numberOfObservations x numberOfObservationChannels x batchSize
    %
    % For action buffer: 
    %     numberOfActions x numberOfActionChannels x batchSize
    %
    % For reward buffer: 
    %     1 x batchSize
    %
    observationBuffer = zeros(numObs,1,maxStepsPerEpisode);
    actionBuffer = zeros(numAct,1,maxStepsPerEpisode);
    rewardBuffer = zeros(1,maxStepsPerEpisode);
    
    % 3. Generate experiences for the maximum number of steps per
    % episode or until a terminal condition is reached.
    for stepCt = 1:maxStepsPerEpisode
        
        % Compute an action using the policy based on the current 
        % observation.
        action = getAction(actor,{obs});
        
        % Apply the action to the environment and obtain the resulting
        % observation and reward.
        [nextObs,reward,isdone] = step(env,action{1});
        
        % Store the action, observation, and reward experiences in buffers.
        observationBuffer(:,:,stepCt) = obs;
        actionBuffer(:,:,stepCt) = action{1};
        rewardBuffer(:,stepCt) = reward;
        
        episodeReward(stepCt) = reward;
        obs = nextObs;
        
        % Stop if a terminal condition is reached.
        if isdone
            break;
        end
        
    end
    
    % 4. Create training data. Training is performed using batch data. The
    % batch size equal to the length of the episode.
    batchSize = min(stepCt,maxStepsPerEpisode);
    observationBatch = observationBuffer(:,:,1:batchSize);
    actionBatch = actionBuffer(:,:,1:batchSize);
    rewardBatch = rewardBuffer(:,1:batchSize);

    % Compute the discounted future reward.
    discountedReturn = zeros(1,batchSize);
    for t = 1:batchSize
        G = 0;
        for k = t:batchSize
            G = G + discountFactor ^ (k-t) * rewardBatch(k);
        end
        discountedReturn(t) = G;
    end

    % 5. Organize data to pass to the loss function.
    lossData.batchSize = batchSize;
    lossData.actInfo = actInfo;
    lossData.actionBatch = actionBatch;
    lossData.discountedReturn = discountedReturn;
    
    % 6. Compute the gradient of the loss with respect to the policy
    % parameters.
    actorGradient = gradient(actor,'loss-parameters',...
        {observationBatch},lossData);
    
    % 7. Update the actor network using the computed gradients.
    actor = optimize(actor,actorGradient);

    % 8. Update the training visualization.
    episodeCumulativeReward = sum(episodeReward);
    episodeCumulativeRewardVector = cat(2,...
        episodeCumulativeRewardVector,episodeCumulativeReward);
    movingAveReward = movmean(episodeCumulativeRewardVector,...
        aveWindowSize,2);
    addpoints(lineReward,episodeCt,episodeCumulativeReward);
    addpoints(lineAveReward,episodeCt,movingAveReward(end));
    drawnow;
    
    % 9. Terminate training if the network is sufficiently trained.
    if max(movingAveReward) > trainingTerminationValue
        break
    end
    
end

Figure Cart Pole Custom Training contains an axes. The axes with title Training Progress contains 2 objects of type animatedline. These objects represent Cumulative Reward, Average Reward.

Моделирование

После обучения смоделировать обученную политику.

Перед моделированием сбросьте среду.

obs = reset(env);

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

plot(env)

Для каждого этапа моделирования выполните следующие действия.

  1. Получение действия путем выборки из политики с помощью getAction функция.

  2. Выполните шаг среды, используя полученное значение действия.

  3. Завершите работу при достижении терминального состояния.

for stepCt = 1:maxStepsPerEpisode
    
    % Select action according to trained policy
    action = getAction(actor,{obs});
        
    % Step the environment
    [nextObs,reward,isdone] = step(env,action{1});
    
    % Check for terminal condition
    if isdone
        break
    end
    
    obs = nextObs;
    
end

Figure Cart Pole Visualizer contains an axes. The axes contains 6 objects of type line, polygon.

Функции для пользовательского обучения

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

  • getValue - получение оценочного значения состояния или функции значения действия состояния.

  • getAction - Получение действия от представления актера на основе текущего наблюдения.

  • getMaxQValue - получить оценочную функцию максимального значения состояния-действия для дискретного представления Q-значения.

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

  • state = getState(rep) - Получение состояния представления rep.

  • newRep = setState(oldRep,state) - Установка состояния представления oldRepи вернуть результат в oldRep.

  • newRep = resetState(oldRep) - Сброс всех значений состояния oldRep к нулю и вернуть результат в newRep.

Можно получить и задать обучаемые параметры представления с помощью getLearnableParameters и setLearnableParameters функция, соответственно.

В дополнение к этим функциям можно использовать setLoss, gradient, optimize, и syncParameters для задания параметров и вычисления градиентов для представлений политик и функций значений.

setLoss

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

newRep = setLoss(oldRep,lossFcn)

Здесь:

  • oldRep является объектом представления политики или функции значения.

  • lossFcn является именем пользовательской функции потери или дескриптором пользовательской функции потери.

  • newRep эквивалентно oldRep, за исключением того, что функция потерь была добавлена к представлению.

gradient

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

grad = gradient(rep,"output-input",inputData)

Здесь:

  • rep является объектом представления политики или функции значения.

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

  • grad содержит вычисленные градиенты.

Для получения дополнительной информации в командной строке MATLAB введите help rl.representation.rlAbstractRepresentation.gradient.

optimize

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

newRep = optimize(oldRep,grad)

Здесь, oldRep является объектом представления политики или функции значения и grad содержит градиенты, вычисленные с помощью gradient функция. newRep имеет ту же структуру, что и oldRep, но его параметры обновляются.

syncParameters

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

newTargetRep = syncParameters(oldTargetRep,sourceRep,smoothFactor)

Здесь:

  • oldTargetRep представляет собой объект представления функции политики или значения с параметрами startold.

  • sourceRep - это объект представления политики или функции значения с той же структурой, что и oldTargetRep, но с параметрами startsource source.

  • smoothFactor представляет собой коэффициент сглаживания (start) для обновления.

  • newTargetRep имеет ту же структуру, что и oldRep, но его параметры являются, по-новому,

Функция потерь

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

function loss = actorLossFunction(policy, lossData)

    % Create the action indication matrix.
    batchSize = lossData.batchSize;
    Z = repmat(lossData.actInfo.Elements',1,batchSize);
    actionIndicationMatrix = lossData.actionBatch(:,:) == Z;
    
    % Resize the discounted return to the size of policy.
    G = actionIndicationMatrix .* lossData.discountedReturn;
    G = reshape(G,size(policy));
    
    % Round any policy values less than eps to eps.
    policy(policy < eps) = eps;
    
    % Compute the loss.
    loss = -sum(G .* log(policy),'all');
    
end

Вспомогательная функция

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

function [trainingPlot, lineReward, lineAveReward] = hBuildFigure()
    plotRatio = 16/9;
    trainingPlot = figure(...
                'Visible','off',...
                'HandleVisibility','off', ...
                'NumberTitle','off',...
                'Name','Cart Pole Custom Training');
    trainingPlot.Position(3) = plotRatio * trainingPlot.Position(4);
    
    ax = gca(trainingPlot);
    
    lineReward = animatedline(ax);
    lineAveReward = animatedline(ax,'Color','r','LineWidth',3);
    xlabel(ax,'Episode');
    ylabel(ax,'Reward');
    legend(ax,'Cumulative Reward','Average Reward','Location','northwest')
    title(ax,'Training Progress');
end

См. также

Связанные темы