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

Для этой среды:
Уравновешенное вверх положение маятника 0 радианы, и положение подвешивания вниз pi радианы.
Сигнал воздействия крутящего момента от агента к окружающей среде составляет от -2 до 2 Н· м.
Наблюдения из окружающей среды представляют собой упрощенное изображение маятника в градациях серого и производную угла маятника.
Вознаграждение , предоставляемое на каждом шаге времени, составляет
θt2+0.1θt˙2+0.001ut-12)
Здесь:
- угол смещения из вертикального положения.
- производная угла смещения.
- контрольное усилие от предыдущего временного шага.
Дополнительные сведения об этой модели см. в разделе Подготовка агента 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 для наблюдения изображения и задайте для параметра «Нормализация» значение none.

Во-вторых, перетащите convolution2DLayer к холсту и подсоединить вход этого слоя к выходу imageInputLayer. Создание слоя свертки с помощью 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
Конструктор глубоких сетей | rlDQNAgent