В этом примере показано, как обучить агента градиента политики (PG) с базовой линией управлять динамической системой второго порядка, смоделированной в MATLAB®.
Для получения дополнительной информации об основном агенте PG без базовой линии смотрите, что пример Обучает Агента PG Балансировать полюсную Корзиной Систему.
Среда обучения с подкреплением для этого примера является системой второго порядка, двойной интегратор с усилением. Учебная цель состоит в том, чтобы управлять положением массы в системе второго порядка путем применения входа силы.
Для этой среды:
Масса запускается в исходном положении +/-2 модуля.
Сигнал действия силы от агента до среды от -
От 2 до 2 Н.
Наблюдения средой являются положением и скоростью массы.
Эпизод завершает работу, если масса перемещает больше, чем 5 m
от исходного положения или если
Вознаграждение , если на каждом временном шаге, дискретизация :
где:
вектор состояния массы.
сила, применился к массе.
веса на производительности управления.
вес на усилии по управлению.
Для получения дополнительной информации об этой модели смотрите Загрузку Предопределенные Среды Системы управления.
Создайте предопределенный интерфейс среды для маятника.
env = rlPredefinedEnv("DoubleIntegrator-Discrete")
env = DoubleIntegratorDiscreteAction with properties: Gain: 1 Ts: 0.1000 MaxDistance: 5 GoalThreshold: 0.0100 Q: [2x2 double] R: 0.0100 MaxForce: 2 State: [2x1 double]
Интерфейс имеет дискретный пробел действия, где агент может применить одно из трех возможных значений силы к массе: -2
, 0 или 2 Н.
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env); numActions = numel(actInfo.Elements);
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
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);
Двойная система интегратора может визуализироваться с 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 = -41.5626
[1] Саттон, Barto. "Обучение с подкреплением: Введение", Нажатие MIT, Кембридж, 2-й Выпуск, p. 330, 2018.