Этот пример показывает, как обучить агент Глубоко детерминированного градиента политики (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. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.