Обучите агента DDPG качаться вверх и балансировать маятник с сигналом шины

Этот пример показывает, как преобразовать модель Simulink ® без трения в интерфейс окружения обучения с подкреплением, и обучает агента глубокого детерминированного градиента политики (DDPG) в этом окружении.

Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики. Для примера, показывающего, как обучить агента DDPG в MATLAB ®, смотрите Train DDPG Agent to Control Double Integrator System.

Модель качания маятника с шиной

Стартовая модель для этого примера является математическим маятником без трения. Цель обучения состоит в том, чтобы сделать маятник вертикальным, не падая, используя минимальные усилия по управлению.

Откройте модель.

mdl = 'rlSimplePendulumModelBus';
open_system(mdl)

Для этой модели:

  • Положение сбалансированного маятника вверх 0 радианы, и положение свисания вниз pi радианы.

  • Сигнал действия крутящего момента от агента к окружению от -2 до 2 Н· м.

  • Наблюдения от окружения являются синусом угла маятника, косинусом угла маятника и производной угла маятника.

  • И сигналы наблюдения, и сигналы действия являются шинами Simulink.

  • Вознаграждение rt, обеспечивается на каждом временном шаге,

rt=-(θt2+0.1θt˙2+0.001ut-12)

Здесь:

  • θt - угол смещения из вертикального положения.

  • θt˙ является производной от угла перемещения.

  • ut-1 - усилие управления от предыдущего временного шага.

Модель, используемая в этом примере, похожа на модель математического маятника, описанную в Load Predefined Simulink Environments. Различие в том, что модель в этом примере использует шины Simulink для сигналов действия и наблюдения.

Создайте интерфейс окружения с шиной

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

Укажите путь к блоку агента.

agentBlk = 'rlSimplePendulumModelBus/RL Agent';

Создайте Bus наблюдения объект.

obsBus = Simulink.Bus();
obs(1) = Simulink.BusElement;
obs(1).Name = 'sin_theta';
obs(2) = Simulink.BusElement;
obs(2).Name = 'cos_theta';
obs(3) = Simulink.BusElement;
obs(3).Name = 'dtheta';
obsBus.Elements = obs;

Создайте действие Bus объект.

actBus = Simulink.Bus();
act(1) = Simulink.BusElement;
act(1).Name = 'tau';
act(1).Min = -2;
act(1).Max = 2;
actBus.Elements = act;

Создайте объекты спецификаций действий и наблюдений с помощью шин Simulink.

obsInfo = bus2RLSpec('obsBus','Model',mdl);
actInfo = bus2RLSpec('actBus','Model',mdl);

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

env = rlSimulinkEnv(mdl,agentBlk,obsInfo,actInfo);

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

env.ResetFcn = @(in)setVariable(in,'theta0',pi,'Workspace',mdl);

Задайте время симуляции Tf и шаг расчета агентом Ts в секундах.

Ts = 0.05;
Tf = 20;

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

rng(0)

Создание агента DDPG

Агент DDPG решает, какое действие предпринять, заданные наблюдения, используя представление актера. Чтобы создать актёра, сначала создайте глубокую нейронную сеть с тремя входами (наблюдения) и одним выходом (действие). Три наблюдения могут быть объединены с помощью concatenationLayer.

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

sinThetaInput = featureInputLayer(1,'Normalization','none','Name','sin_theta');
cosThetaInput = featureInputLayer(1,'Normalization','none','Name','cos_theta');
dThetaInput   = featureInputLayer(1,'Normalization','none','Name','dtheta');
commonPath = [
    concatenationLayer(1,3,'Name','concat')
    fullyConnectedLayer(400, 'Name','ActorFC1')
    reluLayer('Name','ActorRelu1')
    fullyConnectedLayer(300,'Name','ActorFC2')
    reluLayer('Name','ActorRelu2')
    fullyConnectedLayer(1,'Name','ActorFC3')
    tanhLayer('Name','ActorTanh1')
    scalingLayer('Name','ActorScaling1','Scale',max(actInfo.UpperLimit))];

