Этот пример показывает, как обучить агента глубокого детерминированного градиента политики (DDPG) качаться и балансировать маятник с наблюдением изображений, смоделированным в MATLAB ®.
Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики.
Окружение обучения с подкреплением для этого примера является математическим маятником без трения, который первоначально висит в нисходящем положении. Цель обучения состоит в том, чтобы сделать маятник вертикальным, не падая, используя минимальные усилия по управлению.
Для этого окружения:
Положение сбалансированного маятника вверх 0
радианы, и положение свисания вниз pi
радианы.
Сигнал действия крутящего момента от агента к окружению от -2 до 2 Н· м.
Наблюдения от окружения являются изображением, указывающим положение маятниковой массы и скорости вращения маятника.
Вознаграждение , обеспечивается на каждом временном шаге,
Здесь:
- угол смещения из вертикального положения.
является производной от угла перемещения.
- усилие управления от предыдущего временного шага.
Для получения дополнительной информации об этой модели смотрите Загрузка предопределённых окружений системы управления.
Создайте предопределенный интерфейс окружения для маятника.
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);
Раскомментируйте следующую линию, чтобы использовать графический процессор для ускорения обучения критика CNN. Дополнительные сведения о поддерживаемых графических процессорах см. в разделе Поддержка GPU по версии (Parallel Computing Toolbox).
% 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);
Раскомментируйте следующую линию, чтобы использовать графический процессор для ускорения обучения актёра 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);