Этот пример показывает, как преобразовать модель Simulink ® без трения в интерфейс окружения обучения с подкреплением, и обучает агента глубокого детерминированного градиента политики (DDPG) в этом окружении.
Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики. Для примера, показывающего, как обучить агента DDPG в MATLAB ®, смотрите Train DDPG Agent to Control Double Integrator System.
Стартовая модель для этого примера является математическим маятником без трения. Цель обучения состоит в том, чтобы сделать маятник вертикальным, не падая, используя минимальные усилия по управлению.
Откройте модель.
mdl = 'rlSimplePendulumModelBus';
open_system(mdl)
Для этой модели:
Положение сбалансированного маятника вверх 0
радианы, и положение свисания вниз pi
радианы.
Сигнал действия крутящего момента от агента к окружению от -2 до 2 Н· м.
Наблюдения от окружения являются синусом угла маятника, косинусом угла маятника и производной угла маятника.
И сигналы наблюдения, и сигналы действия являются шинами Simulink.
Вознаграждение , обеспечивается на каждом временном шаге,
Здесь:
- угол смещения из вертикального положения.
является производной от угла перемещения.
- усилие управления от предыдущего временного шага.
Модель, используемая в этом примере, похожа на модель математического маятника, описанную в 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 решает, какое действие предпринять, заданные наблюдения, используя представление актера. Чтобы создать актёра, сначала создайте глубокую нейронную сеть с тремя входами (наблюдения) и одним выходом (действие). Три наблюдения могут быть объединены с помощью 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.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
Чтобы подтвердить производительность обученного агента, моделируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
bus2RLSpec
| rlDDPGAgent
| rlSimulinkEnv
| train