actorNetwork = layerGraph(sinThetaInput);
actorNetwork = addLayers(actorNetwork,cosThetaInput);
actorNetwork = addLayers(actorNetwork,dThetaInput);
actorNetwork = addLayers(actorNetwork,commonPath);
    
actorNetwork = connectLayers(actorNetwork,'sin_theta','concat/in1');
actorNetwork = connectLayers(actorNetwork,'cos_theta','concat/in2');
actorNetwork = connectLayers(actorNetwork,'dtheta','concat/in3');

Просмотр строения сети актёра.

figure
plot(actorNetwork)

Figure contains an axes. The axes contains an object of type graphplot.

Задайте опции для представления критика используя rlRepresentationOptions.

actorOptions = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1);

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

actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,...
    'Observation',{'sin_theta','cos_theta','dtheta'},'Action',{'ActorScaling1'},actorOptions);

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

Построение критика подобно актёру. Для получения дополнительной информации смотрите rlQValueRepresentation.

statePath = [
    concatenationLayer(1,3,'Name','concat')
    fullyConnectedLayer(400,'Name','CriticStateFC1')
    reluLayer('Name','CriticRelu1')
    fullyConnectedLayer(300,'Name','CriticStateFC2')];

actionPath = [
    featureInputLayer(1,'Normalization','none','Name', 'action')
    fullyConnectedLayer(300,'Name','CriticActionFC1','BiasLearnRateFactor', 0)];

commonPath = [
    additionLayer(2,'Name','add')
    reluLayer('Name','CriticCommonRelu')
    fullyConnectedLayer(1,'Name','CriticOutput')];

criticNetwork = layerGraph(sinThetaInput);
criticNetwork = addLayers(criticNetwork,cosThetaInput);
criticNetwork = addLayers(criticNetwork,dThetaInput);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,statePath);
criticNetwork = addLayers(criticNetwork,commonPath);

criticNetwork = connectLayers(criticNetwork,'sin_theta','concat/in1');
criticNetwork = connectLayers(criticNetwork,'cos_theta','concat/in2');
criticNetwork = connectLayers(criticNetwork,'dtheta','concat/in3');
criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','add/in1');
criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');

criticOpts = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);

critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...
                         'Observation',{'sin_theta','cos_theta','dtheta'},'Action',{'action'},criticOpts);

Чтобы создать агента DDPG, сначала задайте опции агента DDPG, используя rlDDPGAgentOptions.

agentOpts = rlDDPGAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6,...
    'DiscountFactor',0.99,...
    'MiniBatchSize',128);
agentOpts.NoiseOptions.StandardDeviation = 0.6;
agentOpts.NoiseOptions.StandardDeviationDecayRate = 1e-5;

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

agent = rlDDPGAgent(actor,critic,agentOpts);

Обучите агента

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

  • Запускайте каждое обучение самое большее для 50000 эпизодов с каждым эпизодом, длящимся самое большее ceil(Tf/Ts) временные шаги.

  • Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите Plots опция) и отключить отображение командной строки (установите Verbose опция для false).

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

  • Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше -740.

Для получения дополнительной информации смотрите rlTrainingOptions.

maxepisodes = 5000;
maxsteps = ceil(Tf/Ts);
trainOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'ScoreAveragingWindowLength',5,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-740);

Обучите агента с помощью train функция. Обучение этого агента является интенсивным в вычислительном отношении процессом, который занимает несколько часов. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining на false. Чтобы обучить агента самостоятельно, установите doTraining на true.

doTraining = false;
if doTraining
    % Train the agent.
    trainingStats = train(agent,env,trainOpts);
else
    % Load the pretrained agent for the example.
    load('SimulinkPendBusDDPG.mat','agent')
end

Моделирование агента DDPG

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

simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);

Figure Simple Pendulum Visualizer contains an axes. The axes contains 2 objects of type line, rectangle.

См. также

| | |

Похожие темы