计算机编程已成为我们日常生活、行业和研究中心的通用问题解决工具。 然而,事实证明,将 AI 突破融入开发系统以提高编程效率和可访问性是很困难的。 大规模语言模型最近展示了创建代码和完成简单编程任务的非凡能力。 然而,这些模型在针对更困难、未知的问题进行测试时表现不佳,这些问题需要解决问题的技能,而不仅仅是将指令转换为代码。
创建执行指定目标的代码需要搜索具有稀疏奖励信号的大型结构化程序空间。 这就是为什么竞争性编程任务需要算法和复杂自然语言的知识,而这些知识仍然非常困难。
大型变压器模型可以在使用程序合成进行竞争性编程的早期工作中获得较低的个位数求解率。 但是,它们不能可靠地为绝大多数问题提供解决方案。 此外,在现有竞争性编程数据集中的足够测试用例中,这些指标无法可靠地衡量研究进展。
为此,DeepMind 的团队引入了 AlphaCode,这是一个用于编写具有竞争力的计算机程序的系统。 AlphaCode 使用基于转换器的语言模型生成新代码,然后智能地筛选出一小部分有趣的程序。 通过应对涉及批判性思维、逻辑、算法、代码和自然语言解释组合的新挑战,AlphaCode 在编程竞赛中排名前 54%。
所有使用的模型都在 GitHub 的开源代码上进行了预训练,其中包括来自几种流行语言的代码文件:C++、C#、Go、Java、JavaScript 等等。 然后,他们在编程竞赛数据集 CodeContests 的数据集上进行了微调。 该数据集从各种来源收集数据,按时间拆分数据,以便所有训练数据早于所有评估问题,包括额外生成的测试以检查正确性,并在竞争激烈的编程环境中评估提交。
该团队将竞争性编程代码生成问题描述为序列到序列的翻译任务,当给定自然语言的问题描述 X 时,它会在编程语言中生成相应的解决方案 Y。 这种看法促使他们为 AlphaCode 使用编码器-解码器转换器架构,该架构进行建模。 问题描述 X 由架构作为一系列扁平字母(包括元数据,标记化)输入编码器。 它一次从解码器中对 Y 自回归采样一个令牌,直到到达代码令牌的末尾,此时可以构建和运行代码。
编码器-解码器设计提供双向描述表示(描述开头的标记可以关注结尾的标记)。 它还为分离编码器和解码器结构提供了更大的灵活性。 研究人员还发现,使用浅编码器和深度解码器可以提高训练效率,而不会对问题解决率产生负面影响。
使用 AlphaCode 时请按照以下步骤操作:
- 使用 GitHub 代码预训练具有传统语言建模目标的基于转换器的语言模型。
- 使用 GOLD 和回火作为训练目标,在 CodeContests 上微调模型。
- 对于每个挑战,从当前模型中生成大量样本。
- 使用示例测试和聚类根据程序行为识别样本,过滤样本以获得一小组提交(最多十个)在隐藏的测试用例上进行测试。
研究人员针对每个挑战使用许多 C++ 和 Python 程序评估了他们的模型。 此外,对它们进行过滤、聚类和重新排序,将得到的解决方案降级为一小组 10 个候选程序,以供外部评估。 他们与 Codeforces 合作,并通过重复参与最近的十场比赛来测试 AlphaCode。 这个自动化系统取代了竞争对手的试错调试、编译、测试和提交过程。
论文:https://storage.googleapis.com/deepmind-media/AlphaCode/competition_level_code_generation_with_alphacode.pdf
参考:https://deepmind.com/blog/article/Competitive-programming-with-AlphaCode
建议
More Stories
《东京恶习》制片人详述日本走向全球制作中心之路
康拉德·科尔曼仅使用可再生能源再次改变了世界
新款 MacBook Pro 为苹果一周的重大新闻画上了句号