因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享
点击关注#互联网架构师公众号,领取架构师全套资料 都在这里
0、2T架构师学习资料干货分
上一篇:赞!ChatGPT能接入微信了!
大家好,我是互联网架构师!
来源|量子位(ID:QbitAI)报道
最近这些天,ChatGPT可以说爆火了,一时间在互联网上被讨论得热火朝天。
而今天要聊的主角不是ChatGPT,而是隔壁另外一个AI编程系统AlphaCode。
因为正当ChatGPT爆火之际,那个曾经卷趴一半程序员的AlphaCode最近也登上了Science封面!
伴随着各种AI系统在网上爆火,有网友调侃道:“危,这回,我要失业了。”
什么是AlphaCode
聊到AlphaCode,想必大家也并不陌生,它是DeepMind发布的AI编程系统。
在最新更新的论文中,DeepMind还首次透露了AlphaCode的“一次通过率”:66%。
也就是说,AlphaCode近三分之二的提交,都是一次AC(Accepted)的。
而早在之前,它就参加过著名网站Codeforces所举行的10场编程比赛,并且成绩超过一半程序员。
Codeforces是一个由俄罗斯程序员Mikhail Mirzayanov创办的编程竞赛网站,大约每周举行一次名为“Codeforces Rounds”的编程比赛。
当看到AlphaCode的成绩后,连创始人Mirzayanov都惊讶不已。
他原本对AI持怀疑态度,因为编程比赛考验的是发明算法的能力,这是最困难的,没想到AlphaCode的结果完全超出了他的预期。
AlphaCode如何编程
说了这么多,下面我们来看看AlphaCode是如何成为“编程做题家”的。
以下是Codeforces上的1553D问题:
(链接:https://codeforces.com/problemset/problem/1553/D)
针对Codeforces上这样一道编程题目,AlphaCode给出的代码是这样的:
t=int(input())
for i in range(t): s=input() t=input() a=[] b=[] for j in s: a.append(j) for j in t: b.append(j) a.reverse() b.reverse() c=[] while len(b)!=0 and len(a)!=0: if a[0]==b[0]: c.append(b.pop(0)) a.pop(0) elif a[0]!=b[0] and len(a)!=1: a.pop(0) a.pop(0) elif a[0]!=b[0] and len(a)==1: a.pop(0) if len(b)==0: print("YES") else: print("NO")
向以上程序输入4组字符串:
4
ababa
ba
ababa
bb
aaa
aaaa
aababa
ababa
得到的输出是:
YES
NO
NO
YES
在这里,AlphaCode不再是黑箱。
它不仅成功解决了问题,还能将代码和注意力高亮的对应位置显示出来。
至于更多的案例,可以去AlphaCode网站上观摩。
大致原理
所以,AlphaCode究竟是凭借什么原理达成这一“战果”的呢?
DeepMind说,在Codeforces比赛中所需解决问题的能力,已经超出了现有AI系统的能力。
整个AlphaCode模型的流程如下:
它仍然基于预训练-微调的范式打造,采用Transformer架构,其中编码器具备“解读能力”,解码器则具备“写码能力”。
用标准的语言建模目标在GitHub代码上预训练一个基于Transformer的语言模型。这个模型可以合理地代表人类编写代码的空间,大大减少了问题的搜索空间。
在竞争性编程数据集上微调模型,使用GOLD与tempering作为训练目标,进一步减少了搜索空间,并利用预训练弥补了少量的竞争性编程数据。
为每个问题从模型中生成非常多的样本。
对样本进行过滤,以获得一小部分候选提交的样本(不超过10个),在隐藏的测试案例上进行评估,方法是利用实例测试和聚类,根据程序行为挑选样本。
总而言之,通过将大规模Transformer模型与大规模采样和过滤相结合,DeepMind在可以解决的问题数量方面取得了重大进展,比之前的工作高出一个数量级。
而这次发表在Science上的论文,也给出了更直观的原理图,并以Python作为案例,讲解具体训练的过程。
在预训练(pre-training)时,研究人员会先整理出GitHub上的各种代码集,并“喂”给AlphaCode上的编码器和解码器。
以Python上的print("hello")为例,这里print()是一个常见的函数,即“打印输出”,“hello”则是具体需要打印输出的内容。
经过预训练后的模型,就具备了基本的“按指令完成任务”的要求,其中编码器负责生成指令,解码器则负责填充剩余的部分。
在微调(fine-tuning)环节,研究人员会整理出竞争性编程竞赛的数据集,包括问题和解决思路两部分,并以GOLD与tempering作为训练目标,进一步减少搜索空间。
其中,问题以注释#的形式交给编码器“学习”,解决思路则交给解码器来尝试理解:
微调完成后,解码器就懂得通过编码器生成注释的内容,来尝试输出对应的代码。
经过预训练-微调后,就来到了最终的评测环节。
Codeforces的题目会被直接以注释的形式交给编码器,解码器则尝试输出数百万个不同的程序,对它们进行过滤和聚类(cluster)之后,提交其中的10个程序来解决问题。
讨论
其实AlphaCode不是第一个编程工具,之前Codex以及GitHub Copilot都给人留下过深刻的印象。
但DeepMind认为,AlphaCode和前辈们大有不同:
“最近的大规模语言模型展示了生成代码的惊人能力,现在能够完成简单的编程任务。然而,当对更复杂、看不见的问题进行评估时,这些模型的表现仍然很差,这些问题需要解决问题的技能,而不仅仅是将指令翻译成代码。”
对于AlphaCode的出现,有程序员会表示有一些担心:
不过,DeepMind官方对于AlphaCode的定调并非“AI版程序员”,而是希望它能作为软件开发者的助手,作为一个辅助的角色出现在编程工作中。
所以文末也做个小调查,大家都是怎么看待AI写代码的呢?
扩展阅读:
[1]https://www.science.org/doi/10.1126/science.abq1158
[2]https://www.science.org/doi/10.1126/science.add8258
[3]https://mp.weixin.qq.com/s/wZcY_hEk_M61wTJVVIXfIg
[4]https://www.deepmind.com/blog/competitive-programming-with-alphacode
1、Alibaba开源内网高并发编程手册.pdf
2、2T架构师学习资料干货分享
3、10000+TB 资源,阿里云盘,牛逼!!
4、基本涵盖了Spring所有核心知识点总结
· END ·
最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。
如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。