Этот пример показывает, как обучить агента глубокого детерминированного градиента политики (DDPG) управлять динамической системой второго порядка, смоделированной в MATLAB ®.
Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики. Для примера, показывающего, как обучить агента DDPG в Simulink ®, смотрите Train DDPG Agent to Swing Up and Balance Mendulum.
Окружение обучения с подкреплением для этого примера является системой двойного интегратора второго порядка с усилением. Цель обучения состоит в том, чтобы управлять положением массы в системе второго порядка путем применения входного параметра силы.
Для этого окружения:
Масса начинается с начального положения от -4 до 4 модулей.
Сигнал действия силы от агента к окружению от -2 до 2 Н.
Наблюдения от окружения являются положением и скоростью массы.
Эпизод прекращается, если масса перемещается более чем на 5 м от исходного положения или если .
Вознаграждение , предоставляемый на каждом временном шаге, является дискретизацией :
Здесь:
- вектор состояния массы.
- сила, приложенная к массе.
- веса на эффективности системы управления; .
- вес усилия по управлению; .
Для получения дополнительной информации об этой модели смотрите Загрузка предопределённых окружений системы управления.
Создайте предопределенный интерфейс окружения для системы двойного интегратора.
env = rlPredefinedEnv("DoubleIntegrator-Continuous")
env = DoubleIntegratorContinuousAction with properties: Gain: 1 Ts: 0.1000 MaxDistance: 5 GoalThreshold: 0.0100 Q: [2x2 double] R: 0.0100 MaxForce: Inf State: [2x1 double]
env.MaxForce = Inf;
Интерфейс имеет непрерывное пространство действий, где агент может применить значения силы от - Inf
на Inf
в массу.
Получите информацию о наблюдении и действии из интерфейса окружения.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env); numActions = numel(actInfo);
Исправьте начальное значение генератора для повторяемости.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, заданные наблюдения и действия, используя представление функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами (состояние и действие) и одним выходом. Для получения дополнительной информации о создании представления функции ценности нейронной сети, смотрите, Создают политику и Представления функции ценности.
statePath = imageInputLayer([numObservations 1 1],'Normalization','none','Name','state'); actionPath = imageInputLayer([numActions 1 1],'Normalization','none','Name','action'); commonPath = [concatenationLayer(1,2,'Name','concat') quadraticLayer('Name','quadratic') fullyConnectedLayer(1,'Name','StateValue','BiasLearnRateFactor',0,'Bias',0)]; criticNetwork = layerGraph(statePath); criticNetwork = addLayers(criticNetwork,actionPath); criticNetwork = addLayers(criticNetwork,commonPath); criticNetwork = connectLayers(criticNetwork,'state','concat/in1'); criticNetwork = connectLayers(criticNetwork,'action','concat/in2');
Просмотрите строение критика.
figure plot(criticNetwork)
Задайте опции для представления критика используя rlRepresentationOptions
.
criticOpts = rlRepresentationOptions('LearnRate',5e-3,'GradientThreshold',1);
Создайте представление критика с помощью заданной нейронной сети и опций. Вы также должны задать информацию о действии и наблюдении для критика, которую вы получаете из интерфейса окружения. Для получения дополнительной информации смотрите rlQValueRepresentation
.
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'state'},'Action',{'action'},criticOpts);
Агент DDPG решает, какое действие предпринять, заданные наблюдения, используя представление актера. Чтобы создать актёра, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (действие).
Построение актёра подобно критику.
actorNetwork = [ imageInputLayer([numObservations 1 1],'Normalization','none','Name','state') fullyConnectedLayer(numActions,'Name','action','BiasLearnRateFactor',0,'Bias',0)]; actorOpts = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1); actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'state'},'Action',{'action'},actorOpts);
Чтобы создать агента DDPG, сначала задайте опции агента DDPG, используя rlDDPGAgentOptions
.
agentOpts = rlDDPGAgentOptions(... 'SampleTime',env.Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6,... 'DiscountFactor',0.99,... 'MiniBatchSize',32); agentOpts.NoiseOptions.StandardDeviation = 0.3; agentOpts.NoiseOptions.StandardDeviationDecayRate = 1e-6;
Создайте агента DDPG с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции.
Запуск не более 1000 эпизодов в обучающем сеансе с каждым эпизодом, длящимся самое большее 200 временных шагов.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите Plots
опция) и отключить отображение командной строки (установите Verbose
опция).
Остановите обучение, когда агент получит совокупное вознаграждение скользящего среднего значения, больше -66. На данной точке агент может управлять положением массы, используя минимальное усилие управления.
Для получения дополнительной информации смотрите rlTrainingOptions
.
trainOpts = rlTrainingOptions(... 'MaxEpisodes', 5000, ... 'MaxStepsPerEpisode', 200, ... 'Verbose', false, ... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-66);
Можно визуализировать окружение двойного интегратора с помощью plot
функция во время обучения или симуляции.
plot(env)
Обучите агента с помощью 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('DoubleIntegDDPG.mat','agent'); end
Чтобы подтвердить производительность обученного агента, симулируйте его в среде двойного интегратора. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = single
-65.9933