Обучите TD3 агента для управления PMSM

Этот пример демонстрирует регулирование скорости синхронного двигателя с постоянными магнитами (PMSM) с использованием агента с двойной задержкой глубокого детерминированного градиента политики (TD3).

Цель этого примера состоит в том, чтобы показать, что вы можете использовать обучение с подкреплением в качестве альтернативы линейным контроллерам, таким как ПИД-регуляторы, в регулировании скорости систем PMSM. За пределами своих областей линейности линейные контроллеры часто не дают хорошей эффективности отслеживания. В таких случаях обучение с подкреплением предоставляет нелинейную альтернативу управлению.

Загрузите параметры для этого примера.

sim_data

Откройте модель Simulink.

mdl = 'mcb_pmsm_foc_sim_RL';
open_system(mdl)

В линейной управляющей версии этого примера можно использовать ПИ-контроллеры как в скоростном, так и в токовых циклах управления. Внешний контур ПИ-контроллера может управлять скоростью, в то время как два внутренних контура ПИ-контроллеров управлять токами d-оси и q-оси. Общая цель состоит в том, чтобы отследить задающую скорость в Speed_Ref сигнал. Этот пример использует агента обучения с подкреплением для управления токами во внутреннем цикле управления, в то время как ПИ-контроллер управляет внешним контуром.

Создайте интерфейс окружения

Окружение в этом примере состоит из системы PMSM, исключая токовый контроллер внутреннего цикла, который является агентом обучения с подкреплением. Чтобы просмотреть интерфейс между агентом обучения с подкреплением и средой, откройте Подсистему управления замкнутым циклом.

open_system('mcb_pmsm_foc_sim_RL/Current Control/Control_System/Closed Loop Control')

Подсистема Обучения с Подкреплением содержит блок Агент, создание вектора наблюдения и вычисление вознаграждения.

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

  • Наблюдения являются циклическими задающими скоростями Speed_ref, скорость обратной связи Speed_fb, d-составляющие и q-составляющие токи и ошибки (id, iq, iderror и iqerror), и интегралы ошибок.

  • Действиями от агента являются напряжения vd_rl и vq_rl.

  • Значение шага расчета агента составляет 2e-4 секунды. Управление внутренним контуром происходит в другом шаге расчета, чем управление внешним контуром.

  • Симуляция выполняется в течение 5000 временных шагов, если она не завершена раньше, когда iqref сигнал насыщается на 1.

  • Вознаграждение на каждом временном шаге является:

rt=-(Q1*iderror2+Q2*iqerror2+R*jujt-12)-100d

Вот, Q1=Q2=5, и R=0.1 являются постоянными, iderror - ошибка тока по оси D, iqerror - текущая ошибка q-оси, ujt-1 являются действиями от предыдущего временного шага, и d - флаг, который равен 1, когда симуляция прекращается раньше.

Создайте наблюдения и спецификации действия для окружения. Для получения информации о создании непрерывных спецификаций смотрите rlNumericSpec.

% Create observation specifications.
numObservations = 8;
observationInfo = rlNumericSpec([numObservations 1]);
observationInfo.Name = 'observations';
observationInfo.Description = 'Information on error and reference signal';

% Create action specifications.
numActions = 2;
actionInfo = rlNumericSpec([numActions 1]); 
actionInfo.Name = 'vqdRef';

Создайте интерфейс Окружения Simulink с помощью наблюдений и спецификаций действия. Для получения дополнительной информации о создании окружений Simulink смотрите rlSimulinkEnv.

agentblk = 'mcb_pmsm_foc_sim_RL/Current Control/Control_System/Closed Loop Control/Reinforcement Learning/RL Agent';
env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);

Обеспечьте функцию сброса для этого окружения, используя ResetFcn параметр. В начале каждого эпизода тренировки resetPMSM функция случайным образом инициализирует окончательное значение задающей скорости в SpeedRef блок до 695,4 об/мин (0,2 pu), 1390,8 об/мин (0,4 pu), 2086,2 об/мин (0,6 pu) или 2781,6 об/мин (0,8 pu).

env.ResetFcn = @resetPMSM;

Создайте агента

Агент, используемый в этом примере, является агентом с двумя задержками глубокого детерминированного градиента политики (TD3). Агент TD3 аппроксимирует долгосрочное вознаграждение, учитывая наблюдения и действия, используя двух критиков. Для получения дополнительной информации об агентах TD3 смотрите Twin-Delayed Deep Deterministic Policy Gradient Agents.

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

rng(0)  % fix the random seed

statePath = [featureInputLayer(numObservations,'Normalization','none','Name','State')
    fullyConnectedLayer(64,'Name','fc1')];
actionPath = [featureInputLayer(numActions, 'Normalization', 'none', 'Name','Action')
    fullyConnectedLayer(64, 'Name','fc2')];
commonPath = [additionLayer(2,'Name','add')
    reluLayer('Name','relu2')
    fullyConnectedLayer(32, 'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(16, 'Name','fc4')
    fullyConnectedLayer(1, 'Name','CriticOutput')];
criticNetwork = layerGraph();
criticNetwork = addLayers(criticNetwork,statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,commonPath);
criticNetwork = connectLayers(criticNetwork,'fc1','add/in1');
criticNetwork = connectLayers(criticNetwork,'fc2','add/in2');

Создайте представление критика с помощью заданной нейронной сети и опций. Необходимо также указать действие и спецификацию наблюдений для критика. Для получения дополнительной информации смотрите rlQValueRepresentation.

criticOptions = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1);
critic1 = rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,...
    'Observation',{'State'},'Action',{'Action'},criticOptions);
