Набор инструментов для обучения усилению в MATLAB - несколько дискретных действий - PullRequest
0 голосов
/ 23 мая 2019

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

a = [-2,0,2];
b = [-3,0,3];
[A,B]   = meshgrid(a,b);
actions = reshape(cat(2,A',B'),[],2);

Если я хочу создать отдельные действия, мне нужно преобразовать матрицу в ячейку и запустить команду:

actionInfo = rlFiniteSetSpec(num2cell(actions,2));
actionInfo.Name = 'actions';

Кроме того, в DQN у вас есть критик, состоящий из глубокой нейронной сети. Я создал критика следующим образом:

% Create a DNN for the critic:
hiddenLayerSize = 48; 
observationPath = [
    imageInputLayer([numObs 1 1],'Normalization','none',...
    'Name','observation')
    fullyConnectedLayer(hiddenLayerSize,'Name','CriticStateFC1')
    reluLayer('Name','CriticReLu1')
    fullyConnectedLayer(hiddenLayerSize,'Name','CriticStateFC2')
    additionLayer(2,'Name','add')
    reluLayer('Name','CriticCommonReLu1')
    fullyConnectedLayer(hiddenLayerSize,'Name','CriticCommonFC1')
    reluLayer('Name','CriticCommonReLu2')
    fullyConnectedLayer(1,'Name','CriticOutput')];
actionPath = [
    imageInputLayer([value 1 1],'Normalization','none','Name','action')
    fullyConnectedLayer(hiddenLayerSize,'Name','CriticActionFC1')];
% Create the layerGraph:
criticNetwork = layerGraph(observationPath);
criticNetwork = addLayers(criticNetwork,actionPath);
% Connect actionPath to obervationPath:
criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');
% Specify options for the critic representation:
criticOpts = rlRepresentationOptions('LearnRate',1e-03,...
    'GradientThreshold',1,'UseDevice','gpu');
% Create the critic representation using the specified DNN and options:
critic = rlRepresentation(criticNetwork,observationInfo,actionInfo,...
    'Observation',{'observation'},'Action',{'action'},criticOpts);
% Set the desired options for the agent:
agentOptions = rlDQNAgentOptions(...
    'SampleTime',dt,...
    'UseDoubleDQN',true,...
    'TargetSmoothFactor',1e-3,...
    'DiscountFactor',0.99,...
    'ExperienceBufferLength',1e7,...
    'MiniBatchSize',128);

Моя проблема - первый слой ввода изображения в путь действия imageInputLayer([value 1 1],'Normalization','none','Name','action'). Я пробовал значения 1, 2, 9 и 18 для value, но все это приводит к ошибке при запуске

agent = rlDQNAgent(critic,agentOptions);

Это потому, что actionInfo имеет ячейку из 9 элементов, каждый с двойным вектором измерений [1,2], тогда как imageInputLayer ожидает измерения [value,1,1].

Итак, как мне настроить агента DQN в MATLAB с двумя основными дискретными сигналами действия, каждый из которых имеет три возможных значения? Агент работает в среде Simulink. Следовательно, я не уверен, как блоки усиления Simulink отреагируют на два выхода.

Нужно ли возвращать один вектор индексов и использовать отдельную функцию для сопоставления их с правильной матрицей?

Заранее большое спасибо за помощь!

...