自动编码器压缩(预处理)大型单热输入向量?

数据挖掘 强化学习 嵌入
2021-10-09 09:33:47

在我的 3D 游戏中,一个生物可以属于 300 个类别。我想教我的 RL 代理根据其最接近的 10 个怪物做出决定

到目前为止,我的神经网络输入向量是十个 300 维 one-hot 编码向量的串联。如果我有十个 40 维向量,那就太棒了。

那么,是否可以通过自动编码器传递一个 300 维的 one-hot 编码向量,以从自动编码器的中间抢夺其压缩版本(嵌入)?

这将允许我将几个这样的压缩嵌入连接为“总”输入(十个连接的 40D 向量),而不会使这个总输入向量膨胀。

在我的游戏中,每个 one-hot 都应该代表一个不同的类别。我的类别没有任何关联。

1)它是有效的,还是会引入不需要的假设,就像标签编码一样?

2)如何训练这个自动编码器?我可以简单地将我的 one-hots 通过它,然后进行微调,直到我在自动编码器的另一端得到一个精确的 one-hot 吗?

3)有没有更好的方式来描述几个怪物

2个回答

从正交性的角度考虑这一点可能很有用。您声明“类别不以任何方式相关”,这实际上意味着每个类别应该与所有其他类别完全正交 - 否则一个将代表至少两个类别之间的某种程度的相关(或反相关)(到这些类别不是纯粹正交的程度)。现在,获得 300 个正交向量的唯一方法是在 300 维空间中。没有办法在不丢失信息的情况下压缩它。

或者,可以考虑使用比自动编码器更简单的降维技术。让我们考虑使用 PCA(毕竟,它只是一种具有身份激活功能的线性自动编码器)。输入数据是什么样的?大概我们对每个生物都有一个观察结果,因此有 300 个观察结果。我们有 300 个功能。结果是一个 300x300 的单位矩阵。它们的奇异值都是 1,所以任何小于 300 维的 PCA 都会失败。添加非线性激活和额外的层并不能解决这个问题,它只会通过随机优化让它变得更嘈杂,所以你可能会得到一个结果——它只是没有意义。

如果你想压缩事物,你需要的是你的生物之间的一些相关结构。如果您可以提出一组生物可能具有的属性/特征,然后对所有生物进行相应的评分,您就可以对其进行一些降维——但是完全正交向量的降维并不是一件有意义的事情.

关于为什么自动编码器没有用,Leland 的回答是完全正确的。让我扩展这一点:

自动编码器和其他降维技术试图使在您的高维空间中“靠近”在一起的对象在低维空间中也靠近。通常,自动编码器学习的接近度度量会导致对后续任务有用的压缩表示,但有时可能不会。

您的类别很可能在您的游戏环境中表现出结构,其中某些类别在某些情况下表现得与某些其他类别相似。因此,降维肯定是可能的和有用的。

但是,问题在于您表示类别的方式目前没有表现出特殊的结构。每个 one-hot 编码的类别与其他所有类别的距离完全相同,因此自动编码器不可能学习任何有用的关于类别如何相对于彼此表现的信息。

这就是 ncasas 在评论中提到的嵌入层可以发挥作用的地方。嵌入层可以采用 one-hot 编码类别并学习针对手头任务优化的低维嵌入换句话说,它与架构的其余部分同时进行训练,因此它学习了最佳嵌入,以最大限度地减少网络输出的错误,这代表了您的最终目标。

不幸的是,正如您所提到的,您的架构并不完全支持这一点 - 因为您需要预先存在的嵌入,您希望将其连接起来。如果我正确地解释了这一点,那么您是说您希望将多个类别作为一个输入的一部分传递给网络。在这种情况下,您应该只使用多热编码作为嵌入层的输入。

如果我没有正确解释这一点,因为您确实需要预训练嵌入,那么请考虑这样做!如果您能找到一个将相同类别作为输入的更简单的预测任务,那么您可以在此任务上学习嵌入,然后将嵌入重用于更复杂的任务。在相关任务上重用嵌入是一种经过充分测试的方法,您可以在最近关于分类嵌入的 fast.ai 文章中了解更多信息。

要为更简单的任务生成训练数据,您可以考虑在您的环境中模拟一些简单的行为,这些行为可以很好地区分不同怪物类的行为方式。例如,您可以有一组ķ怪物在某些任务中竞争,目标是预测谁会赢。对于足够大ķ您应该能够生成一个大的、非重复的数据集。

当您学习了单个怪物的嵌入后,您可以将相关嵌入的平均值作为原始任务的网络输入。此方法用于 YouTube 推荐的深度神经网络,可能也用于其他地方。