里使用的学习方法是actor-critic:
Actor(玩家):为了得到尽量高的reward,实现一个函数:输入state,输出action。用神经网络来近似这个函数。目标任务就是如何训练神经网络,让它的表现更好(得更高的reward)。这个网络被称为actor Critic(评委):为了训练actor,需要知道actor的表现到底怎么样,根据表现来决定对神经网络参数的调整。这就要用到强化学习中的“Q-value”、但Q-value也是一个未知的函数,所以也可以用神经网络来近似。这个网络被称为critic。
只有重力的情况是这样的
Actor-Critic的训练: Actor看到游戏目前的state,做出一个action。 Critic根据state和action两者,对actor刚才的表现打一个分数。 Actor依据critic(评委)的打分,调整自己的策略(actor神经网络参数),争取下次做得更好。 Critic根据系统给出的reward(相当于ground truth)和其他评委的打分(critic target)来调整自己的打分策略(critic神经网络参数)。 一开始actor随机表演,critic随机打分。但是由于reward的存在,critic评分越来越准,actor表现越来越好。
ccc
% 获取环境
env = CartPoleEnv;
% 获取可观察的状态
obsInfo = getObservationInfo(env);
% 获取可观察的状态维度
numObservations = obsInfo.Dimension(1);
% 获取可执行的动作
actInfo = getActionInfo(env);
rng(0)
%% 学习网络设置
criticNetwork = [
imageInputLayer([4 1 1],'Normalization','none','Name','state')
fullyConnectedLayer(32,'Name','CriticStateFC1')
reluLayer('Name','CriticRelu1')
fullyConnectedLayer(1, 'Name', 'CriticFC')];
criticOpts = rlRepresentationOptions('LearnRate',1e-2,'GradientThreshold',1);
critic = rlRepresentation(criticNetwork,obsInfo,'Observation',{'state'},criticOpts);
%%
actorNetwork = [
imageInputLayer([4 1 1],'Normalization','none','Name','state')
fullyConnectedLayer(32, 'Name','ActorStateFC1')
reluLayer('Name','ActorRelu1')
fullyConnectedLayer(2,'Name','action')];
actorOpts = rlRepresentationOptions('LearnRate',1e-2,'GradientThreshold',1);
actor = rlRepresentation(actorNetwork,obsInfo,actInfo,...
'Observation',{'state'},'Action',{'action'},actorOpts);
%%
agentOpts = rlACAgentOptions(...
'NumStepsToLookAhead',32,...
'EntropyLossWeight',0.01,...
'DiscountFactor',0.99);
agent = rlACAgent(actor,critic,agentOpts);
%%
trainOpts = rlTrainingOptions(...
'MaxEpisodes',1000,...
'MaxStepsPerEpisode', 500,...
'Verbose',false,...
'Plots','training-progress',...
'StopTrainingCriteria','AverageReward',...
'StopTrainingValue',444,...
'ScoreAveragingWindowLength',10);
%% 并行学习设置
trainOpts.UseParallel = true;
trainOpts.ParallelizationOptions.Mode = "async";
trainOpts.ParallelizationOptions.DataToSendFromWorkers = "gradients";
trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 32;
env.show=0;% 关闭图像显示
trainingStats = train(agent,env,trainOpts);
%%
env.show=1;% 打开图像显示
plot(env)
% 运行一次500步
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward);