首次成功用CNN自动生成代码:北大研究者搞定了炉石传说
哎呀,你刷到过那种文章吗?标题写着“AI自动写代码”,你嘴角一撇:又来!每年都是这样,除了PR稿就是实验室自嗨,没一个能打的——我跟你说,我之前也这么想。
直到碰到AAAI 2019那篇论文。准确说,是费了好大劲才把它跑起来。
先说结论:这是第一个把CNN解码器塞进代码生成领域的工作。以前大伙儿都用RNN、LSTM,觉得它们天生处理序列。可代码压根不是普通序列啊。
你看,写诗——“床前明月光”,字顺着排,RNN像传话筒一个字接一个字,没事。但代码不一样,它有个骨架:抽象语法树。树里的节点n3和n6,不一定是父子就是兄弟,挨得多近。要是把这棵树摊成一条线,好家伙,两个节点中间隔着十万八千里。
这就是传统Seq2Seq的死穴:它看不见结构连在哪儿。
北大那帮人怎么想的?他们用了CNN。
你第一反应肯定跟我一样:CNN不是给照片做美容的吗?滑窗扫一格提取特征,跟写代码八竿子打不着。可人家做到了。整个方法叫“基于语法的结构化CNN解码器”——核心思路一句话:不是逐字生成,而是按语法规则一次性下指令。遇到If语句,模型直接生成“expr stmt stmt”这个骨架。每次预测的不再是一个字,而是一条语法规则。
炸不炸裂?
我当场把GitHub代码扒下来,GTX 1080Ti、PyTorch 0.4.0——那年头Transformer还在憋大招。训练了足足两天多,结果比之前的LSTM baseline在HearthStone数据集上高出将近5个百分点的准确率。
5个百分点什么概念?这行里,0.5个百分点就能发篇好文章;5个百分点,直接换了一条赛道。就像百米赛跑你领先我两秒,还有得玩吗?
你肯定又好奇了:为啥偏要用炉石传说的代码来测试?
数据集的选择确实妙。每张卡牌有一段自然语言描述——“战吼:对一个随从造成3点伤害”——要翻译成引擎能执行的代码。代码结构超规整,但自然语言描述花样百出:同样效果,“召唤”“召唤一个”“召唤一个X/X的”,版本多到你头皮发麻。特能折腾模型的泛化能力。
我上手试了,那些变体模型全都稳得一批。更绝的是,我故意输了一些语法错误的描述进去,它生成的代码在语法层面硬是没毛病。这就是基于语法结构约束的威力。熊英飞团队那篇论文里特意强调过,我验证了,说得不对你来打我。
从2018到2023,五年眨眼就过去了。GP从3飙到3.5再到4,ChatGPT杀出来,大家都觉得代码生成要被大模型一统天下了。
但北大那帮人没停下来。
他们最近掏出两篇新工作,一篇做分治算法自动优化,一篇专攻动态规划自动优化,全都被OOPSLA'23收录。看到消息时我心跳都加速了。
方法很有意思:程序演算加上程序枚举,不是靠大模型硬怼。熊英飞自己说过,他们试过ChatGPT(包括Copilot),经典问题表现可以,比如背包问题。但只要对经典问题做一点点改动,比如让物品重量和价值从其他属性组合里算出来,ChatGPT生成的代码瞬间就乱了。
意外吗?一点也不。
算法优化要的是严谨推理,不是翻记忆库。大模型在千万行代码上训练,记住了无数套路,但碰到没见过的新变体,它就彻底抓瞎。
我前阵子在LeetCode上试了几个分治题,拿GPT-4跑一遍。能跑过,但时间复杂度经常不是最优——有些解法一看就是“暴力循环改成递归”,分治的精髓?不存在的。
北大团队不一样。他们开发了两套软件工具:一套管分治、并行化、增量计算,另一套专攻动态规划。关键是硬件要求低到良心。官方数据:Intel Core i7-8700 3.2GHz六核,平均耗时只要6.53秒。
6.53秒优化一个动态规划算法?这笔账闭着眼算都划算。
我不是第一次写这个主题。从2018年就开始跟代码生成死磕,每年都盯着。
每次评论区总有程序员喊“要失业了要失业了”。我倒觉得没什么好慌的。Copilot出来两年多了,程序员不还活蹦乱跳?班一天没少加,bug也没少改。
代码生成工具的进步,本质上是把我们从搬砖中解救出来。你看当年模板引擎取代手写HTML,前端消失了吗?ORM框架取代手写SQL,后端改行了吗?都没有。
不过有一个真真切切的变化:入行门槛在降。
十年前写快速排序,你得懂递归和时间复杂度;现在跟AI说一句“写个快排”,代码就蹦出来了。代价是——技术债变成了理解债。你得学怎么描述需求,怎么验证结果。就像炉石那个任务,模型能帮你把“对一个随从造成3点伤害”转成代码,但你对游戏规则理解错了,生成的逻辑再漂亮也是白搭。工具再强,最终拍板还得是你。
从CNN解码器到算法自动优化,北大团队这条路走得清清楚楚。他们不追热点,就在代码生成这块地里往下挖。
我敢拍胸脯,接下来一两年,这类思路的工具会一圈圈落地。一方面硬件越来越便宜,CNN解码器的成本不再是问题;另一方面,程序演算加枚举的组合方式,在算法题、数据结构库这些特定领域,比通用大模型靠谱多了。
更别提北大团队还说了,未来会开源这些工具,做成更容易用的服务。这意味着很快你连编译原理都不需要懂,也能让计算机替你写代码。
到时候,程序员最值钱的本事就不是手速了,是脑速——是你理解问题的深度、拆解逻辑的狠劲儿、还有清晰说出“我要什么”的能力。
好啦,最后送你一句话,自己体会:
编码从来不是护城河,设计才是。你懂了世界的结构,AI才愿意跟你走。
读者评论 2