383. Abstraction and Reasoning Challenge | abstraction-and-reasoning-challenge
感谢 @fchollet 制作这个数据集并组织这次比赛。我认为理解和创造智能是非常有趣的,在这个问题上的工作以及阅读数据集的论文极大地改变了我对通用人工智能(AGI)的看法。当你需要亲自动手时,将先验知识和泛化能力融入模型的问题就变得非常清晰。实际上,我在比赛宣布之前就读过这篇论文,但在比赛中的工作让我对实际操作的细节有了更深入的了解。
遗憾的是,我并不觉得我的解决方案本身让我们离AGI更近了。主要组件是一个DSL(领域特定语言),它应用了142种一元变换中的最多4种(42个不同的函数,有些有不同的变体)。这个DSL通过枚举(利用去重)+ 贪婪堆叠组合器来解决。所有内容都在C++中高效实现(无依赖)并并行运行。
我的代码目前超过1万行,但(我认为)大部分都没有被使用。我将在删除未使用/弃用/失败的代码后发布它。
实际上,我一开始是手动实现了前100个训练任务,从中提取并泛化有用的函数。我制作了这些变换的暴力组合器,选择只支持从图像到单个图像的变换。最初我想要更多的类型,如位置和颜色,但结果发现将它们表示为图像(例如位置上的点或给定颜色的点)更容易。这个决定使得制作DSL变得容易得多,并在排行榜(LB)上解决了10个任务。
然后我注意到训练集、评估集和LB的分布差异很大,所以我决定将评估数据集用作训练数据。我手工编码了100个评估任务,用来添加更多的变换并改进我的DSL。我注意到接受超过1个参数的函数以超指数方式增长了我的搜索空间,而且它们通常只接受输入或输出图像大小作为第二个参数。这导致我只保留一元函数。我还添加了图像列表作为一种类型,以解决需要循环的任务。我还开始将我的DSL表示在有向无环图(DAG)中以利用去重(多个变换产生相同的输出)。这需要我重写大部分代码,但在LB上给了我14个任务。
优化、多线程、减少内存使用等在LB上给了我17个任务。通过用对角线翻转的任务增强我的样本,我的分数提升到了21。
请注意,上述(以及下述)内容是简化过的,我在写这篇文章时忘记/省略了许多细节。
我重新映射每个样本输入中的颜色,以便在样本间保持一致。一个典型的用途是当每个样本只有一种颜色,但每个样本的颜色不同时。重新着色会使它们全部相等。我通过迭代、贪婪地重新着色所有图像中最极端的颜色来实现这一点,使用的特征包括大小、对象数量或位置。因此,如果在每个样本输入中都有一个比其他所有对象都大的单色对象,我会让所有这些对象变成相同的颜色。这效果出奇地好,甚至对于我没有考虑到的情况也是如此。它甚至通过使所有输出相等,直接解决了训练集中的一些简单任务。
我通过添加沿对角线翻转的相同任务来加倍样本输入。这构成了3次完整运行(出于性能原因深度为3):一次正常,一次针对每个对角线。这个简单的添加将我从LB上的17个任务移动到21个任务(因此比所有需要进行深度4搜索而不是深度3搜索的优化更有帮助)。
我首先按照“DSL概述”中的说明生成片段。我进行片段大小的组合和变换以适应训练样本,并选择与最多训练样本一致的那个。我通过近似按复杂度排序组合来打破平局(因此将大小为WxH的片段变换为(2W)x(H+1)比(W+2)x(3H)更有可能)。输出大小在约97%的评估任务中是正确的。
详见“DSL概述”。输出大小用于为像embed这样的函数提供第二个参数,该函数将图像裁剪/填充到给定大小。