什么是
它是微软于2020年所开发的, 是BERT模型的扩展。其作为双峰预训练模型, 适用于编程语言(PL)及自然语言(NL)。它能够执行下游的(NL-PL)任务。该模型运用6种编程语言(Java、PHP、Ruby、Go)来开展NL-PL的匹配训练。
本文会对论文予以简要概括, 并且运用一个事例展现怎样去运用, 关于那个模型背后所涉及数学及详细架构的更多详尽的信息, 需去查阅原始论文。到了最后, 除了这个之外, 还梳理了近期一些基于对其研究之上的衍生模型。
在对这篇论文展开深入研究以前, 让我们先来介绍一下能够予以支持的下游任务用例, 以及。其中一些用例已然在MS工具里得以实现, 比如 -。
的用例
代码进行转换, 亦或是代码予以翻译: 比如说, 在开发人员期望去编写和现有的代码一模一样的java代码之际, 代码朝着代码的翻译能够助力翻译此代码片断。
代码能够自动注释, 该功能可助力向开发人员提供代码小结, 即当开发人员碰到不常接触的代码之际, 模型能够把代码阐释成自然语言, 进而为开发人员完成总结。
将文本转化为代码, 存在类似代码搜索的功能, 借助这种搜索, 能够辅佐用户查找到依托自然语言查询的相关代码。除了这个情况之外, 还能够依据注释生成对应的代码。
文本到文本:可以帮助将代码域文本翻译成不同的语言。
BERT架构
谷歌, 于2018年, 提出的, 自监督模型, 是BERT((from))。
构成BERT的, 乃是由多个自注意力“头”所组成的编码器层堆栈(等人, 2017年), 其本质如此。对于序列里的每个输入标记而言, 每个头都会去计算键、值以及查询向量, 以此来创建加权表示/嵌入。同一层当中所有头的输出会被组合起来, 并且经由一个全连接层。每层都借助跳过连接相连, 接着开展层规范化(LN)操作。BERT的传统工作流程涵盖两个阶段: 预训练以及微调, 就是这样。预训练运用两个自监督任务了, 其中一个是掩蔽语言建模, 也就是预测随机掩蔽起来的输入标记, 另一个是下一句预测, 即预测两个输入句子是不是彼此相邻着的, 微调是适用于下游应用程序的, 一般是在最终编码器层之上添加一个或者多个全连接层。
架构
BERT极易扩展至多模态, 也就是运用不同种类的数据集来开展训练, 这属于Bert的双模扩展, 即同时将自然语言以及源代码当作其输入, (这与主要聚焦于自然语言的传统BERT有所不同)。
组合而成的是代码以及明确定义的文本注释 , 这二者所构成的便是双峰NL - PL对训练时的典型输入。
阐述了两项预训练的目标, 其一为掩码语言建模, 其二是替换标记检测。
通过掩码语言建模训练之举 , 针对 NL 以及 PL 的情况 , 去挑选出一组位置 , 这组位置需当属随机性质被找出用于屏蔽掉。紧接着 , 采用特殊的标记 , 将挑选出来的那些位置进行替换。而 MLM 所具有的目标 , 乃是对被此掩盖的原本标记展开预测。
: 带有替换标记检测的训练, 将在原始 NL 序列以及 PL 序列里, 有极少的标记会被随机地加以屏蔽, 去训练那样一个生成器模型, 其是个类似 n-gram 的概率模型用于屏蔽词的生成, 之后再训练一个鉴别器模型用以判定一个词是不是原始词(属于二元分类问题)。
在12层共计含有125M参数的情况下, 于FP16精度层面, 在DGX - 2上开展250小时的训练, 结果表明, 当和来自某模型的预训练表示一同使用时(该模型已运用来自Code - 的代码来进行训练), 与从一开始就进行训练时作对比, 使用某初始化方式, 性能更佳。
使用 进行微调
简要介绍如何使用, 代码文档生成可作为例子在此处, 详细使用方法的参考是论文。
安装相应的包
pip3 install torch==1.4.0 pip3 install transformers==2.5.0 pip3 install filelock数据预处理
本任务中的数据预处理如下:
pip3 install gdown mkdir -p data/code2nl cd data/code2nl gdown https://drive.google.com/uc?id=1rd2Tc6oUWBo7JouwexW3ksQ0PaOhUr6h unzip Cleaned_CodeSearchNet.zip rm Cleaned_CodeSearchNet.zip cd ../..使用tree命令可以看到如下目录结构:
tree data/code2nl/CodeSearchNet/ data/code2nl/CodeSearchNet/ ├── go │ ├── test.jsonl │ ├── train.jsonl │ └── valid.jsonl ├── java │ ├── test.jsonl │ ├── train.jsonl │ └── valid.jsonl ├── javascript │ ├── test.jsonl │ ├── train.jsonl │ └── valid.jsonl ├── php │ ├── test.jsonl │ ├── train.jsonl │ └── valid.jsonl ├── python │ ├── test.jsonl │ ├── train.jsonl │ └── valid.jsonl └── ruby ├── test.jsonl ├── train.jsonl └── valid.jsonl 6 directories, 18 files每种语言都有自己的训练、验证、测试数据文件。
运行程序
实施访问举动, 且进行克隆操作, 针对run.py、bleu.py、model.py这些文件, 把克隆所得放入data/文件夹当中。
去运行一下下面这个命令, 把其中的=128部分改成=4, 之所以要这么做, 是由于GPU的内存不太够充裕, 要是设置太大的bs就会引致OOM现象的出现。
lang=php beam_size=10 batch_size=4 source_length=256 target_length=128 output_dir=model/$lang data_dir=../data/code2nl/CodeSearchNet dev_file=$data_dir/$lang/valid.jsonl test_file=$data_dir/$lang/test.jsonl test_model=$output_dir/checkpoint-best-bleu/pytorch_model.bin #checkpoint for test python run.py --do_test --model_type roberta --model_name_or_path microsoft/codebert-base --load_model_path $test_model --dev_filename $dev_file --test_filename $test_file --output_dir $output_dir --max_source_length $source_length --max_target_length $target_length --beam_size $beam_size --eval_batch_size $batch_size这样就开始训练了,训练完成后如何调用 呢?
如果只想使用从 转换的特征表示,可以使用以下示例代码:
from transformers import AutoTokenizer, AutoModel import torch # Init tokenizer = AutoTokenizer.from_pretrained("microsoft/codebert-base") model = AutoModel.from_pretrained("microsoft/codebert-base") # Tokenization nl_tokens=tokenizer.tokenize("return maximum value") code_tokens=tokenizer.tokenize("def max(a,b): if a>b: return a else return b") tokens=[tokenizer.cls_token]+nl_tokens+[tokenizer.sep_token]+code_tokens+[tokenizer.sep_token] # Convert tokens to ids tokens_ids=tokenizer.convert_tokens_to_ids(tokens) context_embeddings=model(torch.tensor(tokens_ids)[None,:])[0] # Print print(context)输出的结果如下:
tensor([[-0.1423, 0.3766, 0.0443, ..., -0.2513, -0.3099, 0.3183], [-0.5739, 0.1333, 0.2314, ..., -0.1240, -0.1219, 0.2033], [-0.1579, 0.1335, 0.0291, ..., 0.2340, -0.8801, 0.6216], ..., [-0.4042, 0.2284, 0.5241, ..., -0.2046, -0.2419, 0.7031], [-0.3894, 0.4603, 0.4797, ..., -0.3335, -0.6049, 0.4730], [-0.1433, 0.3785, 0.0450, ..., -0.2527, -0.3121, 0.3207]], grad_fn=)在上面的代码之中, 我们也已然看到, 其提供了相关的模型, 而这些模型, 我们能够直接拿来用以使用, 就是这样的情况:
import torch from transformers import RobertaTokenizer,RobertaConfig,RobertaModel device=torch.device("cuda"if torch.cuda.is_available() else"cpu") tokenizer=RobertaTokenizer.from_pretrained("microsoft/codebert-base") model=RobertaModel.from_pretrained("microsoft/codebert-base") model.to(device)地址:
基于的其他模型介绍
:基于数据流的代码表征预训练模型
学习代码表征的预训练模型靠代码的语义结构来支撑, 它是基于Bert预训练模型做出来的, 除去平常的MLM任务, 本文还推出了两个新预训练任务, 也就是数据流边预测、源代码和数据流的变量对齐, 依据数据流去学习源代码的向量表征, 在4个下游任务收获了显著提升的效果。
: 统一的跨模式预训练模型
它是用于一类编程语言的统一的跨不同模式类型的预训练模型, 此模型借助带有前缀适配器的掩码注意矩阵去把控模型的行为表现, 还运用AST以及代码注释等跨模式方面的内容用以强化代码的表示, 为要对并行呈现为树状的AST进行编码, 论文提出了一种一对一的映射方式, 这种方式能够留存AST里所有结构信息的序列结构, 该模型还凭借多模态内容经由对比学习的方式来学习代码片段的表示, 之后运用跨模态生成任务来使编程语言之间的表示达成对齐。
:自动化代码审查
上面展开研究之后, 又有了新的设定, 这是一个经过预先训练的模型, 它借助了, 专门针对代码审查场景定制的, 四个预先训练任务。模型着重之处, 在于和代码评审活动相关的, 三个关键任务, 涵盖代码变更质量评估, 评审注释生成, 以及代码优化。模型经过测试显示, 凭借预训练任务, 以及多语言训练数据集, 能够使模型, 针对代码更改与审查, 实现自动化操作。
MORE
比赛交流和组队
加我的微信,邀你进群
喜欢就关注一下吧:
点个 在看 你最好看!