В этом примере показано, как преобразовать простой лишенный трения маятник модель Simulink® в интерфейс среды обучения с подкреплением и обучает агента глубоко детерминированного градиента политики (DDPG) в этой среде.
Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики. Для примера, показывающего, как обучить агента DDPG в MATLAB®, смотрите, Обучают Агента DDPG Управлять Двойной Системой Интегратора.
Стартовая модель для этого примера является простым лишенным трения маятником. Цель обучения должна заставить маятник стоять вертикально, не падая и используя минимальные усилия по управлению.
Откройте модель.
mdl = 'rlSimplePendulumModelBus';
open_system(mdl)
Для этой модели:
Восходящим сбалансированным положением маятника является 0
радианами и нисходящим положением зависания является pi
радианы.
Сигнал действия крутящего момента от агента до среды от –2 до 2 Н · m.
Наблюдения средой являются синусом угла маятника, косинусом угла маятника и угловой производной маятника.
И сигналы наблюдения и действия являются шинами 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;
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент 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)
Задайте опции для представления критика с помощью 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.Variance = 0.6; agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;
Затем создайте агента DDPG с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждое обучение самое большее 50 000 эпизодов с каждым эпизодом, длящимся в большей части ceil(Tf/Ts)
временные шаги.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите 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
Чтобы подтвердить производительность обученного агента, симулируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
bus2RLSpec
| rlDDPGAgent
| rlSimulinkEnv
| train