引言
扩散模型(Diffusion Models)在图像生成方面表现出了卓越的性能。今天给大家分享的这篇文章,微软研究人员将扩散模型(Diffusion Models)应用到了代码生成领域,提出了CODEFUSION架构,实验结果表明CODEFUSION-75M效果超过了ChatGPT、StarCoder、GPT-3等众多百亿、千亿级参数的模型。
Paper:https://arxiv.org/pdf/2310.14820.pdf
Code:https://github.com/microsoft/prose-benchmarks/tree/main/CodeFusion
背景介绍
NL-to-code 是一个具有挑战性的序列到序列问题。最早的NL-to-code技术主要使用了RNN 、语义解析器等技术,随着Transformer的提出发展,研究人员逐步将其应用至代码生成领域,并提出了CodeBERT、T5(编码器解码器)、GPT-3(解码器)等模型。
随着大型语言模型(LLM)的发展,人们又提出了CodeGen 、TransCoder等大模型,并利用Prompt来进一步提升LLM在代码生成上的性能,这些模型可以以自回归和非自回归方式进行解码。
然而,自回归代码生成模型在解码过程中,无法从容的应对早期生成的Token标记,这种限制会降低文本生成的多样性。为了解决生成文本的多样性和质量之间的矛盾,早前的主要研究思路是研究解码策略,例如分组波束搜索、核采样等。
随着扩散模型(Diffusion Models)在图像生成方面表现出了卓越的性能,最近研究人员们正逐步将其应用到文本生成领域。这些方法首先使用嵌入层将离散Token转换为连续embeddings,并且在此过程中添加Gaussian 噪声来模仿扩展过程;然后选择最接近嵌入的词汇Token来将去噪embeddings映射回离散文本。然而在代码生成领域中,由于Token之间存在许多语法和语义约束,仅仅是地将embeddings映射回Token可能会产生无效的程序。
CODEFUSION架构
基于以上背景,微软研究人员提出了:CODEFUSION,这是一种自然语言到代码(NL-to-code)模型,如下图所示:
其中,CODEFUSION的架构主要由编码器(E)、降噪器(N),解码器(D)三大Transformer组件组成,外加一个分类头
。输入为自然语言,输出为预测的代码片段,分别用
、
,这里的输入输出都会被扩展至一个固定维度
。
在编码过程中,主要是将自然语言转换成向量表示,
,
基于编码后的自然语言
和时间
,降噪器预测并从嵌入噪声程序
中去除噪声
,以获得预测的去噪程序嵌入
,这里的N是一个Transformer块,在
和
之间具有交叉注意力,并且在
上具有完全注意力。
在将去噪Embeddings映射到离散代码Toekn之前,使用解码器 (D),对
和
应用交叉注意力,并对
应用全自注意力,以计算最终的隐藏表示
。与之前独立生成标记的文本扩散方法相反,全自注意力允许使用有关其他维度的完整信息生成每个隐藏维度(
)。
最后,
通过分类头
映射到实际Token标记,分类头
计算代码标记
上的分布。这里不对这些Token执行搜索,而是为每个
选择
。
CODEFUSION训练
本文分两个阶段来对CODEFUSION进行训练,其中1)在代码片段上对降噪器和解码器进行无监督预训练;2)在(自然语言--代码片段)对上对编码器、降噪器和解码器进行有监督微调。
继文本扩散之后,使用可训练的嵌入层
将代码片段
嵌入到连续空间中,可以在时间
处添加、删除噪声
。从文本扩散的工作中汲取灵感,并通过合并来自解码器的隐藏表示
,将 GENIE的损失调整为CODEFUSION。在时间
处的损失计算为:
为了预训练 CODEFUSION代码生成模型,本文作者将连续段落去噪 (CPD) 任务扩展到了代码生成领域。具体来说:只对与代码中的标识符或目标语言中的内置关键字对应的Token添加噪声,在去噪任务中,让模型学习关键代码Token(如变量名、函数名和代码流程控制)之间的关系。
CODEFUSION推理
在推理过程中,作者采用高斯噪声初始化
,并在
个时间步长上迭代地去除一定比例的噪声,以获得
,这里在迭代去噪过程中,不使用解码器。迭代过程之后,解码器产生最终的预测码
。
实验结果
作者评估了三种不同语言在NL-to-code上的CODEFUSION: Python、Bash和Microsoft Excel中的条件格式规则。
如下图所示,可以发现CODEFUSION-75M效果超过了ChatGPT、StarCoder、GPT-3等众多几十亿、上百亿参数的模型。
CODEFUSION 相比自回归模型,能够产生更多样化的代码(更高的 n 元语法分数、更低的嵌入相似性和更高的编辑距离)