В этом примере показано, как задать пользовательский учебный цикл для политики обучения с подкреплением. Можно использовать этот рабочий процесс, чтобы обучить политики обучения с подкреплением с собственными алгоритмами настройки вместо того, чтобы использовать одного из встроенных агентов от пакета Reinforcement Learning Toolbox™.
Используя этот рабочий процесс, можно обучить политики, которые используют любую следующую политику и представления функции ценности.
rlStochasticActorRepresentation
— Стохастическое представление актера
rlDeterministicActorRepresentation
— Детерминированное представление актера
rlValueRepresentation
— Представление критика функции ценности
rlQValueRepresentation
— Представление критика Q-функции-ценности
В этом примере стохастическая политика агента с дискретным пространством действий обучена с помощью алгоритма 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);
Сконфигурируйте обучение использовать следующие опции:
Настройте обучение продлиться самое большее 5 000 эпизодов с каждым эпизодом, длящимся самое большее 250 шагов.
Чтобы вычислить обесцененное вознаграждение, выберите коэффициент дисконтирования 0,995.
Отключите обучение после того, как максимальное количество эпизодов достигнуто или когда среднее вознаграждение через 100 эпизодов достигает значения 220.
numEpisodes = 5000; maxStepsPerEpisode = 250; discountFactor = 0.995; aveWindowSize = 100; trainingTerminationValue = 220;
Создайте вектор для хранения совокупного вознаграждения за каждый эпизод тренировки.
episodeCumulativeRewardVector = [];
Создайте фигуру для учебной визуализации с помощью hBuildFigure
функция помощника.
[trainingPlot,lineReward,lineAveReward] = hBuildFigure;
Алгоритм для пользовательского учебного цикла следующие. Для каждого эпизода:
Сбросьте среду.
Создайте буферы для того, чтобы хранить информацию опыта: наблюдения, действия и вознаграждения.
Сгенерируйте события, пока терминальное условие не произойдет. Для этого оцените политику получить действия, применить те действия к среде и получить получившиеся наблюдения и вознаграждения. Сохраните действия, наблюдения и вознаграждения в буферах.
Соберите обучающие данные как пакет событий.
Вычислите эпизод, который возвращает Монте-Карло, который является обесцененным будущим вознаграждением.
Вычислите градиент функции потерь относительно параметров представления политики.
Обновите представление актера с помощью вычисленных градиентов.
Обновите учебную визуализацию.
Отключите обучение, если политика достаточно обучена.
% 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,@actorLossFunction,... {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)
Для каждого шага симуляции выполните следующие действия.
Получите действие путем выборки от политики с помощью getAction
функция.
Шаг среда с помощью полученного значения действия.
Оконечный, если терминальное условие достигнуто.
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
функции, чтобы установить параметры и вычислить градиенты для вашей политики и представлений функции ценности.
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
политика или объект представления функции ценности параметрами .
source
Член палаты представителей является политикой или объектом представления функции ценности с той же структурой как oldTargetRep
, но параметрами .
smoothFactor
коэффициент сглаживания () для обновления.
newTargetRep
имеет ту же структуру как oldRep
, но его параметры .
Функция потерь в алгоритме REINFORCE является продуктом обесцененного вознаграждения и журналом политики, суммированной через все временные шаги. Обесцененное вознаграждение, вычисленное в пользовательском учебном цикле, должно быть изменено, чтобы сделать его совместимым для умножения с политикой.
function loss = actorLossFunction(policy, lossData) policy = policy{1}; % 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