复盘AlphaCode_风闻
code2Real-有人就有江湖,有code就有bug2022-02-17 09:04
DeepMind 的编程版 AlphaGo在 Codeforces 网站的 10 项挑战中总体排名前 54.3%,击败了 46% 的参赛者。
这一成绩给程序员群体带来了不小的压力,仿佛纺织工被纺织机淘汰的历史正在重演。
Codeforces 是一个在线编程的平台,里面有各种各样的编程题目,各种各样的比赛。它类似于国际象棋中使用的 Elo 评级系统,每周分享编程挑战和问题排名。不同于编程人员在打造商业应用程序时可能面临的任务,Codeforces 的挑战更加独立,需要对计算机科学中的算法和理论概念有更广泛的了解,一般是结合逻辑、数学和编码专业知识的非常专业的难题。
对于 AlphaCode 来说,这还只是中等难度的挑战。
在类似的十项挑战中,研究者将赛题输入 AlphaCode。然后,AlphaCode 生成大量可能的答案,并通过运行代码和检查输出来筛选这些答案,就像人类竞争对手一样。整个过程是自动的,无需人工选择最佳样本。
在解决编码问题时,AlphaCode 使用了一个非常具体的协议(protocol),这个协议决定了整个系统的 pipeline。协议规定,他们可以无限制地使用示例测试用例,因为这些是作为问题的一部分给出的。但在提交给隐藏测试用例时,他们将提交版本数限制在了 10 次以内(至多 10 次)。
在测试时,AlphaCode 经历了三个阶段。
在第一个阶段,他们使用一个大型 Transformer 模型,该模型将问题描述示例测试和一些关于问题的元数据都放在一个字符串中作为输入。然后,他们从这个模型中采样,生成大量的潜在解决方案。所以第一个阶段得到的是 100 万套可能的代码脚本。
在第二个阶段,他们用示例测试用例测试了得到的 100 万套代码,其中 99% 的代码都没有通过测试,可以直接排除。这就将可行的代码套数降到了 1000 个左右(具体数量取决于题目的难度)。
在第三个阶段,他们使用了第二个 Transformer 模型。该模型将问题描述作为输入,但它并没有试图生成代码来解决问题,而是生成测试用例输入(每个问题对应 50 个输入)。也就是说,他们并没有选择生成输入和输出对,而是生成了一些与问题相关的实际输入。所以模型可能要生成字符串、二进制数或数列(具体生成形式取决于问题类型)。
这种做法好在哪儿呢?如果两个脚本为所有 50 个测试返回相同的答案,那么它们可能使用的是相同的算法。这就可以避免浪费两次提交机会把这两个脚本都测试一下。所以在第二步得到 1000 套脚本后,他们就根据这 50 个生成的测试输入的输出对脚本进行聚类,然后从每个聚类中选出一个示例脚本,总共选出 10 个。如果这 10 个脚本中有一个通过了所有的隐藏测试,那么他们就成功地解决了这个编程问题,否则就宣告失败。
以上就是 AlphaCode 在测试时的工作原理,其中用到了两个 Transformer 模型。
在测试时发现,当对最初的 100 万个代码脚本进行采样时,将很多字段随机化是非常有帮助的。因为,通过增加原始采样池的多样性,正确答案出现的可能性就会增加。
AI在编程问题中取得的成就远远不及在围棋、《星际争霸》等游戏中取得的超越人类的成果。
初步猜测是因为编程问题比较难,而且数据比较难以获取,因为在游戏中可以无限制地产生很多模拟数据,但在编程问题上却不能这么做,需要有真实可运行的代码。
真实代码涉及两个数据集:第一个是由各种编程语言组成的公共 GitHub 库,用于预训练,数据量高达 715GB;第二个是从各个编程挑战网站(包括 codeforces)搜集的赛题,用于微调,包括问题描述、测试用例和人类程序员编写的答案。
换而言之,AI并不懂编程,也不会一行行写代码,它只是采用暴力方法筛选可能的答案。
毕竟太阳底无新事,所有的可能答案早已经存在,只是人类大脑不具备高速搜索100万个代码样本的能力。
人类程序员就象使用冷兵器的武士,需要长期的训练,才能获得辗转腾挪的身法,四两拨千斤的巧劲,希望一招致敌。
AI程序员直接就上加特林机枪,先射击再瞄准。反正是瞎猫碰上死耗子,命中率46%。
人类程序员的编程能力呈幂律分布,每一级相差一个数量级,因此,一个好的程序员顶10个甚至100个一般的程序员。
所以AI程序员排名前54%并不是什么非常优秀的成绩,要达到实用程度,至少要排名前1%。
因为有人说,把《算法》一书搞明白,你就能超过99%的程序员。
大部分人类程序员是代码搬运工,还没有到拼智力的程度,被AI打败并不是什么丢人的事,应该感到高兴,毕竟纺织工失去的只是枷锁,命运的另一扇门正在打开。
当AI能解决99%的搬运问题后,人类不得不面对真正需要拼智力的问题,低垂的果实已经摘完,只能硬着头皮啃硬骨头了。
自爱因斯坦之后,基础物理学很久没有大的进展了,因为大多数人被20世纪快速发展带来的非基础性需求分散精力,二战后除电子计算机发展迅速外,其它领域发展不尽如人意。