Обучите агента обучения с подкреплением в среде MDP

Этот пример показывает, как обучить агента Q-обучения для решения общего окружения марковского процесса принятия решений (MDP). Для получения дополнительной информации об этих агентах см. Раздел «Агенты Q-обучения».

Окружение MDP имеет следующий график.

Здесь:

  1. Каждый кружок представляет состояние.

  2. В каждом состоянии существует решение подняться или опуститься.

  3. Агент стартует с состояния 1.

  4. Агент получает вознаграждение, равное значению на каждом переходе в графике.

  5. Цель обучения состоит в том, чтобы собрать максимальное совокупное вознаграждение.

Создайте окружение MDP

Создайте модель MDP с восемью состояниями и двумя действиями («вверх» и «вниз»).

MDP = createMDP(8,["up";"down"]);

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

Задайте матрицы переходов и вознаграждения для MDP. Для примера следующими командами:

  • Первые две линии определяют переход от состояния 1 к состоянию 2 путем принятия мер 1 («вверх») и вознаграждение + 3 за этот переход.

  • Следующие две линии задают переход от состояния 1 к состоянию 3 путем принятия мер 2 («вниз») и вознаграждение + 1 за этот переход.

MDP.T(1,2,1) = 1;
MDP.R(1,2,1) = 3;
MDP.T(1,3,2) = 1;
MDP.R(1,3,2) = 1;

Точно так же задайте изменения состояния и вознаграждения для остальных правил в графике.

% State 2 transition and reward
MDP.T(2,4,1) = 1;
MDP.R(2,4,1) = 2;
MDP.T(2,5,2) = 1;
MDP.R(2,5,2) = 1;
% State 3 transition and reward
MDP.T(3,5,1) = 1;
MDP.R(3,5,1) = 2;
MDP.T(3,6,2) = 1;
MDP.R(3,6,2) = 4;
% State 4 transition and reward
MDP.T(4,7,1) = 1;
MDP.R(4,7,1) = 3;
MDP.T(4,8,2) = 1;
MDP.R(4,8,2) = 2;
% State 5 transition and reward
MDP.T(5,7,1) = 1;
MDP.R(5,7,1) = 1;
MDP.T(5,8,2) = 1;
MDP.R(5,8,2) = 9;
% State 6 transition and reward
MDP.T(6,7,1) = 1;
MDP.R(6,7,1) = 5;
MDP.T(6,8,2) = 1;
MDP.R(6,8,2) = 1;
% State 7 transition and reward
MDP.T(7,7,1) = 1;
MDP.R(7,7,1) = 0;
MDP.T(7,7,2) = 1;
MDP.R(7,7,2) = 0;
% State 8 transition and reward
MDP.T(8,8,1) = 1;
MDP.R(8,8,1) = 0;
MDP.T(8,8,2) = 1;
MDP.R(8,8,2) = 0;

Задайте состояния "s7" и "s8" как конечные состояния MDP.

MDP.TerminalStates = ["s7";"s8"];

Создайте окружение MDP обучения с подкреплением для этой модели процесса.

env = rlMDPEnv(MDP);

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

env.ResetFcn = @() 1;

Исправьте начальное значение генератора для повторяемости.

rng(0)

Создайте агента Q-обучения

Чтобы создать агента Q-обучения, сначала составьте Q-таблицу с помощью наблюдений и спецификаций действия от окружения MDP. Установите скорость обучения для представления равной 1.

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);
qTable = rlTable(obsInfo, actInfo);
qRepresentation = rlQValueRepresentation(qTable, obsInfo, actInfo);
qRepresentation.Options.LearnRate = 1;

Затем создайте агента Q-обучения, используя это представление таблицы, конфигурируя эпсилоново-жадное исследование. Для получения дополнительной информации о создании агентов Q-обучения смотрите rlQAgent и rlQAgentOptions.

agentOpts = rlQAgentOptions;
agentOpts.DiscountFactor = 1;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.9;
agentOpts.EpsilonGreedyExploration.EpsilonDecay = 0.01;
qAgent = rlQAgent(qRepresentation,agentOpts); %#ok<NASGU> 

Настройте агента Q-обучения

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

  • Обучайте на самое большее 500 эпизодах с каждым эпизодом, длящимся самое большее 50 временных шагов.

  • Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше на 10 для 30 последовательных эпизодов.

Для получения дополнительной информации смотрите rlTrainingOptions.

trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes = 500;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 13;
trainOpts.ScoreAveragingWindowLength = 30;

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

doTraining = false;

if doTraining
    % Train the agent.
    trainingStats = train(qAgent,env,trainOpts); %#ok<UNRCH> 
else
    % Load pretrained agent for the example.
    load('genericMDPQAgent.mat','qAgent'); 
end

Валидация результатов Q-обучения

Чтобы подтвердить результаты обучения, симулируйте агента в среде обучения с помощью sim функция. Агент успешно находит оптимальный путь, который приводит к совокупному вознаграждению 13.

Data = sim(qAgent,env);
cumulativeReward = sum(Data.Reward)
cumulativeReward = 13

Поскольку коэффициент скидки установлен на 1значения в Q-таблице обученного агента совпадают с недисконтированными возвратами окружения.

QTable = getLearnableParameters(getCritic(qAgent));
QTable{1}
ans = 8×2

   12.9874    7.0759
   -7.6425    9.9990
   10.7193    0.9090
    5.9128   -2.2466
    6.7830    8.9988
    7.5928   -5.5053
         0         0
         0         0

TrueTableValues = [13,12;5,10;11,9;3,2;1,9;5,1;0,0;0,0]
TrueTableValues = 8×2

    13    12
     5    10
    11     9
     3     2
     1     9
     5     1
     0     0
     0     0

См. также

|

Похожие темы