Этот пример показывает, как обучить агент Глубоко детерминированного градиента политики (DDPG) управлять динамической системой второго порядка, смоделированной в MATLAB®.
Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированные Агенты Градиента политики. Для примера, который обучает агент DDPG в Simulink®, смотрите Train Агент DDPG к Swing и Маятнику Баланса.
Среда обучения укрепления для этого примера является системой второго порядка, двойной интегратор с усилением. Учебная цель состоит в том, чтобы управлять положением массы в системе второго порядка путем применения входа силы.
Для этой среды:
Масса запускается в исходном положении +/-4 модуля.
Наблюдения от среды являются положением и скоростью массы.
Эпизод останавливается, если масса перемещает больше, чем 5 m
от исходного положения или если
Вознаграждение , если в каждый такт, дискретизация :
где:
вектор состояния массы
сила, применился к массе
Для получения дополнительной информации об этой модели смотрите Загрузку Предопределенные Среды Системы управления.
Создайте предопределенный интерфейс среды для маятника.
env = rlPredefinedEnv("DoubleIntegrator-Continuous")
env = DoubleIntegratorContinuousAction with properties: Gain: 1 Ts: 0.1000 MaxDistance: 5 GoalThreshold: 0.0100 Q: [2×2 double] R: 0.0100 MaxForce: Inf State: [2×1 double]
env.MaxForce = Inf;
Интерфейс имеет непрерывный пробел действия, где агент может применить значения силы от-Inf
до Inf
к массе.
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env); numActions = numel(actInfo);
Зафиксируйте случайный seed генератора для воспроизводимости.
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);
Создайте представление критика с помощью заданной нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
critic = rlRepresentation(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 = rlRepresentation(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.Variance = 0.3; agentOpts.NoiseOptions.VarianceDecayRate = 1e-6;
Затем создайте агент DDPG с помощью заданного представления агента, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOpts);
Чтобы обучить агент, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждый учебный эпизод для самое большее 1 000 эпизодов с каждым эпизодом, длящимся самое большее 200 временных шагов.
Отобразитесь учебный прогресс диалогового окна Episode Manager (установите опцию Plots
), и отключите отображение командной строки (установите опцию Verbose
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 195 более чем 10 последовательных эпизодов. На данном этапе агент может сбалансировать маятник в вертикальном положении.
Для получения дополнительной информации смотрите rlTrainingOptions
.
trainOpts = rlTrainingOptions(... 'MaxEpisodes', 5000, ... 'MaxStepsPerEpisode', 200, ... 'Verbose', false, ... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-66);
Двойная система интегратора может визуализироваться с plot(env)
во время обучения или симуляции.
plot(env);
Обучите агент с помощью функции 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('DoubleIntegDDPG.mat','agent'); end
Чтобы подтвердить производительность обученного агента, моделируйте его в двойной среде интегратора. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = single
-65.9933
MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.