Этот пример показывает, как создать агент глубокой Q-образовательной-сети (DQN) с помощью приложения Deep Network Designer, чтобы качаться и сбалансировать маятник, смоделированный в MATLAB®. Для получения дополнительной информации об агентах DQN смотрите Глубокие Агенты Q-сети.
Среда обучения укрепления для этого примера является простым лишенным трения маятником, который первоначально зависает в нисходящем положении. Учебная цель состоит в том, чтобы заставить маятник стоять вертикально, не запинаясь за использование и падая минимального усилия по управлению.
Для этой среды:
Восходящее сбалансированное положение маятника является радианами 0
, и нисходящее положение зависания является радианами pi
.
Сигналом действия крутящего момента от агента до среды является от -2
до 2
Nm.
Наблюдения от среды являются упрощенным полутоновым изображением маятника и угловой производной маятника.
Вознаграждение , если в каждый такт:
где:
угол смещения от вертикального положения
производная угла рассогласования
усилие по управлению от предыдущего временного шага.
Для получения дополнительной информации об этой модели смотрите Train Агент DDPG к Swing и Маятнику Баланса с Наблюдением Изображений.
Создайте предопределенный интерфейс среды для маятника.
env = rlPredefinedEnv('SimplePendulumWithImage-Discrete');
Интерфейс имеет два наблюдения. Первое наблюдение, названное "pendImage"
, 50x50 полутоновое изображение.
obsInfo = getObservationInfo(env); obsInfo(1)
ans = rlNumericSpec with properties: LowerLimit: 0 UpperLimit: 1 Name: "pendImage" Description: [0×0 string] Dimension: [50 50 1] DataType: "double"
Второе наблюдение, названное "angularRate"
, является угловой скоростью маятника.
obsInfo(2)
ans = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "angularRate" Description: [0×0 string] Dimension: [1 1] DataType: "double"
Интерфейс имеет дискретный пробел действия, где агент может применить одно из пяти возможных значений крутящего момента к маятнику: -2
,-1, 0
, 1, или 2
Nm.
actInfo = getActionInfo(env)
actInfo = rlFiniteSetSpec with properties: Elements: [-2 -1 0 1 2] Name: "torque" Description: [0×0 string] Dimension: [1 1] DataType: "double"
Зафиксируйте случайный seed генератора для воспроизводимости.
rng(0)
Агент DQN аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Для этой среды критик является глубокой нейронной сетью с тремя входными параметрами, этими двумя наблюдениями и действием и одним выводом. Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения.
Можно в интерактивном режиме создать сеть критика использование приложения Deep Network Designer. Для этого вы сначала создаете отдельные входные пути для каждого наблюдения и действия. Эти пути узнают о функциях низшего уровня из своих соответствующих входных параметров. Вы затем создаете общий вывод path, который комбинирует выходные параметры от входных путей.
Создайте путь к наблюдению изображений
Чтобы создать путь к наблюдению изображений, сначала перетащите ImageInputLayer
от панели Библиотеки Слоя до холста. Установите слой InputSize на 50,50,1
для наблюдения изображений и установите Нормализацию на none
.
Во-вторых, перетащите Convolution2DLayer
к холсту и соедините вход этого слоя к выводу ImageInputLayer
. Создайте слой свертки с фильтрами 2
(свойство NumFilters), которые имеют высоту и ширину 10
(свойство FilterSize), и используют шаг 5
в горизонтальных и вертикальных направлениях (Свойство Stride).
Наконец, завершите сеть канала передачи изображения с двумя наборами ReLULayer
и FullyConnectedLayer
. OutputSize двух слоев FullyConnectedLayer
400 и 300, соответственно.
Создайте все входные пути и Вывод Path
Создайте другие входные пути и вывод path точно так же. В данном примере используйте следующие опции:
Угловой Скоростной Путь (скалярный вход):
ImageInputLayer
: InputSize = 1,1
and Normalization
= none
FullyConnectedLayer
: OutputSize = 400
ReLULayer
FullyConnectedLayer
: OutputSize = 300
Путь к действию (скалярный вход):
ImageInputLayer
: InputSize = 1,1
and Normalization
= none
FullyConnectedLayer
: OutputSize = 300
Вывод Path:
AdditionLayer
: Соедините вывод всего входного пути к входу этого слоя.
ReLULayer
FullyConnectedLayer
: OutputSize = 1
для функции скалярного значения.
Чтобы экспортировать сеть в рабочее пространство MATLAB, в Deep Network Designer, нажимают Export. Deep Network Designer экспортирует сеть в новую переменную, содержащую сетевые слои. Можно создать представление критика с помощью этой переменной сети слоя.
Также, чтобы сгенерировать эквивалентный код MATLAB для сети, нажмите Export> Generate Code.
Сгенерированный код:
lgraph = layerGraph(); layers = [ imageInputLayer([1 1 1],"Name","torque","Normalization","none") fullyConnectedLayer(300,"Name","torque_fc1")]; lgraph = addLayers(lgraph,layers); layers = [ imageInputLayer([1 1 1],"Name","angularRate","Normalization","none") fullyConnectedLayer(400,"Name","dtheta_fc1") reluLayer("Name","dtheta_relu1") fullyConnectedLayer(300,"Name","dtheta_fc2")]; lgraph = addLayers(lgraph,layers); layers = [ imageInputLayer([50 50 1],"Name","pendImage","Normalization","none") convolution2dLayer([10 10],2,"Name","img_conv1","Stride",[5 5]) reluLayer("Name","img_relu") fullyConnectedLayer(400,"Name","theta_fc1") reluLayer("Name","theta_relu1") fullyConnectedLayer(300,"Name","theta_fc2")]; lgraph = addLayers(lgraph,layers); layers = [ additionLayer(3,"Name","addition") reluLayer("Name","relu") fullyConnectedLayer(1,"Name","stateValue")]; lgraph = addLayers(lgraph,layers); lgraph = connectLayers(lgraph,"torque_fc1","addition/in3"); lgraph = connectLayers(lgraph,"theta_fc2","addition/in1"); lgraph = connectLayers(lgraph,"dtheta_fc2","addition/in2");
Просмотрите конфигурацию сети критика.
figure plot(lgraph)
Задайте опции для представления критика с помощью rlRepresentationOptions
.
criticOpts = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
Создайте представление критика с помощью заданной глубокой нейронной сети lgraph
и опции. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
critic = rlRepresentation(lgraph,obsInfo,actInfo,'Observation',{'pendImage','angularRate'},'Action',{'torque'},criticOpts);
Чтобы создать агент DQN, сначала задайте опции агента DQN с помощью rlDQNAgentOptions
.
agentOpts = rlDQNAgentOptions(... 'UseDoubleDQN',false, ... 'TargetUpdateMethod',"smoothing", ... 'TargetSmoothFactor',1e-3, ... 'ExperienceBufferLength',1e6,... 'DiscountFactor',0.99, ... 'SampleTime',env.Ts, ... 'MiniBatchSize',64); agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1e-5;
Затем создайте агент DQN с помощью заданного представления критика и опций агента. Для получения дополнительной информации смотрите rlDQNAgent
.
agent = rlDQNAgent(critic,agentOpts);
Чтобы обучить агент, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждое обучение самое большее 1 000 эпизодов с каждым эпизодом, длящимся самое большее 500 временных шагов.
Отобразитесь учебный прогресс диалогового окна Episode Manager (установите опцию Plots
), и отключите отображение командной строки (установите опцию Verbose
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем -1000
более чем пять последовательных эпизодов. На данном этапе агент может быстро сбалансировать маятник в вертикальном положении с помощью минимального усилия по управлению.
Для получения дополнительной информации смотрите rlTrainingOptions
.
trainOpts = rlTrainingOptions(... 'MaxEpisodes',5000,... 'MaxStepsPerEpisode',500,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-1000);
Система маятника может визуализироваться с 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('MATLABPendImageDQN.mat','agent'); end
Чтобы подтвердить производительность обученного агента, моделируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = -888.9802
MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.
Deep Network Designer | rlDQNAgent