В этом примере показано, как обучить агент глубокого детерминированного политического градиента (DDPG) качаться вверх и уравновешивать маятник с помощью наблюдения изображения, смоделированного в MATLAB ®.
Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики (инструментарий обучения для усиления).
Среда обучения армированию для этого примера представляет собой простой бесфрикционный маятник, который первоначально висит в нижнем положении. Цель тренировки состоит в том, чтобы сделать маятник стоящим вертикально, не падая при минимальном усилии управления.
Для этой среды:
Уравновешенное вверх положение маятника 0 радианы, и положение подвешивания вниз pi радианы.
Сигнал воздействия крутящего момента от агента к окружающей среде составляет от -2 до 2 Н· м.
Наблюдения из окружающей среды представляют собой изображение, показывающее местоположение маятниковой массы и угловую скорость маятника.
Вознаграждение , предоставляемое на каждом шаге времени, составляет
θt2+0.1θt˙2+0.001ut-12)
Здесь:
- угол смещения из вертикального положения.
- производная угла смещения.
- контрольное усилие от предыдущего временного шага.
Дополнительные сведения об этой модели см. в разделе Загрузка предопределенных сред системы управления (инструментарий обучения по армированию).
Создайте предопределенный интерфейс среды для маятника.
env = rlPredefinedEnv('SimplePendulumWithImage-Continuous')env =
SimplePendlumWithImageContinuousAction with properties:
Mass: 1
RodLength: 1
RodInertia: 0
Gravity: 9.8100
DampingRatio: 0
MaximumTorque: 2
Ts: 0.0500
State: [2x1 double]
Q: [2x2 double]
R: 1.0000e-03
Интерфейс имеет непрерывное пространство действия, в котором агент может прикладывать крутящий момент от -2 до 2 Н· м.
Получение спецификации наблюдения и действия из интерфейса среды.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env);
Зафиксируйте начальное число случайного генератора для воспроизводимости.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, учитывая наблюдения и действия, используя представление функции значения критика. Чтобы создать критика, сначала создайте глубокую сверточную нейронную сеть (CNN) с тремя входами (изображение, угловая скорость и действие) и одним выходом. Дополнительные сведения о создании представлений см. в разделе Создание представлений политик и ценностных функций (инструментарий обучения усилению).
hiddenLayerSize1 = 400;
hiddenLayerSize2 = 300;
imgPath = [
imageInputLayer(obsInfo(1).Dimension,'Normalization','none','Name',obsInfo(1).Name)
convolution2dLayer(10,2,'Name','conv1','Stride',5,'Padding',0)
reluLayer('Name','relu1')
fullyConnectedLayer(2,'Name','fc1')
concatenationLayer(3,2,'Name','cat1')
fullyConnectedLayer(hiddenLayerSize1,'Name','fc2')
reluLayer('Name','relu2')
fullyConnectedLayer(hiddenLayerSize2,'Name','fc3')
additionLayer(2,'Name','add')
reluLayer('Name','relu3')
fullyConnectedLayer(1,'Name','fc4')
];
dthetaPath = [
imageInputLayer(obsInfo(2).Dimension,'Normalization','none','Name',obsInfo(2).Name)
fullyConnectedLayer(1,'Name','fc5','BiasLearnRateFactor',0,'Bias',0)
];
actPath =[
imageInputLayer(actInfo(1).Dimension,'Normalization','none','Name','action')
fullyConnectedLayer(hiddenLayerSize2,'Name','fc6','BiasLearnRateFactor',0,'Bias',zeros(hiddenLayerSize2,1))
];
criticNetwork = layerGraph(imgPath);
criticNetwork = addLayers(criticNetwork,dthetaPath);
criticNetwork = addLayers(criticNetwork,actPath);
criticNetwork = connectLayers(criticNetwork,'fc5','cat1/in2');
criticNetwork = connectLayers(criticNetwork,'fc6','add/in2');Просмотр конфигурации сети критиков.
figure plot(criticNetwork)