critic2 = rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,...
    'Observation',{'State'},'Action',{'Action'},criticOptions);

Агент TD3 решает, какое действие принять, учитывая наблюдения, используя представление актера. Чтобы создать актёра, сначала создайте глубокую нейронную сеть и построите актёра аналогично критику. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation.

actorNetwork = [featureInputLayer(numObservations,'Normalization','none','Name','State')
    fullyConnectedLayer(64, 'Name','actorFC1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(32, 'Name','actorFC2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(numActions,'Name','Action')
    tanhLayer('Name','tanh1')];
actorOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1,'L2RegularizationFactor',0.001);
actor = rlDeterministicActorRepresentation(actorNetwork,observationInfo,actionInfo,...
    'Observation',{'State'},'Action',{'tanh1'},actorOptions);

Чтобы создать агента TD3, сначала задайте опции агента с помощью rlTD3AgentOptions объект. Агент обучает из буфера опыта максимальной емкости 2e6 путем случайного выбора мини-пакетов размера 512. Используйте коэффициент дисконтирования 0,995 в пользу долгосрочных вознаграждений. TD3 агенты сохраняют задержанные по времени копии актёра и критиков, известных как целевой актёр и критики. Сконфигурируйте целевые устройства для обновления каждые 10 шагов агента во время обучения с коэффициентом сглаживания 0,005.

Ts_agent = Ts;
agentOptions = rlTD3AgentOptions("SampleTime",Ts_agent, ...
    "DiscountFactor", 0.995, ...
    "ExperienceBufferLength",2e6, ...
    "MiniBatchSize",512, ...
    "NumStepsToLookAhead",1, ...
    "TargetSmoothFactor",0.005, ...
    "TargetUpdateFrequency",10);

Во время обучения агент исследует пространство действий с помощью модели Гауссова шума действия. Установите отклонение шума и скорость распада с помощью ExplorationModel свойство. Отклонение шума затухает со скоростью 2e-4, что способствует исследованиям к началу обучения и эксплуатации на более поздних стадиях. Для получения дополнительной информации о модели шума см. rlTD3AgentOptions.

agentOptions.ExplorationModel.Variance = 0.05;
agentOptions.ExplorationModel.VarianceDecayRate = 2e-4;
agentOptions.ExplorationModel.VarianceMin = 0.001;

Агент также использует модель Гауссова шума действия для сглаживания обновлений целевой политики. Задайте отклонение и скорость распада для этой модели, используя TargetPolicySmoothModel свойство.

agentOptions.TargetPolicySmoothModel.Variance = 0.1;
agentOptions.TargetPolicySmoothModel.VarianceDecayRate = 1e-4;

Создайте агента с помощью заданных актёра, критиков и опций.

agent = rlTD3Agent(actor,[critic1,critic2],agentOptions);

Обучите агента

Чтобы обучить агента, сначала задайте опции обучения с помощью rlTrainingOptions. В данном примере используйте следующие опции.

  • Запускайте каждое обучение самое большее для 1000 эпизодов с каждым эпизодом, длящимся самое большее ceil(T/Ts_agent) временные шаги.

  • Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше -190 в 100 последовательных эпизодах. На данной точке агент может отслеживать задающие скорости.

T = 1.0;
maxepisodes = 1000;
maxsteps = ceil(T/Ts_agent); 
trainingOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes, ...
    'MaxStepsPerEpisode',maxsteps, ...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-190,... 
    'ScoreAveragingWindowLength',100);

Обучите агента с помощью train функция. Обучение этого агента является интенсивным в вычислительном отношении процессом, который занимает несколько минут. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining на false. Чтобы обучить агента самостоятельно, установите doTraining на true.

doTraining = false;
if doTraining
    trainingStats = train(agent,env,trainingOpts);
else
    load('rlPMSMAgent.mat')       
end

Снимок процесса обучения показан на следующем рисунке. Вы можете ожидать различных результатов из-за случайности в процессе обучения.

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

Чтобы подтвердить производительность обученного агента, симулируйте модель и просмотрите эффективность в закрытом цикле через блок Speed Tracking Scope.

sim(mdl);

Можно также симулировать модель с различными задающими скоростями. Установите задающую скорость в блоке SpeedRef на другое значение от 0,2 до 1,0 в относительных единицах и снова симулируйте модель.

set_param('mcb_pmsm_foc_sim_RL/SpeedRef','After','0.6')
sim(mdl);

Следующий рисунок показывает пример эффективности отслеживания с обратной связью. В этой симуляции задающая скорость переходит через значения 695,4 об/мин (0,2 в относительных единицах) и 1738,5 об/мин (0,5 пу). ПИ-контроллеры и контроллеры обучения с подкреплением отслеживают изменения опорного сигнала в течение 0,5 секунд.

Несмотря на то, что агент был обучен отслеживать задающую скорость 0,2 в единицах, а не 0,5 в единицах, он смог хорошо обобщиться.

Следующий рисунок показывает соответствующую эффективность отслеживания. Агент смог отследить id и iq ссылки на токи с установившейся ошибкой менее 2%.

См. также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте