关于为什么自动编码器没有用,Leland 的回答是完全正确的。让我扩展这一点:
自动编码器和其他降维技术试图使在您的高维空间中“靠近”在一起的对象在低维空间中也靠近。通常,自动编码器学习的接近度度量会导致对后续任务有用的压缩表示,但有时可能不会。
您的类别很可能在您的游戏环境中表现出结构,其中某些类别在某些情况下表现得与某些其他类别相似。因此,降维肯定是可能的和有用的。
但是,问题在于您表示类别的方式目前没有表现出特殊的结构。每个 one-hot 编码的类别与其他所有类别的距离完全相同,因此自动编码器不可能学习任何有用的关于类别如何相对于彼此表现的信息。
这就是 ncasas 在评论中提到的嵌入层可以发挥作用的地方。嵌入层可以采用 one-hot 编码类别并学习针对手头任务优化的低维嵌入。换句话说,它与架构的其余部分同时进行训练,因此它学习了最佳嵌入,以最大限度地减少网络输出的错误,这代表了您的最终目标。
不幸的是,正如您所提到的,您的架构并不完全支持这一点 - 因为您需要预先存在的嵌入,您希望将其连接起来。如果我正确地解释了这一点,那么您是说您希望将多个类别作为一个输入的一部分传递给网络。在这种情况下,您应该只使用多热编码作为嵌入层的输入。
如果我没有正确解释这一点,因为您确实需要预训练嵌入,那么请考虑这样做!如果您能找到一个将相同类别作为输入的更简单的预测任务,那么您可以在此任务上学习嵌入,然后将嵌入重用于更复杂的任务。在相关任务上重用嵌入是一种经过充分测试的方法,您可以在最近关于分类嵌入的 fast.ai 文章中了解更多信息。
要为更简单的任务生成训练数据,您可以考虑在您的环境中模拟一些简单的行为,这些行为可以很好地区分不同怪物类的行为方式。例如,您可以有一组ķ怪物在某些任务中竞争,目标是预测谁会赢。对于足够大ķ您应该能够生成一个大的、非重复的数据集。
当您学习了单个怪物的嵌入后,您可以将相关嵌入的平均值作为原始任务的网络输入。此方法用于 YouTube 推荐的深度神经网络,可能也用于其他地方。