在人工智能快速发展的今天,大语言模型(LLMs)在编程任务中的表现越来越受到关注。但你是否好奇过,当一个AI模型同时学习了多种编程语言后,它的"大脑"里究竟发生了什么?它是如何理解和处理不同编程语言的?是否像人类学习多门外语一样,在大脑中形成了特定的"语言区域"?
2025年6月,来自LMU慕尼黑大学和慕尼黑机器学习中心的Amir Hossein Kargaran、Yihong Liu、法国索邦大学的Francois Yvon以及LMU慕尼黑的Hinrich Schütze共同发表了一篇题为《How Programming Concepts and Neurons Are Shared in Code Language Models》的研究论文,深入探究了这些问题。这篇发表在arXiv(arXiv:2506.01074v1)上的论文,为我们打开了理解代码语言模型内部运作机制的一扇窗户。
大多数先前的研究都集中在单一编程语言的分析上,而这项研究则更进一步,探索了多种编程语言之间以及编程语言与英语之间在AI模型"概念空间"中的关系。研究团队使用两个基于Llama的模型,在21对编程语言之间进行了少样本翻译任务,通过解码模型中间层的嵌入向量,分析了11种编程语言和英语在模型中的神经元激活情况。
想象一下,如果AI模型是一个神奇的翻译官,那么这项研究就是在探索这位翻译官的大脑是如何工作的。当它需要将Java代码翻译成Python时,它的思维过程是怎样的?它是直接从Java转到Python,还是中间会经过某种"思考语言"?这些编程语言在它的"大脑"中是各自独立的,还是有所重叠?
一、研究方法:窥探AI的"思考"过程
研究团队采用了一系列巧妙的方法来探索代码语言模型的内部机制,就像神经科学家使用脑电图和核磁共振来研究人类大脑一样。他们主要使用了三种方法,分别从不同角度揭示模型的内部工作原理。
首先,他们使用了一种叫做"logit镜头"(logit lens)的技术。这就像是在模型的思考过程中安装了一个窗口,让我们能够偷看模型在生成最终输出之前的中间思考过程。具体来说,这种技术允许研究人员查看模型各层的隐藏状态,就像看到了模型在不同思考阶段的"草稿"。
研究团队创建了一个包含42个翻译方向(21对)的超并行数据集,涵盖了七种编程语言:C++、Java、Python、C#、JavaScript、PHP和C。这些数据来自GeeksforGeeks网站,包含581个并行代码片段,每个片段都有这七种语言的对应版本。通过这个数据集,研究人员能够分析模型在翻译任务中的表现,就像观察一个多语言翻译专家在工作时的思考过程。
其次,研究团队使用了MEXA(Multilingual Evaluation of Cross-lingual Alignment,跨语言对齐的多语言评估)来测量不同编程语言之间的对齐程度。这就像是测量不同编程语言之间的"亲缘关系"——哪些语言在模型的理解中更为相似,哪些则更为独特。
第三,他们采用了语言激活概率熵(LAPE)方法来识别特定语言的神经元。这相当于在模型的"大脑"中寻找专门负责处理特定编程语言的"神经元区域"。通过分析不同语言输入时神经元的激活模式,研究人员可以确定哪些神经元对特定语言有特别强的反应。
研究中使用的模型是Llama家族中的两个成员:专为代码任务设计的CodeLlama 7B和更通用的Llama 3.1 8B。这两个模型就像是两位具有不同背景的翻译官:一位专攻编程语言翻译,另一位则是精通多种语言的通才。
二、令人惊讶的发现:编程语言在AI"大脑"中的共享方式
当研究团队深入分析这些代码语言模型时,他们发现了一些非常有趣的现象,这些发现颠覆了我们对AI如何理解编程语言的认知。
第一个重要发现是关于模型的"思考路径"。通过logit镜头技术,研究人员发现,当模型在处理编程语言翻译任务时,它的概念空间在中间层更接近英语(包括编程语言关键词),并且在后半部分的中间层中给英语标记分配了较高的概率。
想象一下,如果把模型的处理过程比作一次旅行:模型从起点(输入编程语言,比如Java)出发,想要到达目的地(输出编程语言,比如Python)。有趣的是,模型并不是直接从Java到Python,而是先经过了一个"英语思维"的中转站。在这个中转站里,模型似乎在用英语和各种编程语言的关键词来"思考"问题,然后才最终到达Python的目的地。
具体来说,研究人员发现在模型层的前半部分,所有标记(无论是英语还是编程语言)的概率都很低,接近于零。但在后半部分的层中,英语和各种编程语言的标记开始出现,并且大多数标记属于英语,其次是所有编程语言的组合。在单个编程语言中,输出编程语言的标记概率最高,其次是像C++和C#这样具有较大关键词集的流行编程语言。
图1展示了这一现象:当模型尝试将Java中的for循环翻译成Rust时,在中间层解码出了一些既不属于Java也不属于Rust的术语,如"interval"、"range"、"until"和"ten"。这些术语要么来自其他编程语言(如Python、Go、Ruby),要么来自英语。有趣的是,这些中间术语与Rust中使用的".."语法(用于定义范围)在语义上是相似的。
第二个重要发现是关于不同编程语言之间的对齐程度。研究团队发现,C#在所有层中与大多数其他语言都有最佳的对齐度,尽管C语言家族和Java之间的差异很小。两个模型对Python的对齐度较低,而JavaScript则是PHP和Python最佳对齐的编程语言。
这就像是在发现不同编程语言之间的"亲戚关系"。在模型的理解中,C#就像是一个"社交达人",与大多数其他编程语言都有很好的"交流",而Python则显得有点"独来独往"。这种对齐度的差异可能反映了不同编程语言之间语法和语义上的相似性,以及它们在模型训练数据中的表示方式。
第三个关键发现是关于语言特定神经元的分布。研究人员发现,特定于语言的神经元主要集中在模型的底层,随后在大约四分之三处的层次上有另一个较小的峰值。而那些专门针对单一编程语言的独特神经元则倾向于出现在顶层。
这就像在模型的"大脑"中,底层区域负责处理各种语言的基本语法和结构,而顶层区域则包含了处理特定语言独特特性的专门神经元。这种分层结构与人类大脑处理语言的方式有一些相似之处,在人类大脑中,基本的语言处理发生在某些区域,而特定语言的细节则由其他区域处理。
特别有趣的是,对于像C#和Java这样与多种其他编程语言高度对齐的语言,识别特定于这些语言的神经元是很困难的。这些语言也往往比其他编程语言有更大的关键词集,并且无论在翻译任务中的输入/输出编程语言是什么,它们都更接近模型的概念空间。
这就像是某些编程语言在模型的"思维"中占据了更中心的位置,成为了模型理解和生成代码的参考点。当模型需要在不同编程语言之间进行翻译时,它可能会利用这些中心语言作为中间表示或桥梁。
三、深入分析:各层次的差异与语言特征
当我们更深入地分析研究结果时,会发现一些更加细致的模式和现象。这些细节帮助我们更全面地理解代码语言模型如何内部表示和处理不同的编程语言。
首先,让我们来看看两个模型之间的比较。在标记概率方面,Llama 3.1 8B在预期标记概率的初始上升速度较慢,然后在前三层有一个急剧的增加。相比之下,CodeLlama 7B则展示了一个更为渐进的增长过程。在排名方面,CodeLlama 7B始终显示出英语关键词的主流存在。然而,它们的分布发生了变化:在前半部分的层中,它们主要由不包括编程语言关键词的英语关键词组成,而在后半部分,它们越来越多地包括与编程语言关键词重叠的英语关键词。
这就像是两种不同的学习风格:Llama 3.1 8B像是一个先慢后快的学习者,而CodeLlama 7B则像是一个稳步前进的学习者。此外,CodeLlama 7B似乎更倾向于通过英语来理解和处理编程任务,特别是在处理过程的早期阶段。
在跨语言对齐方面,Llama 3.1 8B在所有语言对中都实现了比CodeLlama 7B更好的MEXA对齐分数。这并不完全出乎意料:尽管CodeLlama 7B及其指令调优版本是专门为代码训练的,但Llama的较新通用模型(包括Llama 3 8B和其指令调优版本)在代码生成任务中取得了更好的分数(如LiveCodeBench评估所示)。
这表明,虽然专门为代码设计的模型可能在某些特定任务上表现出色,但更新的通用模型可能通过更广泛的训练和更先进的架构在代码任务上取得了更全面的进步。这就像是专科医生与全科医生的比较:虽然专科医生在特定领域有深厚的专业知识,但全科医生可能具有更广泛的知识和更综合的理解能力。
在语言特定神经元的分析中,研究人员对两个模型都使用了相同的LAPE参数设置(ν=400,τ=0.95)来识别特定于语言的神经元。结果显示,在大多数情况下,特定于语言的神经元的停用对其他语言几乎没有影响,而对主要语言的影响则更为明显——尽管这种模式可能不适用于所有设置。
特别有趣的是,研究人员发现,为一些语言(如C#、Java、C++和HTML)识别出的特定神经元往往更多地与其他语言共享。这些语言在MEXA分析中也显示出与多种其他编程语言的高度对齐。这表明,模型内部的某些神经元可能负责处理多种语言共有的特性或结构,而不是专门针对单一语言。
这就像是在人类大脑中,某些神经回路可能负责处理多种相关语言共有的语法或词汇特征,而其他神经回路则可能专门处理特定语言的独特特性。这种神经元共享模式反映了不同编程语言之间的结构和语义相似性,以及模型如何利用这些相似性来优化其内部表示。
四、研究结论与未来影响:走向更高效的多语言代码模型
基于这些发现,研究团队提出了几个构建更高效多语言代码模型的策略,这些见解不仅有理论意义,还有实际的应用价值。
首先,由于英语和某些编程语言在模型的概念空间中处于中心位置,它们可以作为多语言代码翻译的中间表示,最大限度地减少源语言和目标语言之间的距离。这就像是在不同国家之间旅行时,找到一个便利的中转枢纽,而不是直接从一个偏远地区飞到另一个偏远地区。
其次,研究发现神经元类型在不同层次上的分布模式——底层的共享/通用神经元和顶层的特定神经元——支持模块化架构,其中基础层编码通用语法/语义,而顶层可以交换或专门用于特定语言。这就像是构建一栋有通用底层和可定制顶层的建筑,底层提供基本结构和功能,而顶层则可以根据特定需求进行调整和专门化。
第三,对于密切对齐的编程语言(如Java和C#),共享表示可以实现参数共享或基于适配器的方法,以轻量级的方式支持多语言,同时只调整最少的额外权重。这类似于在学习相关语言时利用语言之间的共同点,从而减少学习每种新语言所需的额外努力。
最后,研究指出了不同编程语言设计理念的影响。一些语言强制实行面向对象编程,而其他语言则可选地支持它。这种结构差异可能导致模型为具有更严格范式的语言开发更强的内部表示,可能在代码生成中引入一些偏差。语言设计和惯用用法的其他差异也可能影响模型在跨语言生成代码时的行为。认识到这些因素可以帮助改进多语言代码模型的泛化能力。
这项研究不仅揭示了代码语言模型如何内部表示编程语言,还发现了模型概念空间中的结构模式。这些发现为理解和改进大语言模型在编程任务中的性能提供了宝贵的见解,也为开发更高效、更精确的多语言代码模型指明了方向。
对于开发者和AI研究人员来说,这些发现意味着他们可以设计更有效的模型架构和训练策略,专门针对多语言代码理解和生成。对于编程教育者和学习者来说,了解这些语言之间的关系和共享特性可能有助于开发更有效的学习方法和工具。对于软件工程领域,这些见解可能导致更先进的代码转换、重构和维护工具的开发。
总的来说,这项研究打开了理解AI如何处理和生成代码的新窗口,为未来的研究和应用铺平了道路。随着这一领域的不断发展,我们可能会看到更智能、更高效的代码助手和工具,帮助开发者更轻松地跨语言工作并提高编程效率。
研究团队已经将相关代码开源在GitHub上(https://github.com/cisnlp/code-specific-neurons),有兴趣深入了解的读者可以访问这个代码库,或查阅原始论文获取更详细的技术细节。
好文章,需要你的鼓励
这项研究利用大语言模型解决科学新颖性检测难题,南洋理工大学团队创新性地构建了闭合领域数据集并提出知识蒸馏框架,训练轻量级检索器捕捉想法层面相似性而非表面文本相似性。实验表明,该方法在市场营销和NLP领域显著优于现有技术,为加速科学创新提供了有力工具。
un?CLIP是一项创新研究,通过巧妙反转unCLIP生成模型来增强CLIP的视觉细节捕捉能力。中国科学院研究团队发现,虽然CLIP在全局图像理解方面表现出色,但在捕捉细节时存在不足。他们的方法利用unCLIP生成模型的视觉细节表示能力,同时保持与CLIP原始文本编码器的语义对齐。实验结果表明,un?CLIP在MMVP-VLM基准、开放词汇语义分割和视觉中心的多模态任务上显著优于原始CLIP和现有改进方法,为视觉-语言模型的发展提供了新思路。
这项研究介绍了RPEval,一个专为评估大语言模型角色扮演能力而设计的新基准。研究团队从法国里尔大学开发的这一工具专注于四个关键维度:情感理解、决策制定、道德对齐和角色一致性,通过单轮交互实现全自动评估。研究结果显示Gemini-1.5-Pro在总体表现上领先,而GPT-4o虽在决策方面表现出色,但在角色一致性上存在明显不足。这一基准为研究人员提供了一个可靠、可重复的方法来评估和改进大语言模型的角色扮演能力。
这篇论文介绍了LegalSearchLM,一种创新的法律案例检索方法,将检索任务重新定义为法律要素生成。研究团队构建了LEGAR BENCH数据集,涵盖411种犯罪类型和120万案例,并开发了能直接生成关键法律要素的检索模型。实验表明,该模型在准确率上超越传统方法6-20%,且在未见犯罪类型上展现出强大泛化能力。这一突破为法律专业人士提供了更高效、精准的案例检索工具。