直观:宫叶云:基于预训练的自然语言生成在搜索与广告中的应用
优采云 发布时间: 2022-10-25 01:28直观:宫叶云:基于预训练的自然语言生成在搜索与广告中的应用
介绍:本次分享介绍了我们过去一年在自然语言生成方面的一些模型,以及在实际落地场景中的一些工作。
今天我们主要介绍以下工作:
如果你对某个内容感兴趣,想了解更多,可以查看相应的论文。
全文将围绕以下六个部分进行组织:
01
先知网络
在介绍先知网络之前,先简单介绍一下研究背景。我们最初想将生成模型应用于广告 关键词 生成任务。我们身后有很多广告。每个广告都有一个关键字集。用户输入一个查询,所有广告的关键词集得到一个候选集。我们需要使用这个查询在候选集中找到相关的关键词。这本身就是一个检索任务,网上已经使用了各种检索模型。我们希望将生成模型应用于此任务。
下面是一个例子,query 和它的一些对应的关键字,它们是在候选集中找到的。可以看出,关键词并没有我们想象的那么规范,给检索带来了很大的困难。
起初,我们想直接输入一个查询来生成关键字。每个查询可以生成很多关键字。如果关键字在这个候选集中有完全匹配,我们将把它作为候选取出,但生成模型的解码。终端是自由生成的,所以很难保证生成的关键词在候选集中,所以召回率很低。
之后,我们首先尝试将关键字构建成一个 trie 树。在decode端生成时,按照trie树从根节点到叶子节点生成,可以保证每条生成的路径都在一个候选集中。一个对应的关键字,这样当解码受限时,每个解码结果都在候选集中。
这种方法有一个明显的缺陷,如下例所示:
左上角是一些候选关键词。我们将它构建成一个 trie 树,然后在编码“accommodation texas”时对其进行解码。例如,我们解码的前三个词是“最好的酒店”,而特里树上的候选词是 in 和 of。如果是传统的生成模型,我们只能根据之前生成的“最好的酒店”和输入来预测下一个词,判断是in还是of,但是in和of后面跟了哪些词呢?当前这个词很有帮助。如果我们知道 in 后面有 texas,但后面没有,那么我们就更容易选择 in,但是我们现在的生成模型不支持,只能在每一步预测下一个词是什么。基于这种考虑,
我们先介绍一下变压器。在解码端,每一步都使用先前的信息来预测下一个单词。
接下来,这是一个二元组,是未来两个词的例子。给定前一个词后,可以通过标记不同的位置来预测后面的不同词。
这样,对于我们的任务,有了“最好的酒店”,我们可以同时预测它未来可能在不同位置的哪些词,然后看这棵树上每个词后面的词,和我们可以同时考虑。进来。
下面介绍一个我们模型的训练案例。输入是协议德州,输出是德州最好的酒店。这里,第一步给出BOS,然后给出不同的p来预测不同的词。这是第一步的损失计算。
第二步是从第一步中保留一个词,然后对其进行预测。
这是我们计算最后两个单词的损失并将其传回的地方。
这里我们直接将搜索添加到trie树中,这是一个很大的改进,但是考虑到这个框架不仅对这种基于trie树的搜索有效,还可以添加到预训练的生成模型中,来生成一个通用的框架。我们使用这种预训练方法来采集大量未标记的语料库,并使用掩码语言模型的任务来预训练我们的模型。我们使用的预训练任务与掩码中的相同。当时使用的是预训练任务。一个很重要的考虑是因为这个预训练任务,decode端只需要在encode端建模mask的位置,所以decode的计算量会很小,pre-training会更快;其次,如果算力不是那么强,
我们做了纯中文、纯英文、多语言(预训练100种语言)预训练,并在Dialog上预训练模型。我们的代码和模型放在这个位置:
有兴趣可以下载。
在中文中,它是在这些任务上完成的。一是输入问题直接生成答案;输入描述以生成问题;并输入文档以生成摘要。
可以看出我们中文版的预训练模型在不同的任务上还是有一些改进的。
在英语中,我们输入一个文本,生成一个多句摘要,生成一个单句标题,并给出一篇文章和一个答案跨度来生成相应的问题生成任务。
以下是 CNN Dailymail 上的生成性能。与BART相比,我们使用相同的预训练语料库,但我们只训练了14个epoch,它训练了40个,并且在相同epoch的情况下,我们decode端的计算量比它小,它恢复了整个句子,输入是512个token,输出也是512个token;我们的输入是512个token,输出只有这里面token的15%,所以decode端的计算量要小很多。
以下是不同任务的结果:
以下是 QG 任务的结果:
在预训练之前,QG任务是我们之前做过的一项艰巨的任务。我们觉得直接生成问题并在线应用仍然很难,但是经过预训练后,这个任务得到了很大的改进。.
其次是多语种。我们使用 100 种语言的语料库对模型进行预训练,在英语语料库上微调,然后直接在其他语言上进行推理,还进行新闻标题生成和问题生成。
以下是我们对中文对话和英文对话的一些结果:
下面是 ProphetNet 直接与没有预训练的 Transformer 对比的结果,而在预训练的时候,预测的未来词数是不同的,结果有什么变化。可以看出,增加克数的时候,从1gram到2gram有比较公平的提升,到3gram的时候提升会小一些,但还是会有一些。
以下是广告关键字项目的实验结果。我们使用 2.6 亿个关键词作为候选集,然后使用 100 万个训练语料库训练模型,最后使用 10k 个测试集。所有的世代都连接到trie,只有第一个BM25被直接检索。BM25的优点是不需要训练,可以直接检索,但是性能很差。可以看出,加入后,召回率可以大大提高。,这是对真实项目数据集的实验。
这是我们的第一项工作,我们从头开始预训练生成模型并获得不错的性能。
--
02
生成模型引入外部知识
我们在生成模型中引入一些外部知识,并使用 CommonGen 语料库进行实验任务。考虑我们的任务是输入查询然后生成关键字。查询本身不是孤立的。它有很多点击信息。所有这些信息都可以用来帮助我们生成关键字吗?
为了验证引入一些外部信息来辅助生成这个方法,我们使用了 CommonGen 语料库。这个语料库的任务是输入一个概念集,输出一些日常场景,覆盖这些概念的一个句子。要做到这一点,你需要知道它背后的概念之间的关系,即常识的知识,然后利用它们之间的关系来生成一个句子,就像你给一棵树和一个苹果,苹果长在树上。,肯定没有问题,但是当树长在苹果上的时候,就有问题了。它们都很流畅,但必须输出合理的句子。
一个简单的想法是通过这些概念引入一些外部知识。在这些知识中,可能会涵盖一些概念之间的合理组合,通过得到的东西,可以从这个原型中得到最终要生成的句子中一些缺失的关键信息。直接的方法是输入概念集,然后输出是解码后的目标句子,我们拿概念集,去开放域中一些未标记的语料库,找到一些与这个概念相关的信息,然后添加这个信息在我们的模型中,帮助它生成它的目标。
得到这些辅助信息后,如何将其引入模型中?获得的信息有很多对生成有用的东西,但也带来了很多噪音。为了尽可能地添加有用信息和去除无用信息,我们设计了不同的方法,包括缩放模型和原型位置指示器。
缩放模型有一个模块来判断这些令牌在原型中的重要性。原型位置指标是判断外部信息中收录的概念在句子中的位置,即其他词相对于它的位置距离,这也在一定程度上反映了这些词的重要性,然后添加位置指示器。
接下来,问题可以定义如下。有一个概念集、原型和目标。我们要构建的模型是根据概念集和原型生成这个目标。
我们的模型由三部分组成。第一部分是嵌入。因为引入了原型,所以输入由两部分组成,一是概念,二是原型。我们向它们添加了组嵌入,并将它们分别添加到概念和原型中。此外,我们添加了编码器端和缩放模型,以帮助过滤,尽可能多地提取有用信息,并帮助生成。
以下是组嵌入,在其令牌中添加了概念和原型的特殊嵌入。
接下来是缩放模型的部分,它在编码器端。我们得到原型和目标之间重叠的这些词。我们认为它们更重要。如果没有重叠词,我们认为不是特别重要,所以有一个0-1标签。在编码器端,我们将训练它来学习对这些重要词和不重要词的预测,然后在输入到*敏*感*词*端之前将这个权重添加到最终词的表示中。
接下来是原型位置指示器。当我们直接在编码器端输出嵌入时,我们将其与输出信息一起输入到*敏*感*词*端。例如,对于概念中的单词,因为它直接是概念,所以它的相对位置距离为零。对于原型中的单词,它与最近概念的距离,有的相对距离是1,有的是2,这个位置信息和encoder的输出一起被引入decoder。
然后我们进行实验。我们使用不同的方法从不同的语料库中获取原型,一种在域内,另一种在域外。in domain 是构建这个候选语料库时与CommomGen目标在同一个域中的语料库。out of domain 是开放域,我们直接使用维基百科的语料库作为外部数据集。
最后,实验结果,无论是在域内还是域外,可以看出模型引入这些信息后,都有比较大的提升。这是因为原创语料系统中给出的baseline没有经过预训练,所以比较差。加入预训练后,这个任务有了明显的提升。信息引入后,将进一步完善。域内肯定会更好,域外也会有明显的效果。这是我们在 CommonGen 上的工作之一。
接下来,我们介绍几篇关于 ICML 的作品。
--
03
非自回归预训练
第一个是非自回归预训练。上面介绍的模型都是基于预训练的,模型比较大,生成模型的decode端一般都是自回归的。每一步都会在解码端生成一个单词,一个令牌一个令牌。生成时,它的延迟一般较高。广告关键词生成的时候,在线上很难使用,只能离线生成。怎么让它在线生成,有不同类型的方法,可以考虑提炼一个小模型,或者使用深度编码器,浅层*敏*感*词*。因为latency主要在decoder端,decoder端比较浅,encode端比较深,但是不管怎么做,只要是自回归的,总会一个一个token生成,而当它在网上使用时,因为它的限制在我们这边是10毫秒,10毫秒的延迟要求还是很难满足的。从 2018 年至今,非自回归在机器翻译中得到了大量研究。我们考虑如何在这个任务中引入非自回归,并使用我们的预训练方法来提高它的性能,所以我们提出了 BANG。
在介绍 BANG 之前,让我们回顾一下我们的自回归方法。例如,输入是 x0 到 x3 的序列,输出是 y0 到 y3。在自回归的方法中,输入直接对x进行编码,然后decoder端是token by token的,也就是每个token是根据前面生成的部分和encoder端的输入生成的,所以延迟会更高.
在非自回归方法中,每个token不再基于之前生成的token,而是基于输入和一个mask,即直接在decoder端输入mask和位置,然后直接预测目标。延迟确实会很低,但它的性能会显着下降。
我们使用各种方法来提高其性能,包括使用自回归进行提炼,或设计一些半自回归方法。我们设计了一种新的半自回归方式来从自回归过渡到非自回归。
在*敏*感*词*端,逐个token生成自回归,一次生成非自回归。我们的半自回归,前几个token是直接自回归生成的,最后几个token是非自回归生成的。一个动机是:当你要生成一个十词的句子时,前五个词一旦生成,后半句可能更确定,更容易生成,所以我们让前几个词使用 auto 回归的方法,后面几句话比较容易,用非自回归的方法。
在BANG中,所有的自回归token都是一个token一个token生成的,非自回归token都是一次性生成的,半自回归中间变化的整个过程都在同一个模型中考虑,比如y3的生成这时候只能覆盖y2来预测y3,也可以覆盖y2和y1,也可以覆盖y的前面,这是非自回归的。我们在培训期间会考虑所有情况。这样做的一个好处是,当模型学习一个困难任务时,它可以让它先学习简单的任务,它也将帮助我们很好地学习整个困难任务。同时这也是一个多任务,因为半自回归的任务其实非常多,让不同的自回归和半自回归帮助非自回归。
还有一点就是,学了这个之后,这个模型自然是直接支持这三种推理了,只考虑性能,对延迟的要求不高,那就用自回归的方法;如果延迟要求高,性能可以低一些,可以使用非自回归;当然也可以使用半自回归,可以在前两者之间任意调整。你可以调整你面前的多少个词去自动回归,多少个词去非自动回归。和性能可以自由调整。
解码端不同的自回归、非自回归和半自回归有不同的输入,没有办法直接用transformer训练它们。由于这些任务的输入不同,我们提出了一种对n-stream self attention进行了一些改进,并设计了一种cross visible n-stream self attention的机制来有效地同时训练不同的输入,并且它们可以在一次解码中得到有效训练。
我们使用未标记的语料库对模型进行预训练,然后对三个下游任务进行评估,包括用于生成问题的 SQuAD、用于汇总的 XSum 和用于生成响应的 PersonaChat。
因为这个模型支持不同的推理,我们也比较了不同的基线。非自回归和半自回归方法都有很大的改进。这里我们还介绍了预训练。
下面是我们和自回归的延迟比较。与这种方法相比,我们直接用变压器做,速度提高了十倍。在不同的任务上得到相同的结论。
--
04
长文本建模
介绍另一项工作,Poolingformer,这是我们在长文本建模方面的工作。在介绍这项工作之前,先介绍一下transformer,输入一个序列,我们对每个token做full self attention,每个token都会和其他所有token一起计算attention,所以计算复杂度是一样的。当输入序列长度特别大时,例如输入10000个token时,计算量非常大。一些常见的预训练模型将其最大输入长度限制为 512 个标记,例如 BERT、Roberta。
对于这种长文本,我们如何建模呢?在做谷歌的NQ任务时,是一段很长的文本。基于Roberta,我们首先对长文本进行切片,然后对片段进行建模,最后进行合成。这样一来,在这个长文本建模出来之前,我们当时在那个榜单上做得还不错,后来长文本建模的各种模型也很多。这里我举两个例子,一个是Longformer,一个是Linformer。大家的核心思想是如何压缩计算量,然后使用这种稀疏注意力的方法。在之前的transformer中,每个token直接看其他所有token,直接计算attention。然后在Longformer中,每个令牌都没有直接看所有令牌。每个令牌周围的这些令牌非常重要,
Linformer是:查询不变,要计算的token就是这些,但是对于整体的K和V,就是其他token,先压缩,然后直接看压缩。
我们的方法比较简单。我们设计了一个二级窗口。通过实验,一级窗口非常重要。必须直接查看每个令牌周围的令牌。比如一级窗口,我们直接查看窗口内部。做充分的自我关注,对稍微远一点的代币直接使用池化。以二级窗口为例,有1000个token,先压缩成100个token,然后只查看压缩后的,二级窗口外的不查看。这样的模型是一个常数,也就是计算量。当它比较小时,我们看不到当它继续变大时,节省的计算量仍然很多。
下面是不同长文本建模、计算量、计算复杂度的对比,分享给 Longformer 和 BigBird。
我们也在 Google NQ 列表和 TyDi QA 列表中。谷歌的NQ是输入一个问题,给一个维基百科,然后去维基百科找一个span作为答案,这是一个简短的答案。如果你寻找护照作为答案,它是长答案,所以有两个列表。TyDi QA 是我理解的多语言 NQ。
以下是文档层面的总结,我们使用数据集 arXiv 进行总结来验证我们的模型。前四种方法都是基于直接转换器,最大输入长度为 512 个令牌。接下来的两个,一个 BigBird,一个 LongFormer。16k是最大输入长度是16000个token,4k是4000个。可以看出我们的方法在这个任务上表现不错,而且相比4k和16k,它的输入长度变大后,性能也有明显提升。
最后,分析我们的模型。比如我们用二级窗口,能不能用特别大的二级窗口通过NQ实验?当一级窗口固定,二级窗口不断变大时,模型并不是性能一直在提升,所以我们不直接压缩二级窗口的整个序列长度,然后直接看。压缩整个序列的长度带来的问题是计算量会变大很多;其次,对于距离特别远的token,可能噪音多于有用信息,所以不需要直接看。
还有一些不同的压缩方法,包括Mean pooling、Max pooling等。
--
05
生成模型加速实现
然后我会介绍我们为加速生成所做的一项工作,该工作也发表在 ICML 上。当我们生成时,在自回归解码端,每一步都会生成一个令牌。为了生成第 t 个令牌,我们考虑输入 X 和之前生成的 t-1 个令牌。在生成第t+1个token的时候,我们考虑的更多的信息就是上一步生成的yt,所以在上一部分,这两个步骤是共享的。如果每次都重新计算,那么每一步都会有很多重复计算,所以在一般的实现中,我们会缓存之前的内容,每次更新时只计算新增的东西。
在multi head attention中,我们会缓存所有的key和value,这样每一层都会有自己的缓存,这会导致模型中缓存很多内容。为了维护这个大量的缓存,缓存被操作。这非常耗时。
在这里,我们提出了一种新的注意力方法,称为 EL-attention。
之前我们实现multi head attention的时候,都是把K乘以W,V乘以W,K和V都被缓存了。这里我们不会缓存这部分,这样会节省很多缓存消耗,但不在缓存中,重复计算是不可避免的。这是用快速计算替换大量缓存的操作,看哪个更快。这里我们介绍 EL-attention,它是对多头注意力的改进。
在multi head attention中,我们通过WQ、WK、WV得到Q、K、V,然后计算attention。这里,Q每次生成时只加一个yt,所以Q只是一个向量,但是K和V根据任务的不同可能是不同的向量。如果输入很长,或者batch size比较大,K和V是一个很大的矩阵和很多向量,而Q只是一个向量。如果直接计算K乘以W,V乘以W,计算量非常大。,但Q乘以W的计算量很小。
这里把这个查询换成EL查询,就是把之前的直接Q乘以WQ,换成Q乘以WQ,再乘以WT的一个转置,这样就得到了一个新的Q,然后这个新的Q放在这个attention中,不再进行Q、K、V这两个操作,然后直接用它们计算attention。Attention计算后,通过这个FFNO进行计算,最后乘以V的参数。这其实是一个等价变换,但是它的整个计算量会大大减少,因为Q非常小,所以所有的矩阵运算都是在一个1上进行的维向量。当K和V的输入比较长或者batch size比较大的时候,是一个很大的矩阵运算,所以它的计算量非常大。所以,
下面是之前的multi head attention和EL-attention的对比,但是在计算上,并没有添加缓存的操作。这个圆圈的面积就是每个部分所花费的时间。以前,multi head attention是这三个部分的组合区域。EL-attention只有这两部分,因为K和V都不会乘这个参数,所以在K和V上没有时间消耗,所以直接计算一个ELQ再计算。
另外,在transformer、BART、GPT等不同模型中加入了这种机制,对比不同生成任务的任务。当性能不下降时,速度会显着提高。
下面是比较不同批次大小或缓存的结果。
--
06
为模型生成基准
我们还构建了一个生成评估基准,其中包括八个语料库和四个任务。
下面是我们的排行榜。
直观:网页信息采集工具
网站通用信息采集器可以捕获网站上的所有信息并自动发布到您的网站,无需手动操作即可全自动,您可以在睡觉时保持网站最新信息。网站通用信息采集器的八大特点: 1.数据采集全自动添加网站捕获的目的主要是为您的网站添加,网站通用信息采集器软件可以实现信息采集添加的自动完成。其他网站刚刚更新的信息将在五分钟内自动运行到您的网站,你说容易吗?2.多级页面采集一次抓取整个网站 无论有多少大类别和小类别,都可以通过一个设置同时采集多级页面的内容。如果一条信息分布在许多不同的页面上,网站通用信息采集器可以自动识别N级页面,实现信息采集抓取。该软件附带了一个8层网站采集示例3。可以下载任何类型的文件 如果需要采集二进制文件(如图片、Flash 和视频),则可以网站 采集器简单设置将任何类型的文件保存到本地计算机。4. 自动识别 JavaScript 特殊网址 许多网站网页链接在开始时都与 JavaScript // 相似,网站通用信息采集器也可以自动识别捕获的内容 5.采集筛选器重复项 导出筛选器重复项 有时 URL 不同,但内容相同,优采云采集器仍可以根据内容筛选重复项。(新版本新增功能)6. 多页新闻来自