秒杀千亿级模型!微软 | 提出代码扩散预训练模型:CODEFUSION,参数仅有75M

2023-10-31 19:38:04 浏览数 (1)

引言

扩散模型(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组件组成,外加一个分类头

H

。输入为自然语言,输出为预测的代码片段,分别用

s={s_1,s_2,...,s_k}

hat{y}={hat{y_1},hat{y_2},...,hat{y_s}}

,这里的输入输出都会被扩展至一个固定维度

n

在编码过程中,主要是将自然语言转换成向量表示,

E_s = E(s) = {e_1, e_2, · · · , e_n}

基于编码后的自然语言

E_s

和时间

t

,降噪器预测并从嵌入噪声程序

x^t

中去除噪声

epsilon_t

,以获得预测的去噪程序嵌入

hat{x}^0=N(x^t,t,E_s)

,这里的N是一个Transformer块,在

x^t

E_s

之间具有交叉注意力,并且在

x^t

上具有完全注意力。

在将去噪Embeddings映射到离散代码Toekn之前,使用解码器 (D),对

hat{x}^ 0

E_s

应用交叉注意力,并对

hat{x}^ 0

应用全自注意力,以计算最终的隐藏表示

D_s={d_1 , d_2,···,d_n} = D(x^0,E_s)

。与之前独立生成标记的文本扩散方法相反,全自注意力允许使用有关其他维度的完整信息生成每个隐藏维度(

d_i

)。

最后,

D_s

通过分类头

H

映射到实际Token标记,分类头

H

计算代码标记

p(y|d_i)

上的分布。这里不对这些Token执行搜索,而是为每个

i

选择

hat{y}_i = argmax_y p(y|d_i)

CODEFUSION训练

本文分两个阶段来对CODEFUSION进行训练,其中1)在代码片段上对降噪器和解码器进行无监督预训练;2)在(自然语言--代码片段)对上对编码器、降噪器和解码器进行有监督微调。

继文本扩散之后,使用可训练的嵌入层

L

将代码片段

y

嵌入到连续空间中,可以在时间

t

处添加、删除噪声

epsilon _t

。从文本扩散的工作中汲取灵感,并通过合并来自解码器的隐藏表示

D_s

,将 GENIE的损失调整为CODEFUSION。在时间

t

处的损失计算为:

L_t = ∥hat{epsilon}_t− epsilon _t∥ ∥D_s − L(y)∥ − log p(y|D_s)

为了预训练 CODEFUSION代码生成模型,本文作者将连续段落去噪 (CPD) 任务扩展到了代码生成领域。具体来说:只对与代码中的标识符或目标语言中的内置关键字对应的Token添加噪声,在去噪任务中,让模型学习关键代码Token(如变量名、函数名和代码流程控制)之间的关系。

CODEFUSION推理

在推理过程中,作者采用高斯噪声初始化

x_t

,并在

t

个时间步长上迭代地去除一定比例的噪声,以获得

hat{x}^ 0

,这里在迭代去噪过程中,不使用解码器。迭代过程之后,解码器产生最终的预测码

hat{y}

实验结果

作者评估了三种不同语言在NL-to-code上的CODEFUSION: Python、Bash和Microsoft Excel中的条件格式规则。

如下图所示,可以发现CODEFUSION-75M效果超过了ChatGPT、StarCoder、GPT-3等众多几十亿、上百亿参数的模型。

CODEFUSION 相比自回归模型,能够产生更多样化的代码(更高的 n 元语法分数、更低的嵌入相似性和更高的编辑距离)

0 人点赞