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

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

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

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

sim_data

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

mdl = 'mcb_pmsm_foc_sim_RL';
open_system(mdl)

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

Создайте интерфейс среды

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

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

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

Для этой среды:

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

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

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

  • Симуляция запускается для 5 000 временных шагов, если она не отключена рано когда 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), 1 390,8 об/мин (0.4 pu), 2 086,2 об/мин (0.6 pu) или 2 781,6 об/мин (0.8 pu).

env.ResetFcn = @resetPMSM;

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

Агент, используемый в этом примере, является задержанным близнецами глубоко детерминированный градиент политики (TD3) агент. Агент TD3 аппроксимирует долгосрочное вознаграждение, учитывая наблюдения и действия с помощью двух критиков. Для получения дополнительной информации об агентах TD3 смотрите Задержанный Близнецами Глубоко Детерминированные Агенты Градиента политики.

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

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. В данном примере используйте следующие опции.

  • Запустите каждое обучение самое большее 1 000 эпизодов с каждым эпизодом, длящимся в большей части 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 на модуль) и 1 738,5 об/мин (0.5 pu). PI и контроллеры обучения с подкреплением отслеживают изменения опорного сигнала в течение 0,5 секунд.

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

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

Смотрите также

|

Похожие темы