В этом примере показано, как преобразовать ПИ-контроллер в watertank.slx
в агент глубокого обучения с подкреплением с градиентом детерминированной политики (DDPG). Для примера, который обучает агента DDPG в MATLAB®, смотрите, Обучают Агента DDPG Управлять Двойной Системой Интегратора.
Исходная модель для этого примера является моделью бака для воды. Цель состоит в том, чтобы управлять уровнем воды в баке. Для получения дополнительной информации о модели бака для воды, см. watertank Модель Simulink (Simulink Control Design).
Измените исходную модель, внеся следующие изменения:
Удалите ПИД-регулятор.
Вставьте блок RL Agent.
Соедините вектор наблюдения где высота бака, , и ссылочная высота.
Установите вознаграждение .
Установите сигнал завершения если .
Получившейся моделью является rlwatertank.slx
. Для получения дополнительной информации об этой модели и изменениях, смотрите, Создают окружения Simulink для Обучения с подкреплением.
open_system('rlwatertank')
Создание модели среды включает определение следующего:
Сигналы действия и наблюдения, которые агент использует для взаимодействия со средой. Для получения дополнительной информации смотрите rlNumericSpec
и rlFiniteSetSpec
.
Сигнал вознаграждения, что использование агента, чтобы измерить его успех. Для получения дополнительной информации смотрите, Задают Сигналы вознаграждения.
Задайте спецификации данных о наблюдении и действии, obsInfo
и actInfo
, соответственно.
obsInfo = rlNumericSpec([3 1],... 'LowerLimit',[-inf -inf 0 ]',... 'UpperLimit',[ inf inf inf]'); obsInfo.Name = 'observations'; obsInfo.Description = 'integrated error, error, and measured height'; numObservations = obsInfo.Dimension(1); actInfo = rlNumericSpec([1 1]); actInfo.Name = 'flow'; numActions = actInfo.Dimension(1);
Создайте объект интерфейса среды.
env = rlSimulinkEnv('rlwatertank','rlwatertank/RL Agent',... obsInfo,actInfo);
Установите пользовательскую функцию сброса, которая рандомизирует ссылочные значения для модели.
env.ResetFcn = @(in)localResetFcn(in);
Задайте время симуляции Tf
и шаг расчета агента Ts
в секундах
Ts = 1.0; Tf = 200;
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, наблюдением и действием, и одним выходом. Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения.
statePath = [ imageInputLayer([numObservations 1 1],'Normalization','none','Name','State') fullyConnectedLayer(50,'Name','CriticStateFC1') reluLayer('Name','CriticRelu1') fullyConnectedLayer(25,'Name','CriticStateFC2')]; actionPath = [ imageInputLayer([numActions 1 1],'Normalization','none','Name','Action') fullyConnectedLayer(25,'Name','CriticActionFC1')]; commonPath = [ additionLayer(2,'Name','add') reluLayer('Name','CriticCommonRelu') fullyConnectedLayer(1,'Name','CriticOutput')]; criticNetwork = layerGraph(); criticNetwork = addLayers(criticNetwork,statePath); criticNetwork = addLayers(criticNetwork,actionPath); criticNetwork = addLayers(criticNetwork,commonPath); criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','add/in1'); criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');
Просмотрите конфигурацию сети критика.
figure plot(criticNetwork)
Задайте опции для представления критика с помощью rlRepresentationOptions
.
criticOpts = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также задать спецификации действия и наблюдения для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
critic = rlRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'State'},'Action',{'Action'},criticOpts);
Агент DDPG решает который действие взять данный наблюдения с помощью представления агента. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом, наблюдением, и одним выходом, действием.
Создайте агента подобным образом как критика.
actorNetwork = [ imageInputLayer([numObservations 1 1],'Normalization','none','Name','State') fullyConnectedLayer(3, 'Name','actorFC') tanhLayer('Name','actorTanh') fullyConnectedLayer(numActions,'Name','Action') ]; actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1); actor = rlRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'State'},'Action',{'Action'},actorOptions);
Чтобы создать агента DDPG, сначала задайте опции агента DDPG с помощью rlDDPGAgentOptions
.
agentOpts = rlDDPGAgentOptions(... 'SampleTime',Ts,... 'TargetSmoothFactor',1e-3,... 'DiscountFactor',1.0, ... 'MiniBatchSize',64, ... 'ExperienceBufferLength',1e6); agentOpts.NoiseOptions.Variance = 0.3; agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;
Затем создайте агента DDPG с помощью заданного представления агента, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждое обучение в большей части 5000
эпизоды, с каждым эпизодом, длящимся самое большее 200
временные шаги.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots
опция), и отключают отображение командной строки (установите Verbose
опция).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 800 в двадцати последовательных эпизодах. На данном этапе агент может управлять уровнем воды в баке.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxepisodes = 5000; maxsteps = ceil(Tf/Ts); trainOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes, ... 'MaxStepsPerEpisode',maxsteps, ... 'ScoreAveragingWindowLength',20, ... 'Verbose',false, ... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',800);
Обучите агента с помощью 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('WaterTankDDPG.mat','agent') end
Подтвердите изученного агента против модели симуляцией.
simOpts = rlSimulationOptions('MaxSteps',maxsteps,'StopOnError','on'); experiences = sim(env,agent,simOpts);
function in = localResetFcn(in) % randomize reference signal blk = sprintf('rlwatertank/Desired \nWater Level'); h = 3*randn + 10; while h <= 0 || h >= 20 h = 3*randn + 10; end in = setBlockParameter(in,blk,'Value',num2str(h)); % randomize initial height h = 3*randn + 10; while h <= 0 || h >= 20 h = 3*randn + 10; end blk = 'rlwatertank/Water-Tank System/H'; in = setBlockParameter(in,blk,'InitialCondition',num2str(h)); end