Обучите политику обучения с подкреплением Используя пользовательский учебный цикл

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

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

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

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

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);

Учебный Setup

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

  • Настройте обучение продлиться самое большее 5 000 эпизодов с каждым эпизодом, длящимся самое большее 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

Симуляция

После обучения симулируйте обученную политику.

Перед симуляцией, сброс среда.

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

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

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

  • getValue — Получите предполагаемое значение состояния или функцию ценности состояния активности.

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

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

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

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

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

  • newRep = resetState(oldRep) — Сбросьте все значения состояния oldRep обнулять и возвращать результат в newRep.

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

В дополнение к этим функциям можно использовать setLossградиент, 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 политика или объект представления функции ценности параметрами θold.

  • sourceЧлен палаты представителей является политикой или объектом представления функции ценности с той же структурой как oldTargetRep, но параметрами θsource.

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

  • newTargetRep имеет ту же структуру как oldRep, но его параметры θnew=τθsource+(1-τ)θold.

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

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

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

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте