1
Wang C, Xu B. Convolutional neural network with word embeddings for Chinese word segmentation[J]. arXiv preprint arXiv:1711.04411, 2017.
关键词:CWS(中文词语分割)
过程简述:
- 查词典:从字典
查询字,将句子拆分成单字(word embeddings)
- 利用卷积神经网络编码上下文(encode contextual information)

训练得到一组标签序列(label sequence):y = (y1, y2, …, yL),
再用维特比算法(Veterbi algorithm)找出可能性最大的标签序列。
@汪军(anjingyuanzougaofei) TODO:这部分的CNN结构需要更进一步了解
- 组合单字

是一个字,根据上表的规则枚举该字所在的序列,推断可能的词
- 这里借助了_word2vec_来解决词空间过大和稀疏问题(即n个字组合,有种组合方式,但可能只有少数几种是有效的中文词汇)<br />
Q:“有没有”,假设是第2个“有”,则会出现“有”、“没有”和“有没有”三个意思完全不同的词,该如何选?
2
Che W, Feng Y, Qin L, et al. N-ltp: A open-source neural chinese language technology platform with pretrained models[J]. arXiv preprint arXiv:2009.11616, 2020.
关键词:CWS
英文NLP工具:CoreNLP (Manning et al., 2014), UDPipe (Straka and Straková, 2017), FLAIR (Akbik et al., 2019),
spaCy and Stanza (Qi et al., 2020)
概览:基于 PyTorch 的神经自然语言处理工具包,支持多种中文自然语言处理任务,多任务学习框架
POS(词性标注),NER(命名实体识别),DEP(依赖分析),SRL(语义角色标注),SDP(语义依赖解析)
蒸馏法( distillation method)用单任务模型教多任务模型
过程简述:
给定语句
- 对 s 补上特殊符号[CLS]和[SEP],
,形成结构化的输入
- ELECTRA 将结构化输入转换成隐藏表示(hidden representations)序列
- 基础任务CWS:采用线性解析器(linear decoder)对每个字符分类
yi表示每个字的标签的可能性分布
WCWS和bCWS是训练参数 - 其他任务
- POS (图画得不太好,POS的输入和CWS的输入都是第2步的序列H)
%22%20aria-hidden%3D%22true%22%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-79%22%20x%3D%220%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20transform%3D%22scale(0.707)%22%20xlink%3Ahref%3D%22%23E1-MJMATHI-69%22%20x%3D%22693%22%20y%3D%22-213%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-3D%22%20x%3D%221112%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-53%22%20x%3D%222168%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-6F%22%20x%3D%222814%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-66%22%20x%3D%223299%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-74%22%20x%3D%223850%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-6D%22%20x%3D%224211%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-61%22%20x%3D%225090%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-78%22%20x%3D%225619%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-28%22%20x%3D%226192%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3Cg%20transform%3D%22translate(6581%2C0)%22%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-57%22%20x%3D%220%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3Cg%20transform%3D%22translate(944%2C-155)%22%3E%0A%20%3Cuse%20transform%3D%22scale(0.707)%22%20xlink%3Ahref%3D%22%23E1-MJMATHI-43%22%20x%3D%220%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20transform%3D%22scale(0.707)%22%20xlink%3Ahref%3D%22%23E1-MJMATHI-57%22%20x%3D%22760%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20transform%3D%22scale(0.707)%22%20xlink%3Ahref%3D%22%23E1-MJMATHI-53%22%20x%3D%221808%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%3Cg%20transform%3D%22translate(9361%2C0)%22%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-68%22%20x%3D%220%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20transform%3D%22scale(0.707)%22%20xlink%3Ahref%3D%22%23E1-MJMATHI-69%22%20x%3D%22815%22%20y%3D%22-213%22%3E%3C%2Fuse%3E%0A%3C%2Fg%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-2B%22%20x%3D%2210504%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3Cg%20transform%3D%22translate(11505%2C0)%22%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMATHI-62%22%20x%3D%220%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3Cg%20transform%3D%22translate(429%2C-155)%22%3E%0A%20%3Cuse%20transform%3D%22scale(0.707)%22%20xlink%3Ahref%3D%22%23E1-MJMATHI-43%22%20x%3D%220%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20transform%3D%22scale(0.707)%22%20xlink%3Ahref%3D%22%23E1-MJMATHI-57%22%20x%3D%22760%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%20%3Cuse%20transform%3D%22scale(0.707)%22%20xlink%3Ahref%3D%22%23E1-MJMATHI-53%22%20x%3D%221808%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3C%2Fg%3E%0A%3C%2Fg%3E%0A%20%3Cuse%20xlink%3Ahref%3D%22%23E1-MJMAIN-29%22%20x%3D%2213770%22%20y%3D%220%22%3E%3C%2Fuse%3E%0A%3C%2Fg%3E%0A%3C%2Fsvg%3E#card=math&code=yi%20%3D%20Softmax%28W%7BPOS%7Dhi%20%2B%20b%7BPOS%7D%29&id=SXzJI)
yi表示每个字的词性标签的可能性分布 - NED - 寻找句子中的实体(人名,地名),并对实体分类
是
加入了方向和距离感知之后转换成的字符
- DEP - 分析句子的语义结构
a deep biaffine neural dependency parser (Dozat and Manning, 2017) and einser algorithm (Eisner, 1996)表示依赖关系
的得分
- SDP - 捕获句子的语义结构,确定所有在语义上相互关联的词对并分配特定的预定义语义关系
表明词 i 和词 j 关联超过边界(即认为没关联)
- SRL - 确定句子潜在的谓词(predicate-argument)结构,理解句子表达的意义

表示在谓词是
时的任意标签序列
计算从
到
的过渡分数(transition score)
- POS (图画得不太好,POS的输入和CWS的输入都是第2步的序列H)
3
Cui Y, Che W, Liu T, et al. Pre-training with whole word masking for chinese bert[J]. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2021, 29: 3504-3514.
4
L. Jiang, H. Liu, H. Jiang, L. Zhang and H. Mei, “Heuristic and Neural Network Based Prediction of Project-Specific API Member Access,” in IEEE Transactions on Software Engineering, vol. 48, no. 4, pp. 1249-1267, 1 April 2022, doi: 10.1109/TSE.2020.3017794.
5 Transformer
Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[J]. Advances in neural information processing systems, 2017, 30.
Transformer的组件



Transformer组件的基本特征
- 编码器(Encoder)和解码器(Decoder)各有6个,且每个都完全一样。
- 每个编码器的输出都会作为所有解码器的输入。
- 每个编码器包含两个子层
- Self-Attention:使每个位置都可以注意到句子中其他的位置。
- Feed Forward:前馈全连接层。
- 每个解码器包含三个子层
- Self-Attention:遮罩层,为了防止泄露,将 Outputs Embedding 偏移一位,保证位置 i 的预测只能依赖 i 前面已知的Outputs。
- Encoder-Decoder Attention:使每个位置都注意到输入序列中的所有位置。
- Feed Forward:同编码器。
- 编码器的输入在经过 Self-Attention 层时是共同参与的,意味着每个单词的向量
会相互依赖;而经过 Feed Forward 层时是分开的,意味着可以并行执行,这是 Transformer 训练更快的重要原因
自注意计算

第一步:生成query,key 和 value的矩阵 Q,K 和 V(矩阵点积),W 为权重矩阵
第二步:生成 Z 矩阵
对应的公式:
Multi-Head Attention
使用不同的 W 可得到不同的 Z
把所有拼接再与
点积,得到最终的 Z 矩阵

不同的 W 代表了注意力不同,在编码特定单词时,与之关联的权重最高的单词也就不同
6 BERT
Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.
NLP 预训练模型流派
| feature-based | fine-tuning | |
|---|---|---|
| unidirectional | Brown et al., 1992 Ando and Zhang, 2005 Blitzer et al., 2006 Mikolov et al., 2013 Pennington et al.,2014 Mnih and Hinton, 2009 Kiros et al., 2015 Logeswaran and Lee, 2018 Le and Mikolov, 2014 Jernite et al., 2017 Logeswaran and Lee, 2018 |
Dai and Le, 2015 Howard and Ruder, 2018 Radford et al., 2018 OpenAI GPT (Radford et al., 2018) |
| bidirectional | Peters et al., 2017,2018a Melamud et al. 2016 |
BERT |
non-neural current work
BERT 步骤
pre-training:在不同的预训练任务上对未打标签的数据进行训练
fine-tuning:在下游任务中使用已打标签的数据进行微调
- 一个句子拆分成若干个token(Tokenizer),每个句子开头用特殊符号[CLS]标记。
- 多个句子也会拼成一个句子,用特殊符号[SEP]标记句子结束。
- 句子的token矩阵和Embedding矩阵点积,[CLS]转换后为向量C,Tokeni转换后为向量Ti。
- Pre-training和Fine-Tuning的结构相同,每个下游任务(MINLI、NERSQuAD)的预训练参数也相同。
- 输入Embedding(上图的黄色块)由三个部分相加构成:

Pre-training
Task 1 - Masked LM:将输入句子的token随机选取一部分,替换成[MASK]或别token(80% [MASK],10% 其他,10% 不变)。其目的是为了Transformer的编码器不知道哪个词将用于预测,或者哪个词被替换过,它只能保留每个输入token的上下文表征(representation)(即每个词都需要注意)。
Task 2 - Next Sentence Prediction (NSP):选取两句话A和B,B中有50%的情况是A的下一句,50%是与A无关的其他句子。其目的是获取句子的层次表征,理解句子之间的联系。
例如:
Input = [CLS] the man went to [MASK] store [SEP]he bought a gallon [MASK] milk [SEP]Label = IsNextInput = [CLS] the man [MASK] to the store [SEP]penguin [MASK] are flight ##less birds [SEP]Label = NotNext
Fine-Tuning BERT
输入:句子A和B,有4种情况
- 段落种的句子对;
- 前提-假设句子对;
- 问题-答案句子对;
- 文本-∅对。
输出:
- Token表征,可用于诸如sequence tagging 或 question answering等token层面的任务。
- [CLS]表征,可用于语义分析等任务。
7 DECOM
Automatic Comment Generation via Multi-Pass Deliberation

| 变量 | 解释 |
|---|---|
| 源代码 | |
| Ground Truth | |
| 代码中的关键词 | |
| 注释 | |
| 初始草稿 | |
| 第 |
|
| 最终注释结果 | |
| 输入代码 |
|
| 关键词 |
|
| 注释 |
|
| 第 |
- 使用BM25方法将语料库中的代码和输入的源代码
进行相似度计算,将相似度最高的代码的注释作为初始草稿
BM25的一般公式%3D%5Csum%7Bi%7D%5E%7Bn%7D%20W_iR(q_i%2Cd)%20%5Ctag%20%7B1%7D%0A#card=math&code=Score%3D%28Q%2Cd%29%3D%5Csum%7Bi%7D%5E%7Bn%7D%20W_iR%28q_i%2Cd%29%20%5Ctag%20%7B1%7D%0A&id=TTnYs)
表示一条query,
是其中的单词,
表示被检索的文档,
表示第
个词
的权重,
#card=math&code=R%28q_i%2Cd%29&id=q5GhQ)表示词
与文档
的相关性得分。
词权重等于IDF(逆文档频率)的值,如果一个词在很多文档中出现,则这个词可能是常用词,不能很好地表征某个句子,因此权重应当更小。
文章越长,相关性得分越小。因为当文档较长时,包含的机会更大,相同词频时,长文章与
的相关性理应更小。
- 将输入代码片段
转换为向量,输入到编码器中计算隐状态(hidden states)
向量转换公式,输入%7D%5D#card=math&code=x%3D%5Bx1%2Cx_2%2C%5Cdots%2Cx%7Bl%28x%29%7D%5D&id=diprG)
是一个可训练的embedding矩阵,
表示第
个词的位置编码,位置编码根据输入embedding的不同维度使用正弦或余弦函数计算而来。
表示embedding向量的第
个维度,
表示向量的维度数。
- 这里直接用的Transformer的原公式。
得到向量 %7D%7D%5D#card=math&code=%5B%5Coverrightarrow%7Bx1%7D%2C%5Coverrightarrow%7Bx_2%7D%2C%5Cdots%2C%5Coverrightarrow%7Bx%7Bl%28x%29%7D%7D%5D&id=wl38m),输入到第一个编码器中,一共有N个编码器。
隐状态计算公式是第
个编码器的第一个子层的隐状态,
是后续子层的隐状态。每个编码器总共有两个子层。
经过N个编码器之后,得到输入代码的最终隐状态
%7D%5D#card=math&code=H%3D%5Bh1%2Ch_2%2C%5Cdots%2Ch%7Bl%28x%29%7D%5D&id=xFvN0)
同理,可得的隐状态
和
的隐状态
- z的序号是k-1是因为还没有经过最后一个解码器

到这一步为止,基本没有动Transformer原版的编码器结构
- 解码器输出注释
首先使用公式(3)计算出解码器第一个子层的隐状态。
计算第二个子层的隐状态
其中表示代码和关键词之间的结合程度,越大则模型越需要注意源码的信息。
是一个可训练参数矩阵。
计算第三个子层的隐状态
最后,根据公式(4),每个解码器的最后一个子层使用计算隐状态。
计算概率分布表示解析步骤(原文𝑗-th decoding step,如何理解?),
见上文Transformer。
最终为
- 评估
的最终隐状态
计算注释的表征(representation)
同理可计算代码的表征,然后使用余弦相似性计算
和
的相似程度
启示
语料库:
the training set of the benchmark dataset as the retrieval corpus
去benchmark找找看
分词器:
javalang [3] and tokenize [5] libraries to tokenize the code snippet for JCSD and PCSD,
试试效果
