Outline(规划)
class1:
理论课:专题主要内容介绍;文本摘要问题定义和落地场景,目前业内的主流方案和框架和主要问题;常用数据集介绍;摘要质量评估方法,评价指标介绍及其实际问题;文本摘要传统方法理论讲解;非监督方案的实现和必要性说明。
代码直播课:指标实现和讲解;传统方法实现和讲解;开放性答疑和讨论:在公司怎么成为一个合格算法工程师?
class2:
理论课:抽取式文本摘要相关方法和模型讲解;baseline讲解;主要问题说明;业内常用实现方案;
代码直播课: 抽取式文本摘要模型实现和讲解;baseline实现和讲解;开放性答疑和讨论:我面试别人的套路和问题?
class3:
理论课:生成式文本摘要相关方法和模型讲解;生成式+抽取式的结合模型;业内常用实现方案;
代码直播课:生成式文本摘要模型实现和讲解;开放性答疑和讨论:身为NLP算法工程师,怎么构建你的护城河?
class4:
理论课:基于预训练模型/多任务模型的文本摘要理论讲解;
代码直播课:基于预训练文本摘要模型实现和讲解;开放性答疑和讨论:尝试解答你目前项目的问题和方案建议?
class5:
理论课:文本摘要系统实现进阶思考;解码阶段的思考和优化;更高级的优化策略;
事实感知模型的策略;多模态模型的介绍;企业级系统部署的推理加速常用方案;
代码直播课:相关模型的实现和讲解;开放性答疑和讨论:NLP进阶之路?
Content
c1
知识点
- 文本摘要问题定义和落地场景
- 目前业内的主流方案和框架
- 常用数据集介绍
- 评估方法和问题
- 文本摘要传统方法理论讲解(非监督)
理论参考
传统方案: cloud.tencent.com/developer/a…
综述:www.cnblogs.com/zz-hh/p/146…
代码实现参考
数据链接和处理notebook: www.kaggle.com/iamownt/lcs…
传统方法: textrank: 代码和讲解 github.com/prateekjosh…
textrank:中文 讲解:www.pianshen.com/article/997… 代码:github.com/DengYangyon…
代码课准备
requirements:
skipthoughts
jieba
nltk
开放问题: 算法工程师:算法+工程师
- 工程能力:代码能力各种框架和开发工具,大数据处理能力:Hive,Spark,Sql。完整系统设计和开发的能力。
- 算法能力:深度和宽度。持续学习的能力。赶得上SOTA这是事情,不一定要但是要有这个能力。1. 好算法就是好算法,一定是有效的。2.创新项目:花里花哨的模型和算法。
- 业务认知:数据和业务逻辑,模型结果导向一定要是业务需要的。->沟通能力。->产品思维。->项目经验。
很多公司或者组不会分的那么清楚,特别是一些小的组,或者有时候需要自己处理一个项目的完整开发周期:什么技能都需要做,业务需求沟通,数据准备,模型设计,模型训练,模型上线,结果测试,数据反馈,模型更新。
不要限制自己只是一个炼丹师。 非纯研究岗:算法是为了解决实际问题。 研究岗:还是去高校吧。
模型的迭代是一名算法工程师的主要工作,但是我们不能为了迭代而迭代,并不是从github上拉最新的代码,套在自己的任务上上线,无效就下一个。这种看似高效的试错式迭代是十分低效的,时间久了会让人十分心累。模型太多了。 我们都知道,世界上没有一套通用的机器学习算法可以解决所有问题,同时也并不是越新的算法就一定效果越好的。有时候需要停下来,动手之前动动脑,思考系统的瓶颈在哪,核心矛盾是什么,然后针对性地去推动问题的解决。这就需要对任务场景有足够的认识,发现问题的能力是作为算法工程师一种无法从课本上学习到的核心竞争力。
作者:kuadoh
链接:www.zhihu.com/question/35…
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
cloud.tencent.com/developer/a…
c2
知识点
- 抽取式文本摘要
- Encoder
- Decoder
- baseline讲解
参考
代码实现参考
baseline: oceaneyes.top/2021/01/04/…
PreSumm: github.com/nlpyang/Pre…
基于图: zhuanlan.zhihu.com/p/138600416
知识点: Trigram Blocking:作为最近更流行的方法具有相同的动机。在选择句子以形成摘要的阶段,它将跳过具有与先前选择的句子重叠的字母的句子。出乎意料的是,这种简单的删除重复的方法为CNN/DailyMail带来了显着的性能改进。
c3
知识点
- 生成式文本摘要模型
理论参考
- 生成式两个优秀模型: cloud.tencent.com/developer/a…
A Deep Reinforced Model for Abstractive Summarization
Convolutional Sequence to Sequence Learning - 京东的文章: developer.jdcloud.com/article/926
理论课
-
Pointer-Generator Networks,经典实现。Copy 和 Coverage 机制。
-
Bottom-Up Abstractive Summarization。加入内容选择器来优化。
-
Retrieve, Rerank and Rewrite: Soft Template Based Neural Summarization。
-
seq2seq模型问题: 1.seq2seq 模型的性能随着生成长度的增加而迅速下降 2.多样性较差:3% 的摘要包含少于 3 个单词。 3.重复性:有4 个摘要重复一个单词甚至 99 次。 4.seq2seq 模型通常专注于按顺序复制源词,而没有任何实际的 “摘要”。
-
基于模板的摘要(template-based summarization)是一种传统的抽象摘要方法:
ReSUM实现:
-
Retrieve 依据:相似的句子拥有相同的摘要模版。 实现:使用Lucene构建IR系统,对每一个输入的句子,检索出top30相似的句子作为候选模版。 这些相似句子的摘要可以提供一个参考点来指导输入的句子摘要过程,这些现有的摘要被称为软模板(soft template),因为不需要实际的规则来从它们构建新的摘要。
-
ReRank
软模版的检索过程是根据文本相似度得到的。但是,在文本摘要过程中,我们希望软模版与真实摘要要尽可能像。需要训练一个具备排序能力的模型。
这个模型的label就是所有软模版(r)与真实摘要()的Rouge值计算的实际显著性,然后训练一个模型,让模型的预测显著性逼近事实显著性。
模型使用BiRNN,共享网络参数,同时编码输入句子x和模版r,第一位和最后一位隐向量拼接起来作为句子和模版的向量表示:
然后使用双线性网络(Bilinear network)来预测输入句子和模板的显著性。使用sigmoid是为了norm数值。
衡量相关性双线性网络比多层感知器更具优势。
这里rerank得到的结果已经实现了SOTA。
类似文本匹配的方案。
- Rewrite
直接使用软模版(r)的问题:包括很多实体没有出现在源文本中, 因此很难确保软模板对于输入句子是可靠的。因此,利用 seq2seq 模型强大的重写能力来生成更可靠和信息更丰富的摘要。
系统的输入包括句子和软模版,将句子和软模版的隐向量(使用之前训练的BiRNN)concat起来,接一个Attention+RNN的常规解码器。softmax预测当前step的摘要词语。
- 训练过程
ReRank和Rewrite两个任务同时训练,共享一个Encoder。 对于ReRank任务,希望预测显著性和实际显著性结果尽可能相似,计算交叉熵。 对Rewrite任务,学习的目标是最大化实际总结 的估计概率。通常使用softmax函数通常和负对数似然(negative log-likelihood,NLL)一起使用。
将两个loss相加。多loss训练策略(zhuanlan.zhihu.com/p/269492239…
参考:www.linkresearcher.com/theses/0f8e…
CNN / Daily Mail数据集目前的SOTA。
- Candidate Generation
在训练阶段,生成模型最大化文档
对应的参考摘要
的似然度,然后通过Beam Search生成多个候选摘要
。
- Reference-free Evaluation
在候选摘要生成阶段,生成16个candidate。
直接训练一个模型来最优化某个摘要评价指标,比如Rouge。 label:就是直接使用所有摘要与文档的Rouge得分, 预测:用预训练模型RoBERTa得到候选摘要和文档编码,使用[CLS]计算相似度,用这个相似度来你和label。 通常对比学习是构造一对正负case。这里将对比损失推广到排序损失。把任务转换为一个排序任务。
- 结合关键词+多任务。
代码实现参考
seq2seq+attention的basline;
c4
知识点
- 预训练模型-文本摘要
- 预训练基础知识
理论参考
- paper0
《MASS: Masked Sequence to Sequence Pre-training for Language Generation》 ICML 2019
参考: adaning.github.io/posts/46395…
- paper1 《Unified Language Model Pre-training for Natural Language Understanding and Generation》
NeurIPS 2019
- paper2
《BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension》
ACL 2019
BART是一种去噪自动编码器,建立了从被损坏的文档到原始文档的一个映射,他使用了一个seq2seq 的模型,在这个模型当中包含了一个双向的encoder 和一个从左到右边的autoregressive decoder.预训练的时候BART 是通过破坏文档再优化重建损失(即解码器输出和原始文档之间的交叉熵。
- 贡献
1.提出使用多种噪声破坏原文本,再将残缺文本通过序列到序列的任务重新复原的预训练任务 2.BART模型的提出解决了预训练模型编码器、解码器表征能力不一致的问题 3.在2019年生成式NLP任务的榜单上刷新了多个SOTA,验证了模型的有效性与先进性
BART的损失函数是decoder的输出与原始文本之间的交叉熵,与其他去噪自编码器(一般需要定制特定的噪声方案)不同的是BART可以使用任何的加噪方式。在极端情况下,源信息可以全部缺失,此时的BART就蜕化成了一个语言模型。
一句话总结:BART通过使用encoder-decoder的训练模型,通过给输入doc加入各种噪音,然后联合训练编码器和解码器,优化重构输出的损失(损失使用交叉熵,label为输入doc)。
- BART与BERT的不同
base版BART的encoder和decoder都是6层网络,large版则分别增加到12层。BART与BERT还有2点不同
(1)decoder中的每一层都与encoder最后隐藏层执行交叉关注(cross-attention,就像在transformer序列到序列模型中一样)。
(2)BERT在预测token之前接一个前馈网络,而BART没有。总的来说,BART比同等大小的BERT模型多了大约10%的参数。
- 微调:
BART模型的下游任务接法: 对于分类任务,编码输入和解码输入保持一致性。最终解码器 token 的最终step的隐藏状态被输入到新的多类别线性分类器中。该方法与 BERT 中的 CLS token 类似,不过 BART 在解码器最后额外添加了一个 token,这样该 token 的表征可以处理来自完整输入的解码器状态。 对于生成式任务,则编码器输入为源文本,解码器输入为目标文本。
- paper3
《 PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization》
ICML 2019 参考:www.cxyzjd.com/article/For… www.jiqizhixin.com/articles/20…
一个假设:预训练的任务与下游任务越相似,微调就越快和越好。
- paper5
《ProphetNet: Predicting Future N-gram for Sequence-to-Sequence Pre-training》
想法: 传统自回归语言模型通过估计文本语料概率分布被广泛用于文本建模,序列到序列的建模(seq2seq),以及预训练语言模型中(如 GPT 等)。这类模型通常使用 teacher-forcing 的方法训练,即每一时刻通过给定之前时刻的所有字符以预测下一个时刻的字符。然而,这种方式可能会让模型偏向于依赖最近的字符,而非通过捕捉长依赖(long-term dependency)的信息去预测下一个字符。有如以下原因:(1)局部的关系,如两元字符的组合,往往比长依赖更强烈;(2)Teacher-forcing 每一时刻只考虑对下一个字符的预测,并未显式地让模型学习对其他未来字符的建模和规划。最终可能导致模型对局部字符组合的学习过拟合,而对全局的一致性和长依赖欠拟合。尤其是当模型通过贪心解码(greedy decoding)的方式生成序列时,序列往往倾向于维持局部的一致性而忽略有意义的全局结构。
细节:
main stream:multi-head attention计算与传统的一样,用一个三角矩阵(对角线上方为0)来控制每个位置只能看到他前面的token信息。
i-th predicting stream:每个时刻,第i个预测流程预测下面第i个词语,使用上一时刻的main stream的隐向量。也就是说,预测第i个词语,需要使用前面个词语的信息。
上面公式是计算k-1层第1个预测流程预测地t-1个step的隐向量,上一层k的隐象量作为attention query,attention key和attention value一样的,使用:将k层的主预测流程前k个step的隐象量与k层的第1个预测流程的隐向量concat起来。 然后使用来预测。
第二个预测流程类似, 不同之处:不同的输入token,不同的绝对位置向量,不同的相对位置计算
每个预测流程都是共享模型参数的,因此可以非常方便的进行预测和fine-tuning转换。
与MASS类似的预训练模式,在encoder段随机mask掉一段token,然后在decoder端预测恢复。不同之处,MASS每个step只预测一个词,ProphetNet在遮盖的span中每次预测n个词语。
代码实现参考
UniLM
c5
知识点
- 训练加速: mp.weixin.qq.com/s/8R4iHEUHz…
- 推理加速
- 生成式+抽取式+各种策略的综合实现, Seq2Seq+PGN+Coverage机制+Beam-Search+Scheduled Sampling
理论参考
- 事实感知
1.1 解释论文
1.2 基于事实表示
1.3 基于蕴含关系 论文: aclanthology.org/C18-1121.pd…
关于:RAML
zhuanlan.zhihu.com/p/97419261
针对结构化预测任务,如做机器翻译,文本摘要,提出了一种把极大似然训练推广到可直接优化任务奖励的方法,在实现上只需要基于奖励信号对ground truth进行增广即可,非常简单而且高效。
以一个典型的结构化预测任务为例,做文本摘要时,数据集可能会对每个原句提供几个可供参考的译句,用极大似然进行有监督学习就是去尝试拟合摘要的每一个词。但正确的摘要远远不止一种或几种,重要的是要找到真正正确的摘要,而不是每个词都要一摸一样。“真正的摘要”这个定义很难量化,但可以通过一些指标(如BLEU和本文的生成摘要的被蕴含程度)来近似评估,这些指标才是我们真正感兴趣的。如果在训练时就能考虑到这些指标,让模型知道“得到的摘要有多好”,肯定比暴力拟合摘要要好。 基于强化学习的结构化预测就是直接把这些指标为奖励用来训练模型,但强化学习本身的一些缺点又导致很难达到理想的训练效果。 这就是为什么我们会希望有一种方法可以在极大似然的框架下直接优化任务奖励。就是RAML。
- 解决train和inference的gap
- Find the problem in decoding, Teacher Forcing
两个问题: 第一个:exposure bias 在训练阶段,每个时刻使用ground truth words来预测一个token。然而在预测阶段,是完全自己预测,没有任何指引,预测当前时刻词就是用上一个时刻预测的词作为输入。这种偏差叫做‘exposure bias’。
第二个:overcorrection
- Solution : Oracle select in decoding 在训练时,decoder的输入有时候是ground truth word,有时候是其他的。 Figure 1
a.World-level oracle selection 实现:最直接的方法就是:对模型上一个 time step 的输出向量softmax后,取概率最高的词作为模型的输入。 +noize:在使用Linear计算每个时刻预测概率分布向量后,向这个向量加入了Gumbel Noise向量,然后再计算softmax。后问实验表明:选择替换词时,加入noise,这个noise可以有效提高模型效果。这个noize可以看成一种 regularization,它使模型在选择替换词是更加健壮、可靠。
公式: temperature 是大于零的参数,它控制着 softmax 的 soft 程度。温度越高,生成的分布越平滑;温度越低,生成的分布越接近离散的 one-hot 分布。训练中,可以通过逐渐降低温度,以逐步逼近真实的离散分布。(Gumbel-Softmax trick 作用:用近似的方式使采样离散变量的过程变得可导,可以做BP运算)。
b.Sentence-level oracle selection 实现: 问题和Force Decoding解决方法: 步骤:再每个batch执行之前,使用beam search计算所有句子的tok-k个候选摘要,再使用BLEU score计算每个摘要与ground truth的得分,最高得分的摘要作为oracle sentence。 从对应位置选取一个词语。
要求:需要oracle sentence与ground truth的长度要一样。 处理方法(Force Decoding):使用beam search在生成句子时,如果再某步没有到摘要的句子长度就遇到了EOS,则忽略EOS,选择score第二的词语。 如果达到了摘要长度但是还没有遇到EOS,则强制选择EOS以及对应的概率。
优化训练Sampling with Decay: 在模型刚开始训练时,如果频繁的用上文提到的方法替换输入时,会导致泛化能力过低、容易陷入局部最低点,因为刚开始模型还没有训练好,而且这时候模型生成的备选句子一般都不是人话;
在训练接近尾声时,若依然用ground truth word作为输入,那就没有解决上文提到的两个问题了。
所以,在训练前期,大概率选择ground truth word作为输入,在训练后期,小概率选择ground truth word作为输入。这个概率定义如下:
- Scheduled Sampling blog.csdn.net/bobobe/arti…
- decoding strategy
各种解码策略的问题: 2.1 选择最大不是最好的策略
2.2 选择k很困难
从上图可以看出来,对于左边这种概率分布比较平均的情况,k取较小值不合适。但是对于右边这种概率分布比较分明的,k取较大值也不合适。 通常来讲,k取较小值,容易生成无用的普通的词语;k取较大值,因为需要将top-k的概率重新归一化,就更容易生成错误的词语。
Nucleus Sampling中选择k是动态的,对应的可以改变模型预测词典中词语的置信区间,解决固定的top-k可能失败的情况。
2.3 SAMPLING WITH TEMPERATURE
所以TEMPERATURE当设置小于1时, 可以将整个的概率向较大概率处倾斜,从而降低选择尾部的概率。 但是,同时,当使用小的TEMPERATURE,在提升生成摘要质量的同时,也会牺牲生成的多样性。
训练加速:
代码实现参考
- 综合实现: zhuanlan.zhihu.com/p/336669142
- 各种解码策略实现: gist.github.com/thomwolf/1a…
colab.research.google.com/github/hugg…
综述类参考
- github.com/Yale-LILY/A…
- github.com/icoxfog417/…
- blog.csdn.net/Ding_xiaofe…
- cloud.tencent.com/developer/a…
- nlpprogress.com/english/sum…
1. 问题定义,背景介绍
数据
数据链接和处理notebook:
2. 评价指标
3. 方案
3.1 抽取式
baseline coding:
seq2seq+attention+beamsearch
3.2 生成式
3.3 事实感知
3.4 多模态
class5:
身为NLP算法工程师,怎么构建你的护城河? NLP的进阶之路,达到什么能力?
-
经历完整的项目 需求沟通(交付结果和评价指标),数据处理,业务定位,模型调研,模型开发,系统开发,数据评估,流程闭环。
-
算法嗅觉 面对一个业务需求,可以很快的知道是否可实现; 可以预估模型的输出效果天花板; 有快速构建适合业务需求的合理训练数据的能力; 快速选择合适的模型,具备训练模型调参的能力;
-
概率论、高数、凸优化等基础算法知识。
一些建议:
- 扩展自己的模型认知范围,不要局限于自己的领域(文本、图像、推荐等等)。
- 多做
- 多读paper,多总结记录。学习花里胡哨的策略。
- 多学习开源paper的代码,尝试复线。
- 想办法搞一篇论文。