Этот пример показывает, как обучить агента глубокого детерминированного градиента политики (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);