Создайте агента с помощью Deep Network Designer и обучите с использованием наблюдений изображений

В этом примере показано, как создать агента глубокой сети Q-обучения (DQN), который может качаться и балансировать маятник, смоделированный в MATLAB ®. В этом примере агент DQN создается с помощью Deep Network Designer. Дополнительные сведения об агентах DQN см. в разделе Агенты глубоких Q-сетей.

Качание маятника с окружением MATLAB

Окружение обучения с подкреплением для этого примера является математическим маятником без трения, который первоначально висит в нисходящем положении. Цель обучения состоит в том, чтобы сделать маятник вертикальным, не падая, используя минимальные усилия по управлению.

Для этого окружения:

  • Положение сбалансированного маятника вверх 0 радианы, и положение свисания вниз pi радианы.

  • Сигнал действия крутящего момента от агента к окружению от -2 до 2 Н· м.

  • Наблюдения от окружения являются упрощенным полутоновым изображением маятника и производной угла маятника.

  • Вознаграждение rt, обеспечивается на каждом временном шаге,

rt=-(θt2+0.1θt˙2+0.001ut-12)

Здесь:

  • θt - угол смещения из вертикального положения.

  • θt˙ является производной от угла перемещения.

  • ut-1 - усилие управления от предыдущего временного шага.

Для получения дополнительной информации об этой модели смотрите Обучите Агента 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)

Создайте сеть критика, используя Deep Network Designer

Агент 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 для функции скалярного значения.

Экспорт сети из Deep Network Designer

Чтобы экспортировать сеть в рабочее пространство 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)

Figure contains an axes. The axes contains an object of type graphplot.

Задайте опции для представления критика используя 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)

Figure Simple Pendulum Visualizer contains 2 axes. Axes 1 contains 2 objects of type line, rectangle. Axes 2 contains an object of type image.

Обучите агента с помощью 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

Симулируйте агент DQN

Чтобы подтвердить производительность обученного агента, моделируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions и sim.

simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);

Figure Simple Pendulum Visualizer contains 2 axes. Axes 1 contains 2 objects of type line, rectangle. Axes 2 contains an object of type image.

totalReward = sum(experience.Reward)
totalReward = -888.9802

См. также

|

Похожие темы