强化学习培训代理进行简单的上下文土匪问题
这个例子展示了如何解决上下文土匪问题[1]用强化学习培训DQN和问代理。这些代理的更多信息,请参阅深Q-Network (DQN)代理和q学习的代理。
在上下文土匪问题,代理人选择一个动作给最初的观察(上下文),它接收一个奖励,这一事件终止。因此,代理行为不影响下一个观察。
上下文土匪hyperparameter等可用于各种应用程序调优,推荐系统,医疗,5 g通信。
下图展示了multi-armed强盗土匪和上下文是强化学习的特殊情况。
土匪问题,环境没有动力,所以奖励只是影响动作电流和(上下文强盗)当前观测(这些问题观察也称为上下文)。
奖励和观察都不受任何环境状态(或以前的行动或观察),所以环境不演变在时间维度,没有顺序的决策。发现的问题成为一个行动最大化当前奖励(给定一个上下文,如果存在)。单臂土匪问题只是multi-armed强盗的特殊情况问题的行动是一个标量,而不是一个向量。
环境
上下文强盗环境在这个例子中定义如下:
观察(离散):{1,2}
上下文(初始观察)是随机采样。
行动(离散):{1,2,3}
奖励:
在这种环境下奖励是随机的。每一对观察和行动的概率定义如下。
请注意,代理不知道这些分布。
完成信号:由于这是一个上下文土匪问题,每集只有一个步骤。因此,完成信号总是1。
创建环境接口
创建上下文强盗环境使用ToyContextualBanditEnvironment
位于这个示例文件夹。
env = ToyContextualBanditEnvironment;obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);
解决随机发生器再现性的种子。
rng (1)
创建DQN代理
创建一个DQN代理使用一个默认的网络结构rlAgentInitializationOptions
。
agentOpts = rlDQNAgentOptions (…UseDoubleDQN = false,…TargetSmoothFactor = 1,…TargetUpdateFrequency = 4,…MiniBatchSize = 64);agentOpts.EpsilonGreedyExploration。EpsilonDecay = 0.0005;initOpts = rlAgentInitializationOptions (NumHiddenUnit = 16);DQNagent = rlDQNAgent (obsInfo actInfo、initOpts agentOpts);
火车代理
培训代理商,首先指定培训选项。对于这个示例,使用以下选项:
火车3000集。
由于这是一个上下文土匪问题,每集只有一个步骤,设置
MaxStepsPerEpisode
来1
。
有关更多信息,请参见rlTrainingOptions
。
火车代理使用火车
函数。节省时间在运行这个例子中,加载一个pre-trained代理设置doTraining
来假
。训练自己代理,集doTraining
是真正的
。
MaxEpisodes = 3000;trainOpts = rlTrainingOptions (…MaxEpisodes = MaxEpisodes,…MaxStepsPerEpisode = 1,…Verbose = false,…情节=“训练进步”,…StopTrainingCriteria =“EpisodeCount”,…StopTrainingValue = MaxEpisodes);doTraining = false;如果doTraining%火车代理env, trainingStats =火车(DQNagent trainOpts);其他的%加载pre-trained代理的例子负载(“ToyContextualBanditDQNAgent.mat”,“DQNagent”)结束
验证DQN代理
假设你知道奖励的分配,你可以计算出最优的行动。验证代理的性能通过比较这些最优行动选择的操作代理。首先,计算真正的预期回报与真正的分布。
1。每个行动的预期回报s = 1如下。
因此,最优行动是3 s = 1时。
2。每个行动的预期回报s = 2如下。
因此,最优行动是1当s = 2。
有足够的抽样,q值应接近真正期望的奖励。想象真正的预期回报。
ExpectedRewards = 0 (2、3);ExpectedRewards (1,1) = 0.3 * 5 + 0.7 * 2;ExpectedRewards (1、2) = 0.1 * 10 + 0.9 * 1;ExpectedRewards (1、3) = 3.5;ExpectedRewards (2, 1) = 0.2 * 10 + 0.8 * 2;ExpectedRewards (2, 2) = 3.0;ExpectedRewards (2、3) = 0.5 * 5 + 0.5 * 0.5;localPlotQvalues (ExpectedRewards“预期回报”)
现在,验证是否DQN代理学习最优行为。
如果状态是1,最佳的行动是3。
观察= 1;getAction (DQNagent、观察)
ans =1 x1单元阵列{[3]}
代理人选择最优行动。
如果状态是2,最优行动是1。
观察= 2;getAction (DQNagent、观察)
ans =1 x1单元阵列{[1]}
代理人选择最优行动。因此,DQN代理已经学会的最优行为。
接下来,比较核反应能量函数真正期望的奖励在选择最优的行动。
%得到评论家图(1)DQNcritic = getCritic (DQNagent);QValues = 0 (2、3);为s = 1:2 QValues(年代:)= getValue (DQNcritic{年代});结束%可视化Q值localPlotQvalues (QValues“问价值观”)
学会了q值接近真实的预期回报计算。
创建q学习的代理
接下来,火车一个q学习的代理。创建一个q学习代理,首先创建一个表,并使用来自环境的观察和操作规范。
rng (1);%的再现性qTable = rlTable (obsInfo actInfo);评论家= rlQValueFunction (qTable obsInfo actInfo);选择= rlQAgentOptions;opt.EpsilonGreedyExploration。ε= 1;opt.EpsilonGreedyExploration。EpsilonDecay = 0.0005;Qagent = rlQAgent(评论家,选择);
火车q学习的代理
节省时间在运行这个例子中,加载一个pre-trained代理设置doTraining
来假
。训练自己代理,集doTraining
来真正的
。
doTraining = false;如果doTraining%培训代理。env, trainingStats =火车(Qagent trainOpts);其他的%加载pre-trained代理的例子。负载(“ToyContextualBanditQAgent.mat”,“Qagent”)结束
验证q学习的代理
状态为1时,最优行动是3。
观察= 1;getAction (Qagent、观察)
ans =1 x1单元阵列{[3]}
代理人选择最优行动。
当国家是2,最优行动是1。
观察= 2;getAction (Qagent、观察)
ans =1 x1单元阵列{[1]}
代理人选择最优行动。因此,q学习代理已经学会的最优行为。
接下来,比较核反应能量函数真正期望的奖励在选择最优的行动。
%得到评论家图(2)Qcritic = getCritic (Qagent);QValues = 0 (2、3);为s = 1:2为a = 1:3 QValues (,) = getValue (Qcritic, {}, {});结束结束%可视化Q值localPlotQvalues (QValues“问价值观”)
再一次,学会了q值接近真实的预期回报。确定性的Q值奖励,Q (s = 1 = 3)和Q (s = 2, = 2),是一样的真正的预期回报。注意对应的q值DQN网络学习,虽然接近,不一样的真实值。这是因为DQN使用神经网络代替表内部函数的估计值。
本地函数
函数localPlotQvalues (QValues titleText)%可视化Q值图;显示亮度图像(QValues [1,4]) colormap (“秋天”甘氨胆酸)标题(titleText) colorbar集(,“Xtick”1:3,“XTickLabel”,{“一个= 1”,“= 2”,“= 3”})集(gca,“Ytick”1:2,“YTickLabel”,{“s = 1”,“s = 2”})%值图像的阴谋x = repmat(1:大小(QValues, 2),大小(QValues, 1), 1);y = repmat(1:大小(QValues, 1),大小(QValues, 2), 1) ';QValuesStr = num2cell (QValues);QValuesStr = cellfun (@num2str QValuesStr UniformOutput = false);文本(x (:), y (:), QValuesStr, HorizontalAlignment =“中心”)结束
参考
[1]萨顿,理查德·S。,安德鲁·g·Barto。强化学习:介绍。第二版。自适应计算和机器学习。剑桥,麻萨诸塞州:麻省理工学院出版社,2018年。