Начиная с простого лишенного трения маятника модель Simulink® этот пример показывает, как преобразовать, это к среде обучения с подкреплением взаимодействует через интерфейс, и обучает агента глубоко детерминированного градиента политики (DDPG) в этой среде.
Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики. Для примера, который обучает агента DDPG в MATLAB®, смотрите, Обучают Агента DDPG Управлять Двойной Системой Интегратора.
Стартовая модель для этого примера является простым лишенным трения маятником. Учебная цель состоит в том, чтобы заставить маятник стоять вертикально, не запинаясь за использование и падая минимального усилия по управлению.
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Откройте модель.
mdl = 'rlSimplePendulumModelBus';
open_system(mdl)
Для этой модели:
Восходящим сбалансированным положением маятника является 0
радианами и нисходящим положением зависания является pi
радианы.
Сигнал действия крутящего момента от агента до среды от -2
к 2
Nm.
Наблюдения средой являются синусом угла маятника, косинусом угла маятника и угловой производной маятника.
И сигналы наблюдения и действия являются шинами Simulink.
Вознаграждение , если на каждом временном шаге:
где:
угол смещения от вертикального положения
производная угла рассогласования
усилие по управлению от предыдущего временного шага.
Модель, используемая в этом примере, похожа на модель математического маятника, описанную в Загрузке Предопределенные окружения Simulink. Различие - то, что модель в этом примере использует шины 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;
Агент DDPG решает который действие взять данный наблюдения с помощью представления агента. Чтобы создать агента, сначала создайте глубокую нейронную сеть с тремя входными параметрами, этими тремя наблюдениями, и одним выходом, действием. Эти три наблюдения могут быть объединены с помощью concatenationLayer
.
Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения.
sinThetaInput = imageInputLayer([1 1 1],'Normalization','none','Name','sin_theta'); cosThetaInput = imageInputLayer([1 1 1],'Normalization','none','Name','cos_theta'); dThetaInput = imageInputLayer([1 1 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)
Задайте опции для представления критика с помощью rlRepresentationOptions
.
actorOptions = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1);
Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
actor = rlRepresentation(actorNetwork,obsInfo,actInfo,... 'Observation',{'sin_theta','cos_theta','dtheta'},'Action',{'ActorScaling1'},actorOptions);
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, наблюдением и действием, и одним выходом, значение акта государственной власти.
Создайте критика так же к агенту.
statePath = [ concatenationLayer(1,3,'Name','concat') fullyConnectedLayer(400,'Name','CriticStateFC1') reluLayer('Name','CriticRelu1') fullyConnectedLayer(300,'Name','CriticStateFC2')]; actionPath = [ imageInputLayer([1 1 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 = rlRepresentation(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.Variance = 0.6; agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;
Затем создайте агента DDPG с помощью заданного представления агента, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждое обучение в большей части 50000
эпизоды, с каждым эпизодом, длящимся самое большее 400
временные шаги.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots
опция), и отключают отображение командной строки (установите Verbose
опция).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем -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 pretrained agent for the example. load('SimulinkPendBusDDPG.mat','agent') end
Чтобы подтвердить производительность обученного агента, симулируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
bus2RLSpec
| rlDDPGAgent
| rlSimulinkEnv
| train