Укажите параметры критического представления с помощью rlRepresentationOptions(Панель инструментов для обучения усилению).
criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
Раскомментируйте следующую строку, чтобы использовать GPU для ускорения обучения критика CNN. Дополнительные сведения о поддерживаемых графических процессорах см. в разделе Поддержка графических процессоров по выпуску (Панель инструментов параллельных вычислений).
% criticOptions.UseDevice = 'gpu';Создайте критическое представление, используя указанную нейронную сеть и опции. Необходимо также указать информацию о действиях и наблюдениях для критика, которую можно получить из интерфейса среды. Дополнительные сведения см. в разделе rlQValueRepresentation(Панель инструментов для обучения усилению).
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,... 'Observation',{'pendImage','angularRate'},'Action',{'action'},criticOptions);
Агент DDPG решает, какое действие предпринять для данных наблюдений, используя представление актера. Для создания актёра сначала создать глубокую сверточную нейронную сеть (CNN) с двумя входами (изображение и угловая скорость) и одним выходом (действие).
Сконструировать актера аналогично критику.
imgPath = [
imageInputLayer(obsInfo(1).Dimension,'Normalization','none','Name',obsInfo(1).Name)
convolution2dLayer(10,2,'Name','conv1','Stride',5,'Padding',0)
reluLayer('Name','relu1')
fullyConnectedLayer(2,'Name','fc1')
concatenationLayer(3,2,'Name','cat1')
fullyConnectedLayer(hiddenLayerSize1,'Name','fc2')
reluLayer('Name','relu2')
fullyConnectedLayer(hiddenLayerSize2,'Name','fc3')
reluLayer('Name','relu3')
fullyConnectedLayer(1,'Name','fc4')
tanhLayer('Name','tanh1')
scalingLayer('Name','scale1','Scale',max(actInfo.UpperLimit))
];
dthetaPath = [
imageInputLayer(obsInfo(2).Dimension,'Normalization','none','Name',obsInfo(2).Name)
fullyConnectedLayer(1,'Name','fc5','BiasLearnRateFactor',0,'Bias',0)
];
actorNetwork = layerGraph(imgPath);
actorNetwork = addLayers(actorNetwork,dthetaPath);
actorNetwork = connectLayers(actorNetwork,'fc5','cat1/in2');
actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);Раскомментируйте следующую строку, чтобы использовать GPU для ускорения обучения актера CNN.
% actorOptions.UseDevice = 'gpu';Создайте представление актера, используя указанную нейронную сеть и опции. Дополнительные сведения см. в разделе rlDeterministicActorRepresentation(Панель инструментов для обучения усилению).
actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'pendImage','angularRate'},'Action',{'scale1'},actorOptions);
Просмотр конфигурации сети актера.
figure plot(actorNetwork)

Для создания агента DDPG сначала укажите параметры агента DDPG с помощью rlDDPGAgentOptions(Панель инструментов для обучения усилению).
agentOptions = rlDDPGAgentOptions(... 'SampleTime',env.Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6,... 'DiscountFactor',0.99,... 'MiniBatchSize',128); agentOptions.NoiseOptions.Variance = 0.6; agentOptions.NoiseOptions.VarianceDecayRate = 1e-6;
Затем создайте агента, используя указанное представление актера, представление критика и параметры агента. Дополнительные сведения см. в разделе rlDDPGAgent(Панель инструментов для обучения усилению).
agent = rlDDPGAgent(actor,critic,agentOptions);
Для обучения агента сначала укажите варианты обучения. В этом примере используются следующие параметры.
Запустите каждую тренировку максимум для 5000 эпизодов, причем каждый эпизод длится максимум 400 временных шагов.
Отображение хода обучения в диалоговом окне «Менеджер эпизодов» (установите Plots опция).
Прекратите обучение, когда агент получает скользящее среднее совокупное вознаграждение, превышающее -740 в течение десяти последовательных эпизодов. В этот момент агент может быстро сбалансировать маятник в вертикальном положении, используя минимальное усилие управления.
Дополнительные сведения см. в разделе rlTrainingOptions(Панель инструментов для обучения усилению).
maxepisodes = 5000; maxsteps = 400; trainingOptions = rlTrainingOptions(... 'MaxEpisodes',maxepisodes,... 'MaxStepsPerEpisode',maxsteps,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-740);
Маятник можно визуализировать с помощью plot функция во время обучения или моделирования.
plot(env)

Обучение агента с помощью train(Панель инструментов обучения для усиления). Обучение этого агента - интенсивный вычислительный процесс, который занимает несколько часов. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно подготовленный агент путем установки doTraining кому false. Чтобы обучить агента самостоятельно, установите doTraining кому true.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOptions); else % Load pretrained agent for the example. load('SimplePendulumWithImageDDPG.mat','agent') end

Для проверки работоспособности обучаемого агента смоделируйте его в маятниковой среде. Дополнительные сведения о моделировании агентов см. в разделе rlSimulationOptions(инструментарий для обучения по усилению) и sim(Панель инструментов для обучения усилению).
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
train(инструментарий для обучения по усилению)