tl:dr
阅读强化学习介绍的第 9 章
当任务的维度 (MDP) 增长时,肯定会出现问题(如果你愿意的话,那就是诅咒)。为了好玩,让我们将您的问题扩展到更难的情况,连续变量,并看看我们如何处理它。
Mood: range [-1, 1] // 1 is Happy, 0 is Neutral, -1 is Sad
Hunger: range [0, 1] // 0 is Very Hungry, 1 is Full
Food: range [0, 100] // amount of food, capping at 100 for numbers sake
Time of day: [0, 23] // Hours, 9.5 would be 9:30 am
Position x: range [-10, 10] // assuming the area the agent stays in is 10x10 km
Position y: range [-10, 10]
Money: range [0, 2000]
现在甚至无法计算代理可能处于的状态数量。一种状态的示例是:
Mood, Hunger, Food, Time, PosX, PosY, Money
.5, .3, 67.4, 4.5, 0, 0, 5
这意味着我们的代理人情绪中性,有点饿,有 67.4% 的食物,时间是凌晨 4:30,他们在市中心 (0,0),有 5 美元。这在我之前也发生过一两次,所以这是合理的。如果我们仍然想生成一个转移矩阵和一个奖励矩阵,我们将不得不从其他可能相似的状态中唯一地表示这个状态,例如如果时间是下午 5 点,而其他所有条件都相同。
那么现在我们将如何处理这个问题呢?首先让我们将每个范围离散或分解成小块。然后我们可以有一个代表我们的块的 0 数组,并将 1 分配给我们所在的块的索引。让我们将此数组称为我们的特征数组。如果我们对状态信息的每个维度都这样做,我们最终会得到一些类似于你最初提出的状态。我选择了一些任意数字来分解状态空间,让我们看看它对示例状态做了什么。
如果我们将 Mood 范围分成 8 个 0.25 的块,我们将有以下范围:
m = 心情
-1.0 ≤ m < -.75
-.75 ≤ 米 < -.50
-.50 ≤ 米 < -.25
-.25 ≤ m < 0.0
0.0 ≤ m < .25
.25 ≤ 米 < .50
.50 ≤ 米 < .75
.75 ≤ 米 < 1.0
如果我们从示例状态 (.5) 中获取情绪,它将落在第 7 个范围内,因此我们的情绪特征向量将如下所示:
[0,0,0,0,0,0,1,0] <- represents a mood of .5
让我们通过将饥饿分成 8 块 0.125 来对饥饿做同样的事情:
[0,0,1,0,0,0,0,0] <- represents a hunger of .3
然后我们可以对其他状态变量做类似的事情,并将每个状态变量的范围分成 8 个大小相等的块。然后在计算它们的特征向量之后,我们将它们连接在一起,得到一个 56 个元素长的特征向量(7 个状态变量 * 每个 8 个块)。
虽然这会给我们 2^56 种不同的特征向量组合,但它实际上并不能代表我们想要表示的内容。我们需要在事件一起发生时激活(是 1)的功能。我们需要一个特征是 1 当我们饿了,当我们有食物的时候。我们可以通过将 56 个元素的特征向量与自身进行叉积来做到这一点。
现在我们有一个 3136 元素的特征向量,它具有如下特征: 1 如果它是下午 3 点并且很高兴 1 如果是饱且没有食物 1 如果在坐标 -3、4(位置 x,位置 y)
这是朝着正确方向迈出的一步,但仍不足以表示或原始示例状态。所以让我们继续使用交叉产品!
如果我们做 6 个交叉产品,我们将有 30,840,979,456 个特征,当我们的代理情绪中性、有点饿、有 67.4% 的食物、时间是凌晨 4 点 30 分、它们在中心时,其中只有一个会打开城市 (0,0),并有 5 美元。
在这一点上,您可能会喜欢“嗯.. 那有点多”,我同意。这将是维度的诅咒,也是转换表不再有趣的原因(如果它们曾经有趣的话)。
相反,让我们采取不同的方法,而不是试图用一个单独的特征来表示一个单独的状态并说这个特征是否好,让我们回到我们漂亮的 56 元素特征向量。从这里开始,让我们为我们的 56 个特征中的每一个赋予一个权重 (w_i)。我们现在已经进入了线性函数逼近的世界。虽然我可以在这里解释它,但我认为它在《强化学习简介》的第 9 章中得到了更好的解释。