[RL Notes] 线性方法的特征构建

1. 粗编码

  前文中提到,对于表格型的价值函数,可以通过对状态进行独热编码来构建特征,以此转换为线性函数的形式。如果状态非常多,独热编码后的特征向量就会非常长。一种更短的编码方式是先对近似的状态进行聚合,再对聚合后的状态进行独热编码。

  状态聚合通常只将一个状态只被聚合到一个类里,但这并不是强制要求。如图 1 所示,使用若干个圆对状态空间进行划分,每个特征对应一个圆。如果状态在一个圆内,则对应的特征为 $1$,称为出席;否则对应的特征为 $0$,称为缺席。这样的 $0$-$1$ 特征称为二值特征。

图 1

  注意圆与圆之间可以有重叠,这意味着状态向量不再是独热编码,而是可以有多个 $1$。这种表示状态重叠性质的特征称为粗编码(coarse coding)。这里的关键是状态重叠,而不一定用圆进行分割或者使用二值特征。

  对状态进行粗编码后,对一个状态的更新,会影响到其他具有重叠特征的状态。例如在线性方法中使用图 1 所示的粗编码方法,每个圆对应一个特征,也就对应一个权重。训练一个状态点(图 1 中 $s$)会更新所有包含该状态点的圆(图 1 中阴影部分)对应的权重,进而影响到这些圆中的状态点(图 1 中 $s’$),这就产生了泛化。包含一个状态点的圆越多,则训练该状态的影响越大。

  通过调整圆的大小和形状,可以控制泛化的能力。如图 2 所示。使用较小的圆时,泛化的能力较弱,而区分的能力较强;使用较大的圆时,泛化的能力较强,而区分的能力较弱。也可以使用其他的形状,来控制泛化的方向,例如使用图 2 中的椭圆可以控制增强在垂直方向的泛化。

图 2

2. 瓦片编码

  瓦片编码(tile coding)是一种用于多为连续空间的粗编码,它使用重叠的网格对状态空间进行划分,每个划分称为一个覆盖,划分中的每一个元素称为一个瓦片。图 3 所示的例子中,使用 $4$ 个带有不同偏移的覆盖,每个覆盖包含 $4 \times 4 = 16$ 个瓦片,一共有 $4 \times 16 = 64$ 个瓦片。

图 3

  对于一个状态点,它在每个覆盖中只位于一个瓦片内。图 3 中有 $4$ 个覆盖,其中的状态点位于 $4$ 个瓦片内,代表了状态发生时会激活的 $4$ 个特征。对状态进行更新时,会影响包含该状态点的所有瓦片,由此带来泛化能力。使用 $1$ 个覆盖时,就会得到状态聚合。通过使用更多的瓦片覆盖,可以增强区分能力。

  类似于粗编码,通过调整瓦片的形状,也可以对泛化进行控制。如图 4 所示,使用斜条纹可以控制在对角线方向进行泛化,使用不均匀的竖条纹可以控制在水平轴上的区分程度。

图 4