好久没正经更新这个系列了,一些原因动态也有说,不过,总算让我找到了一个有意思的论文,这篇论文其他一些AI公众号还没讲过(也许他们也不打算讲了),那我就要先开始了
这篇文章的题目还是比较长的,本文主要集中于第一句话,即如果把LLM(大语言模型)比较巫师,那代码就是法杖,我觉得不够二次元,所以标题就用魔法棒了。还是老规矩,这次并不完全按照论文的思路来走,讲讲代码数据为何重要
1.回到ChatGPT诞生之初
前年11月,ChatGPT发布并且在很快的时间内就在AI圈内火了(在大众视野中火已经是23年的事情了),那么它为什么会火起来呢?
在外人看来,ChatGPT拥有强大的语言理解能力、能够生成至少是很流利的大段对话、拥有大量的世界知识等,但是其实很多能力早在GPT-3的时候圈内人都知道的,RLHF虽然确实使得ChatGPT的输出更加符合人类的价值观,但也不足以让人特别惊讶,毕竟更早的InstructGPT就已经在用这玩意了,而且RLHF其实并没有撼动LLM的根基,仍然属于小修小补的范畴
好吧,不卖关子了,ChatGPT能够出圈,其中很大的一个原因就在于,它能够写代码。当然,更早的CodeX等其实已经说明自回归语言模型是可以写代码的,但当时人们关注度并不高而已,当时大家还用着BERT,谈论着微调,然后就被ChatGPT震撼了。
当然不仅仅是代码生成,代码理解、代码执行、代码翻译、代码克隆、代码修复、代码摘要...这些能力ChatGPT都是具备的
2.代码数据有什么特点
首先说说什么是代码数据。其实范围是可以定义的很广的,首先先排除什么不是代码数据,其一就是自然语言,例如“我今天很开心”就没什么代码要素;其二就是机器语言,就是“00011101001”这样的二进制串,这样的东西是人类难以理解的。
除此之外很多东西都可以算作是代码数据了,除了我们常说的通用编程语言(例如C++、Python),还有领域特定语言(DSL),例如SQL、一些λ表达式之类的,甚至可以包括数学证明等等都可以算作是代码数据。
代码数据有一些非常优秀的特点,例如高度结构化、无歧义(不过放在大环境中是不好说的,例如Python2和Python3就很不一样,所以ChatGPT写出来的代码也可能因为版本问题而无法运行,这也是之后LLM发展一定会遇到的问题)、可以一定程度上验证正确性(编译或运行一下,跑不起来的肯定有问题)等,这些特点也决定了代码数据将如何帮助LLM
3.代码数据的引入为LLM带来了什么
其实ChatGPT出来没多久,符尧大佬就写了一个万字长文,其中就有提到GPT-3(175B)训练时几乎没有代码数据,不具备CoT(思维链,后面再讲);后面一些模型,即使规模更小,但经过代码数据的训练,能够使用CoT。从这里就可以看出,代码确实对于LLM有不小的好处,那么我们就回归论文本身,简短地讲下代码数据的引入为LLM带来了什么:
3.1 代码数据为孤立的LLM本身带来了什么
3.1.1 增强编程能力,或者简单来说就是开辟了新赛道。这个很好理解,原先没有代码数据的训练,当然LLM就不会处理代码相关的任务;
3.1.2 赋予LLM复杂推理能力。推理能力一直是很被看重的能力,很多专家和研究小组也都认为推理能力是AGI(通用人工智能)的一个关键能力,如何提升LLM推理能力也是LLM研究中很关心的问题,而代码数据,连同其带来的CoT和PoT能力对LLM推理能力的提升是很明显的。
【花师小哲】当代炼金术(神经网络)前沿(16)——语言模型的其他出路
CoT(Chain of thought)可以看上面的链接,简单来说就是让LLM一步步思考,把一个复杂的问题拆分成一系列问题,逐一回答。CoT往往是有效的。PoT算是CoT的变种,就是直接上代码来取代或部分取代CoT的推理(我这里就简单用PoT指代一系列混用代码的CoT方法了,CoT还是自然语言的范畴),当然,除此之外,XoT家族(例如ToT、GoT、AoT等)或者更广意义上的XoX家族(例如ToG)也都是受到CoT的影响。
3.1.3 促进对结构化常识知识的捕捉。之前提到过代码数据本身就有结构化的特点,甚至有些研究直接把prompt改成代码风格。除了非常容易想到的一些结构化知识的应用,作者还提到了视觉上定位的自然语言理解,例如LLM可以从html或CSS(就是网页源代码格式相关的代码数据)中学会GUI之类的排布,这可能就是一些LLM能够单纯通过文本的学习就能够具备一定的视觉知识的原因(这些研究可以看下面的链接)
【花师小哲】鉴定网络热门(?)AI(7)——GPT4:AGI的曙光?
3.2 代码数据为LLM和外界交互带来了什么
这不分就简单总结一下吧,简单来说,通过引入代码数据,实际上是给了LLM和更多外界的“存在”的交互的机会,因为LLM已经可以通过生成编程语言或利用预定义的函数与其他功能端建立连接了,或者说LLM会将外界的东西当做API来调用了,可以发号施令“所有机枪向左移动5cm”,玩一些微操了。
举个简单的例子,LLM可以尝试使用编程语言来控制无人机了、LLM可以帮助自动驾驶了。其中一个很重要的成就就是LLM学会使用工具(见如下链接),可以说代码数据让LLM可以连接虚拟世界,也可以连接物理世界了
【花师小哲】当代炼金术(神经网络)前沿(13)——语言模型自学使用工具?
3.3 代码数据为LLM-based agent带来了什么
LLM-based agent见:
【花师小哲】鉴定网络热门(?)AI(18)——LLM-based agent
代码数据使得LLM能够更好地完成决策制定(环境感知和规划)、执行(Code LLM可以快速学会动作基础或者说原语,并且能够高效使用memory)和自我改进
4.代码数据的研究还有哪些挑战
论文总结出四个挑战:(1)代码对于推理的帮助还是缺乏理论研究(有论文在研究这方面,但是还不够);(2)如何获得超越代码的推理。还是在说语言模型的输出方式实际上和代码的结构是不一样的,代码是树形结构而语言模型的输出是顺序生成;(3)调用大量函数的能力仍然需要提高;(4)从多轮交互和反馈中学习的能力依然有待加强。
5.结语——扶大厦之将倾?
之前写过一篇专栏:
【花师小哲】当代炼金术(神经网络)前沿(39)——人工人工智能?GPT-4背刺GPT-5?
在其中我们谈到现在LLM发展中碰到的一个麻烦的问题在于高质量数据已经快被用完了,而合成数据目前来看还不能大量使用,否则是有被反噬的风险的,关键是我们如何获得质量和多样性都具备的训练数据呢?代码数据也许就是一个突破口。
之前也说到了,代码数据是高度结构化的、并且能在一定程度上验证其质量,并且有不少证据都表明代码数据能够提升LLM的推理能力,而推理能力又是非常被看重的LLM能力,所以高质量的合成代码数据也许是未来的一条可能的出路(但是毕竟编程语言其实只能算作自然语言的一个子集),但是谁知道呢?代码数据能够扶大厦之将倾就只能等待时间来验证了。