deepseekcoder技术报告发布:开源最强code模型
作者: NLP前沿 来源: NLP前沿
“
技术报告周五才挂到arxiv的,模型开源一段时间了
https://arxiv.org/pdf/2401.14196.pdf
https://github.com/deepseek-ai/DeepSeek-Coder
https://huggingface.co/deepseek-ai
比较特别的一些点:
-
模型在87种编程语言、2T的token上进行训练,这些数据来自GitHub的public仓库,但是使用了仓库级别的去重(与以往在文件级别进行去重的方法不同)
-
为了更好地处理项目级别的代码场景,提出了一种依赖解析方法,通过识别文件之间的依赖关系,并按照这些依赖关系对文件进行排序,以确保每个文件在输入序列中的位置能够反映其在项目中的依赖关系
-
通过两种主要的预训练目标进行训练:Next Token Prediction和Fill-In-the-Middle,FIM。不太一样的是引入了FIM目标来预训练,主要目的是期望让模型学会在给定的代码片段中插入正确的代码,以完成整个代码段。这类似于填空题,模型需要根据前后文来预测中间缺失的部分。具体的方法如下:
-
在预训练阶段,文本被随机分成三个部分:前缀(Prefix)、中间部分(Middle)和后缀(Suffix)。然后,这些部分被打乱顺序,并通过特殊字符(如<|fim_hole|>)连接起来,形成一个训练样本。例如,如果原始代码片段是 A B C D E,FIM方法可能会将其重组为 A <|fim_hole|> D E,其中 B C 是被隐藏的中间部分,模型需要预测这部分内容。
-
PSM(Prefix-Suffix-Middle)模式:在这种模式下,中间部分被前缀和后缀包围。这要求模型理解前后文,以便正确预测中间部分。
-
SPM(Suffix-Prefix-Middle)模式:与PSM相反,这种模式将中间部分放在前缀和后缀之前。这为模型提供了不同的结构挑战。
-
在训练过程中,可以调整FIM率(即使用FIM训练样本的比例),以平衡模型在FIM任务和传统的下一个token预测任务之间的性能。 文章中提到,通过一系列消融实验,发现50%的PSM率能够实现FIM效率和代码补全能力之间的平衡。
-
FIM方法特别适用于代码补全工具,因为它能够提高模型在理解代码结构和依赖关系方面的能力,从而生成更准确和连贯的代码。
-
-
为了处理更长的代码输入,DeepSeek-Coder扩展了上下文窗口长度到16K
更多AI工具,参考Github-AiBard123,国内AiBard123