Этот пример показывает, как обучить агент градиента политики (PG) с базовой линией управлять динамической системой второго порядка, смоделированной в MATLAB®.
Для получения дополнительной информации об основном агенте PG без базовой линии смотрите Train в качестве примера Агент PG, чтобы Сбалансировать полюсную Корзиной Систему.
Среда обучения укрепления для этого примера является системой второго порядка, двойной интегратор с усилением. Учебная цель состоит в том, чтобы управлять положением массы в системе второго порядка путем применения входа силы.
Для этой среды:
Масса запускается в исходном положении +/-2 модуля.
Сигнал действия силы от агента до среды от -2
до 2 Н.
Наблюдения от среды являются положением и скоростью массы.
Эпизод останавливается, если масса перемещает больше, чем 5 m
от исходного положения
Вознаграждение +1 предоставлено в течение каждого такта, что полюс остается вертикальным. Штраф-5 применяется, когда маятник падает.
Вознаграждение , если в каждый такт:
где:
смещение массы от центрального положения
производная смещения положения
усилие по управлению от предыдущего временного шага.
Для получения дополнительной информации об этой модели смотрите Загрузку Предопределенные Среды Системы управления.
Создайте предопределенный интерфейс среды для маятника.
env = rlPredefinedEnv("DoubleIntegrator-Discrete")
env = DoubleIntegratorDiscreteAction with properties: Gain: 1 Ts: 0.1000 MaxDistance: 5 GoalThreshold: 0.0100 Q: [2×2 double] R: 0.0100 MaxForce: 2 State: [2×1 double]
Интерфейс имеет дискретный пробел действия, где агент может применить одно из трех возможных значений силы к массе: -2
, 0 или 2 Н.
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env); numActions = numel(actInfo.Elements);
Зафиксируйте случайный seed генератора для воспроизводимости.
rng(0);
Агент PG решает который действие взять данный наблюдения с помощью представления агента. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и один вывод (действие). Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения.
actorNetwork = [ imageInputLayer([numObservations 1 1], 'Normalization', 'none', 'Name', 'state') fullyConnectedLayer(numActions, 'Name', 'action', 'BiasLearnRateFactor', 0)];
Задайте опции для представления агента с помощью rlRepresentationOptions
.
actorOpts = rlRepresentationOptions('LearnRate',5e-3,'GradientThreshold',1);
Создайте представление агента с помощью заданной глубокой нейронной сети и опций. Необходимо также указать информацию действия и наблюдения для критика, которого вы уже получили из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
actor = rlRepresentation(actorNetwork,actorOpts,'Observation',{'state'},obsInfo,'Action',{'action'},actInfo);
Базовая линия меняется в зависимости от состояния, может уменьшать отклонение ожидаемого значения обновления и таким образом уменьшить скорость изучения для агента PG. Возможным выбором для базовой линии является оценка функции значения состояния [1].
В этом случае базовое представление является глубокой нейронной сетью с одним входом (состояние) и один вывод (значение состояния).
Создайте базовую линию подобным образом к агенту.
baselineNetwork = [ imageInputLayer([numObservations 1 1], 'Normalization', 'none', 'Name', 'state') fullyConnectedLayer(8, 'Name', 'BaselineFC') reluLayer('Name', 'CriticRelu1') fullyConnectedLayer(1, 'Name', 'BaselineFC2', 'BiasLearnRateFactor', 0)]; baselineOpts = rlRepresentationOptions('LearnRate',5e-3,'GradientThreshold',1); baseline = rlRepresentation(baselineNetwork,baselineOpts,'Observation',{'state'},obsInfo);
Чтобы создать агент PG с базовой линией, задайте опции агента PG с набором опции UseBaseline
к истинному использованию rlPGAgentOptions
.
agentOpts = rlPGAgentOptions(... 'UseBaseline',true, ... 'DiscountFactor', 0.99);
Затем создайте агент с помощью заданного представления агента, представления критика и опций агента. Для получения дополнительной информации смотрите rlPGAgent
.
agent = rlPGAgent(actor,baseline,agentOpts);
Чтобы обучить агент, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждый учебный эпизод для самое большее 1 000 эпизодов с каждым эпизодом, длящимся самое большее 200 временных шагов.
Отобразитесь учебный прогресс диалогового окна Episode Manager (установите опцию Plots
), и отключите отображение командной строки (установите опцию Verbose
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем-40 более чем 5 последовательных эпизодов. На данном этапе агент может управлять положением массы с помощью минимального усилия по управлению.
Для получения дополнительной информации смотрите rlTrainingOptions
.
trainOpts = rlTrainingOptions(... 'MaxEpisodes', 1000, ... 'MaxStepsPerEpisode', 200, ... 'Verbose', false, ... 'Plots','training-progress',... 'StopTrainingCriteria' , 'AverageReward',... 'StopTrainingValue', -45);
cartpole система может визуализироваться с 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('DoubleIntegPGBaseline.mat','agent'); end
Чтобы подтвердить производительность обученного агента, моделируйте его в двойной среде интегратора. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = -42.4086
[1] Саттон, Barto "Укрепление, Учащееся: Введение", p. 330, Нажатие MIT, Кембридж, 2-й Выпуск, 2018.
MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.