В этом примере показано, как создать агента глубокой сети Q-обучения (DQN), который может качаться и балансировать маятник, смоделированный в MATLAB ®. В этом примере агент DQN создается с помощью Deep Network Designer. Дополнительные сведения об агентах DQN см. в разделе Агенты глубоких Q-сетей.
Окружение обучения с подкреплением для этого примера является математическим маятником без трения, который первоначально висит в нисходящем положении. Цель обучения состоит в том, чтобы сделать маятник вертикальным, не падая, используя минимальные усилия по управлению.
Для этого окружения:
Положение сбалансированного маятника вверх 0
радианы, и положение свисания вниз pi
радианы.
Сигнал действия крутящего момента от агента к окружению от -2 до 2 Н· м.
Наблюдения от окружения являются упрощенным полутоновым изображением маятника и производной угла маятника.
Вознаграждение , обеспечивается на каждом временном шаге,
Здесь:
- угол смещения из вертикального положения.
является производной от угла перемещения.
- усилие управления от предыдущего временного шага.
Для получения дополнительной информации об этой модели смотрите Обучите Агента DDPG Качанию Вверх и Балансировку Маятника с Наблюдением изображений.
Создайте предопределенный интерфейс окружения для маятника.
env = rlPredefinedEnv('SimplePendulumWithImage-Discrete');
Интерфейс имеет два наблюдения. Первое наблюдение, названное "pendImage"
, представляет собой полутоновое изображение 50 на 50.
obsInfo = getObservationInfo(env); obsInfo(1)
ans = rlNumericSpec with properties: LowerLimit: 0 UpperLimit: 1 Name: "pendImage" Description: [0x0 string] Dimension: [50 50] DataType: "double"
Второе наблюдение, названное "angularRate"
, - скорость вращения маятника.
obsInfo(2)
ans = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "angularRate" Description: [0x0 string] Dimension: [1 1] DataType: "double"
Интерфейс имеет дискретное пространство действий, где агент может применить одно из пяти возможных значений крутящего момента к маятнику: -2, -1, 0, 1 или 2 Н· м.
actInfo = getActionInfo(env)
actInfo = rlFiniteSetSpec with properties: Elements: [-2 -1 0 1 2] Name: "torque" Description: [0x0 string] Dimension: [1 1] DataType: "double"
Исправьте начальное значение генератора для повторяемости.
rng(0)
Агент DQN аппроксимирует долгосрочное вознаграждение, заданные наблюдения и действия, используя представление функции ценности критика. Для этого окружения критик является глубокой нейронной сетью с тремя входами (два наблюдения и одно действие) и одним выходом. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети, смотрите, Создают политику и представления функции ценности.
Можно создать сеть критика в интерактивном режиме с помощью приложения Deep Network Designer. Для этого сначала вы создаете отдельные входные пути для каждого наблюдения и действия. Эти пути изучают функции более низкого уровня из их соответствующих входов. Затем вы создаете общий выходной путь, который объединяет выходы из входных путей.
Создайте путь наблюдения изображений
Чтобы создать путь наблюдения изображений, сначала перетащите мышью imageInputLayer
от панели «Библиотека слоев» до холста. Установите для слоя InputSize значение 50,50,1
для наблюдения изображений и установите значение Normalization равным none
.
Во-вторых, перетащите мышью convolution2DLayer
к холсту и соедините вход этого слоя с выходом i mageInputLayer
. Создайте слой свертки с 2
фильтры (свойство NumFilters), имеющие высоту и ширину 10
(свойство FilterSize) и используйте шаг 5
в горизонтальном и вертикальном направлениях (свойство Stride).
Наконец, заполните сеть пути изображения двумя наборами reLULayer
и fullyConnectedLayer
слои. Размеры выхода первого и второго fullyConnectedLayer
слои 400 и 300, соответственно.
Создайте все входные пути и выходной путь
Создайте другие входные пути и выходной путь подобным образом. В данном примере используйте следующие опции.
Скорость вращения (скалярный вход):
imageInputLayer
- Установите значение InputSize на 1,1
и Нормализация к none
.
fullyConnectedLayer
- Установите значение OutputSize в 400
.
reLULayer
fullyConnectedLayer
- Установите значение OutputSize в 300
.
Путь действия (скалярный вход):
imageInputLayer
- Установите значение InputSize на 1,1
и Нормализация к none
.
fullyConnectedLayer
- Установите значение OutputSize в 300
.
Выходной путь:
additionLayer
- Соедините выход всех входных путей с входом этого слоя.
reLULayer
fullyConnectedLayer
- Установите значение OutputSize в 1
для функции скалярного значения.
Чтобы экспортировать сеть в рабочее пространство MATLAB, в Deep Network Designer нажмите кнопку Экспорт. Deep Network Designer экспортирует сеть как новую переменную, содержащую слои сети. Вы можете создать представление критика, используя эту сетевую переменную слоя.
Кроме того, чтобы сгенерировать эквивалентный код MATLAB для сети, щелкните Экспорт > Сгенерировать код.
Сгенерированный код следующий.
lgraph = layerGraph(); tempLayers = [ 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,tempLayers); tempLayers = [ imageInputLayer([1 1 1],"Name","torque","Normalization","none") fullyConnectedLayer(300,"Name","torque_fc1")]; lgraph = addLayers(lgraph,tempLayers); tempLayers = [ imageInputLayer([50 50 1],"Name","pendImage","Normalization","none") convolution2dLayer([10 10],2,"Name","img_conv1","Padding","same","Stride",[5 5]) reluLayer("Name","relu_1") fullyConnectedLayer(400,"Name","critic_theta_fc1") reluLayer("Name","theta_relu1") fullyConnectedLayer(300,"Name","critic_theta_fc2")]; lgraph = addLayers(lgraph,tempLayers); tempLayers = [ additionLayer(3,"Name","addition") reluLayer("Name","relu_2") fullyConnectedLayer(1,"Name","stateValue")]; lgraph = addLayers(lgraph,tempLayers); lgraph = connectLayers(lgraph,"torque_fc1","addition/in3"); lgraph = connectLayers(lgraph,"critic_theta_fc2","addition/in1"); lgraph = connectLayers(lgraph,"dtheta_fc2","addition/in2");
Просмотрите строение критика.
figure plot(lgraph)
Задайте опции для представления критика используя rlRepresentationOptions
.
criticOpts = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
Создайте представление критика с помощью заданной глубокой нейронной сети lgraph
и опции. Вы также должны задать информацию о действии и наблюдении для критика, которую вы получаете из интерфейса окружения. Для получения дополнительной информации смотрите rlQValueRepresentation
.
critic = rlQValueRepresentation(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);
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции.
Запускайте каждое обучение на самое большее 5000 эпизодах с каждым эпизодом, длящимся самое большее 500 временных шагов.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите Plots
опция) и отключить отображение командной строки (установите Verbose
опция для false
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше -1000 при длине окна по умолчанию из пяти последовательных эпизодов. На данной точке агент может быстро сбалансировать маятник в вертикальном положении с помощью минимальных усилий по управлению.
Для получения дополнительной информации смотрите rlTrainingOptions
.
trainOpts = rlTrainingOptions(... 'MaxEpisodes',5000,... 'MaxStepsPerEpisode',500,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-1000);
Можно визуализировать систему маятника во время обучения или симуляции с помощью plot
функция.
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
Deep Network Designer | rlDQNAgent