Этот пример демонстрирует регулирование скорости синхронного двигателя с постоянными магнитами (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-составляющие токи и ошибки (, , и ), и интегралы ошибок.
Действиями от агента являются напряжения vd_rl
и vq_rl
.
Значение шага расчета агента составляет 2e-4 секунды. Управление внутренним контуром происходит в другом шаге расчета, чем управление внешним контуром.
Симуляция выполняется в течение 5000 временных шагов, если она не завершена раньше, когда сигнал насыщается на 1.
Вознаграждение на каждом временном шаге является:
Вот, , и являются постоянными, - ошибка тока по оси D, - текущая ошибка q-оси, являются действиями от предыдущего временного шага, и - флаг, который равен 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 в единицах, он смог хорошо обобщиться.
Следующий рисунок показывает соответствующую эффективность отслеживания. Агент смог отследить и ссылки на токи с установившейся ошибкой менее 2%.