文 | 小喂老师
编 | 小轶

作为NLP领域的“三高”用户(高产、高能、高钞),FaceBook最近(2020年11月)又发表了一篇高水准文章,目前已被COLING-2020接收,号称解决了自然语言生成(NLG)落地的问题:Best Practices for Data-Efficient Modeling in NLG:How to Train Production-Ready  Neural Models with Less Data

看到这个有点标题党的文章,我不禁要发出关于NLG落地的素质三连:

众所周知,对于自然语言处理中的NLG问题,一直都没有很好的落地场景,即便是目前最合适的“文本自动摘要-Auto Text Summarization”,也没有特别合适的产品和落地领域。所以虽说你是大佬,但我也不觉得你可以做第一个吃螃蟹的人!

抱着这些疑惑,我一口气读完了整个paper,然后不禁发出感慨:“就这?”——啊不,打错了——然后不禁发出感慨:“四高一”!!!

本篇文章的亮点比较多,属于一篇偏实验性论文,总结为一句话就是:流程化NLG在对话系统落地过程中开发步骤和评估策略

文中研究的NLG主要指对话系统中的NLG。为解决NLG应用落地的难题,论文设计了一套Tree-Based数据集,并据此推出Bucketing训练策略 + TreeAccuracy评价策略。此外,还讨论了NLG中的数据增强知识蒸馏生成模型选择Data-fficiency问题。为对话系统中的NLG落地给出了一套完备&Less-Data&Low-Latency&生成结果High-Acceptable的方案

哈哈,这么高的评价,那我们看一下这篇文章到底做了啥!

论文题目

Best Practices for Data-Efficient Modeling in NLG:How to Train Production-Ready Neural Models with Less Data

论文链接:

https://arxiv.org/abs/2011.03877

Arxiv访问慢的小伙伴也可以在 【夕小瑶的卖萌屋】订阅号后台回复关键词 【1221】 下载论文PDF~

NLG先验知识

在谈论这篇论文之前,我先和大家的沟通一下NLG这个任务,保证大家有一个共通的认知观点。

自然语言生成(Natural Language Generation)是一个很难或者说高复杂度的自然语言处理任务。广义的NLG是给定一个输入(可以是文本、表格、图片或是结构化的数据),输出符合该输入的一段文本描述(可以是文章写作、摘要,也可是图片内容描述)。NLG通常被认为是真正意义上的人工智能,一个完备的NLG任务意味着图灵机的实现。本论文的NLG是特指对话系统(Chatbot System)中的自然语言生成,对于一个对话系统,它通常有如下几个部分:

  • 自动语音识别-ASR

  • 自然语言理解-NLU

  • 对话策略-DM

  • 自然语言生成-NLG

对于此处的NLG任务,它的输入是<Query, DM产生的Actions>,输出的是一段文本回复。

因为是一篇偏实验性的论文,所以论文的要点理解和模型框架并不算特别的难,但是需要大量的先验知识储备。接下来的四个小节中,我将依次列举一些必要的先验知识,包括:

  • Chabot System中的NLG

  • Structured NLG Data

  • Bucketing策略

  • BART模型

Chabot System中的NLG

在对话系统中,经过NLU,DM之后会获得一系列的Dialogue Actions,这类Dialogue Actions就是NLG的重要输入。在Chabot System中做NLG,常用的方法是基于模板生成结果。但是太过于死板且不可迁移。后来就提出了基于Encoder-Decoder的模型生成,和模板生成进行比较,也是有各自的优劣点(具体讨论可见论文细节)。

这里为了能让读者有一个对NLG任务比较直观的理解,给出了一个简单的例子(其中Query和Actions通常作为NLG的输入,ExpectResponse则指代模型NLG的输出):

Query: "我要买一张明天去北京的火车票。"
Actions: {
"intent":"买火车票",
"slots":["destination":北京,"departure":UNK,"time":DayTime[“明天”]_DetailTime["UNK]]
"actions":["询问具体时间","询问出发地点"]"ExpectResponse":"请问您想买【明天】【几点】的火车票?【出发地点】又是哪里呢?"
}

Structured NLG Data

如果使用Encoder-Decoder的生成模型来做NLG,那么不可避免地就引入了模型输出结果不可控制的问题。在生成的模型中,可能缺少重要的要素,也可能要素值生成错误,这些都是生成模型中不可控制的。

作者所在的团队在2019年的一篇论文中(Constrained decoding for neural NLG from compositional representations in task-oriented dialogue ),给出了一种解决方法:它将输入的action使用tree-structured的方式进行存储。这样的结构引入了更多的信息,也便于后面对生成结果进行判定。本文实际上也算是Facebook在以前工作上的一种再创新。

为了便于读者理解,这里给出了论文中一个关于tree-structured input的数据。这是Facebook发布的Dialogue System中的一个case。他将Actions结构化。Reference指期望给出的NLG输出。

Query: "Do I have any reminder to buy milk?"
Structured Actions: INFORM 1[amount[ 3 ]]INFORM 2[todo[ buy milk ] date time[time[ 7 pm ]]]INFORM 3[todo[ buy milk ] date time[colloquial[ tomorrow ]]]INFORM 4[amount remaining[1]]
Reference: Yes, there are 3 reminders. The first two are, buy milk at 7 PM and tomorrow. There’s 1 other reminder.

Bucketing策略

这种策略方式使用比较少,在机器学习中有使用过(我也是咨询了一位同事之后,才了解和理解的)。

在深度学习中,我们通常随机选取一批数据进行模型的训练。如batch_size = 64,选取64个随机数据进行训练。Bucketing则是一种按照某种【策略】将数据分成一个个的bucket(桶),然后将一个个的Bucket的数据丢入到模型中进行训练。这样的训练方法可以减少在模型训练过程中由imbanlanced distribution带来的bias,也能提高数据的利用率,是常用的一种利用“少量数据”训练模型的方法。

在Bucketing的过程中,这种【策略】就非常的重要。好的策略能大大提高数据利用率,坏的策略通常不比随机好,甚至会误导模型的学习。设置Bucket策略的出发点是:各个bucket中的数据中,不一样的信息是希望模型能够学习的信息,一样的(共有的)信息是模型可以忽略的信息

在本论文的任务上,因为数据是tree-structured的数据,作者这里数据的tree-structured degreeargument values,尝试了多种方法进行Bucketing,都取得了比random好的效果。

BART模型

BERT模型我听过,BART模型又是啥??是不是写错了?BART是FaceBook AI团队在2019年发布的一款适用于生成的预训练语言模型

▲BERT、GPT、BART模型框架比较

如果说BERT适合做NLU,GPT框架适合做NLG。那如果我二者取其长,是不是就能更好的做NLP任务了?这个想法很简单也很正常,但你发不了paper,因为你没钱去训练这样的模型,但人家FaceBook有,所以人家FaceBook发了Paper(手动狗头)。模型框架很简单,但是非常有效,出来即刷新榜单,目前在NLP任务中,同量级的模型上仍有多处属于SOTA。

BART模型在HuggingFace的Transformers上开源了自己的预训练模型。笔者在今年8月份使用过BART模型进行过文本摘要生成。对于英文的生成来说,效果确实非常好,基本不用fine-tune也能比较好的生成通顺的有意义的文本;但是对于中文,因为没有Bart-zh,所以无法直接测试。不过FaceBook开放了25种语言的mBART,可用来做中文的文本生成,但直接生成的效果不好,语句通顺都成问题,还未尝试过fine-tune。不过从当前他人的使用评价和论文的结果来看,BART是一个很适合文本生成的预训练模型。

Paper Body

在介绍文章主体之前,我们再梳理一下文章说到的几个要点知识。确保这几个知识点你都能接受和掌握,我们再来看文章细节。

  • NLG任务是给定输入的(dialog act,user query),生成语句通顺,信息正确的回答。

  • 传统NLG系统大多使用基于模板的文本生成(template-based text generation),有优有劣。

  • 新的基于神经网络的NLG(neural-network-based language generation),其框架中主要步骤包括:

  1. 对于输入进行meaning representation(MR);

  2. 使用sequence-to-sequence(S2S)框架,产生对应的response。

  • 因为本论文要探讨的是NLG产品化落地,所以我们期望探索不同数据量下模型精度结果的情况。即,在Data-Reduction的情况下,如何提高Data-Efficiency

  • 因为是要探讨NLG的产品化落地,所以也期望做一下模型压缩在NLG方面的探索。

  • 在上面的几点理解后,我们从以下4个方面来看这篇论文:

    • 训练数据

    • Bucketing策略

    • 评估方法

    • 模型

    四种训练数据

    数据这里使用的是Facebook团队2019年给出的四个对话系统相关的数据,数据的存储格式都是tree-structured的,数据的领域分别是:Weather, Reminder, Time, Alarm。数据的样例格式如上面给出。

    四种数据处于不同难度级别,其中Weather最难,Alarm最简单。论文作者认为,这四个领域的数据能基本代表Task-oriented Dialogue System上NLG的难度水平,也基本满足NLG任务的任务需求(虽然笔者我不这么认为,读者也不一定这么认为????)。

    三种Bucketing策略

    这里作者根据数据tree-structured的结构特色,使用了三种Bucketing策略,分别是:

    • Coarse grained(CB): 使用data中argument names进行Bucket group

    • Medium grained(MB): 精细到使用data中sub-arguments进行Bucket group,对于词语的形态进行归一化

    • Fine grained buckets(FB&FBQ): 更精细化的操作,包括对argument-value去语义化,甚至对query进行去语义化 (FBQ)

    ▲Bucketing 策略示例

    一个完整的训练集使用不同的Bucketing策略,将会被分割成不同数量的buckets。越精细的Bucketing策略,被划分的buckets数量就越多。比如Weather的训练数据集使用CB:MB:FB划分得到的buckets数量分别是2240:6406:15456. 如上图是一个case以及其各种bucket策略的例子表述。

    实验结果证明,无论哪种Bucketing策略,效果都优于random。其实可以预料得到,因为一个正确的bucket策略相当于引入了先验知识,让模型更能按照正确的方向进行优化学习。所以同等训练量和模型容纳能力的情况下,模型效果会更优。

    三种评估方法

    说到NLG问题,就一定绕不开NLG产生结果的评估。因为是自然语言生成的结果,和标准结果之间不能简单的用“==”来判断结果是否正确,因为会存在语义相同,表述不同的结果;也不能使用简单的Rouge-L来评判,因为如果在关键词(如数字,是否)上表述错误,是不可原谅的。所以NLG的结果评判也一直是一个问题。当然,可以引入人为评测,但是如果每一个NLG都使用认为评测,那么成本将非常的高昂。这里作者所使用的3种评测方法是:

    • Tree Accuracy: 因为数据本身是tree-structured数据,所以非常方便的检测生成文本的重要token是否是MR中的token,如果是记为1,否或者缺失记为0;

    • BLEU: 2002年提出,是NLG中通用的一种结果检测方法。此处不做细述。

    • 人工评测:有钱土豪用人工,土豪FaceBook没道理不用。这里论文从Correctness和Grammaticality两个方面对生成文本进行测评。

    三种模型方法和结果

    在原论文中最后给了7种模型策略,但我只列举了三种,因为其它都是在该三种方法上的排列组合。

    • S2S:使用Sequence-to-Sequence框架,用LSTM做encoder和decoder,输入的embedding使用的是glove的embedding。优点是轻量级,小。

    • BART:基于BART的模型框架进行Encoder-Decoder的模型训练,在BART的基础上进行fine-tune。

    • KD(Knowledge Distillation,知识蒸馏):使用BART的模型太大了,不利于模型的线上使用,需要使用知识蒸馏的做法。这里KD指的是将BART蒸馏到S2S模型中。

    此外,作者还提到了JT和DDA。这不算模型,算是两种通用的增强模型效果的方法:

    • Joint-Training(JT): 将多个相近领域的数据一起训练。

    • Dynamic Data Augmentation (DDA):对于不同的Epoch,随机替换每个argument value。这样即便使用一批数据进行训练,每个Epoch的数据都不一样,增大数据可用性。个人认为:由于此任务数据的固有特点,才得以使用该方法进行数据增强,算是合理利用数据特色进行数据增强的一种方法。

    最终输出的7种模型分别的输出结果如下:

    图中横坐标是训练数据量,纵坐标是精度。最后作者认为:S2S+KD 和 S2S+KD+DDA取得了最好的效果

    当然,全文的重点是NLG的Data Efficiency,所以会实验各种数据量之下的模型结果,DDA策略无疑Data Efficiency最佳。而KD效果最差,但KD主要是为了工程应用而生,毕竟KD之后的S2S模型只有2M。

    能达到这样的结果,确实振奋人心。用几句话总结论文的结论,那就是:我们的Bucketing策略很好,我们的DDA很好,我们的TreeAccuracy很好,我们的KD很好。

    此外,论文还分别给出了在四个Domian上的3种测评结果以及人工测评结果,最后给出结论:我们提出的Tree Accuracy还是很有代表性的;我们使用的S2S+KD+DDA是很有效果的,在四个Domain上通用。

    论文结论

    文章的结论我打算整体翻译一下,因为确实是提纲挈领,很有概括性(英文好的建议读原文,原文截图我保留在下面):

    在训练task-oriented对话系统时,不仅要考虑模型的精度,还需要考虑模型的数据利用率以及可接受性(acceptability),响应延迟和所需的开发维护成本。为此,我们提出一个NLG开发流程:

    • 根据数据中的结构(此处为基于树)对meaning representation进行Bucketing采样,以避免不必要和不平衡的数据采集,每个bucket收集1-3个case。训练模型并进行评估。

    • 如果有任务和语义相似的多个domain数据,可以先进行联合训练,然后进行domain内微调。训练模型并进行评估。

    • 实施动态数据增强(DDA),以减少响应对“可互换参数值”的依赖。与增强数据一起训练,并评估模型性能。

    • 首先,使用预训练的模型(例如BART)为未标记数据生成响应,得到增强数据。然后,用增强数据和人工标记的数据,训练一个小模型(KD)。最后,用人工标记数据,进一步微调该模型。评估模型性能。

    • 如有必要,请为每个MR存储桶收集更多示例,并从头开始部署模型。

    ▲论文结论

    我的理解

    关于论文

    论文本身是一个偏实验性的论文,所以阅读时需要注重理解论文设计的原因。因为是做对话系统中的NLG,而且是基于该组2019年发表的数据集进行训练,其格式化的数据格式,引入了本文中两个非常大的亮点:Bucketing策略 和 DDA方法。注意,这两种方法都是需要在Tree-based数据上进行实现的。此外,模型使用的BART模型和KD方法,都属于比较通用的方法,创新性属于锦上添花。

    当然,论文期望知道 NLG落地对数据的需求(Data Reduction)、可能的数据增强方法(DDA)、模型压缩(S2S+KD)能达到的精度和应用领域的差异影响 的结果是什么,并为此设计了一系列实验,也给出了相应的结论。

    关于NLG

    如开头所说的,一个完备的NLG意味着真正图灵机的实现,也意味着真正人工智能时代的到来。目前各大顶级公司都在走这样的路,包括目前很多论文都是将大量的NLP任务转化为语义理解的任务,如:机器阅读理解代替NER,QA方式代替信息抽取,模型生成代替文本分类。例如T5模型将各类NLP任务转化为一个通用任务模型,例如GPT-3的finetune用普通的自然语言描述代替。NLG目前不属于一个很好的可以工业落地和应用的领域,但是自然语言学者们却一直在探索NLG的任务。

    一直说NLG的回答有很多的不可控性,本论文给出了一种Tree Accuracy的方法来评测模型生成的结果,确实从一定程度上衡量了模型输出结果的准确性,算是为NLG的落地提供了一些方向(在格式化文本输出的落地上提供可能)。但是这种情况其实是假设我们已经获取到了输出所需的槽位值,而非真正意义上的从文本中去理解,然后获取相关关系,再产出合理化的回复。所以本文对于通用意义上的NLG有参考意义,但对于问题的解决还是有很长的路要走!路漫漫其修远兮!

    最后的最后,请记得,素质三连!!!

    后台回复关键词【入群

    加入卖萌屋NLP/IR/Rec与求职讨论群

    后台回复关键词【顶会

    获取ACL、CIKM等各大顶会论文集!

Facebook大公开:解决NLG模型落地难题!工业界的新一波春天?相关推荐

  1. 全球首发!老子云支持三维格式多达66种,可解决95%模型展示难题

    经常在网上看到3D模型师吐槽,被模型格式折磨得可太惨了. 因为3D模型大部分都是格式各异,数据信息无法互联互通,一个个手工处理至统一格式又十分耗时耗力,有时还无法达到预期效果. 老子云为了打破这一技术 ...

  2. 从特斯拉人形机器人亮相看AI人工智能模型落地面临的两个难题

    当地时间9月30日,美国特斯拉公司的人形机器人-"擎天柱"(Optimus)亮相,这款机器人之前在一些媒体的报道中,有些功能已经展现了不俗的表现,令人叹为观止. 在这次的亮相中,又 ...

  3. 解决程序员加班难题:项目研发管理项目5大关键

    如何解决程序员长期加班熬夜的问题,提高软件研发效率,加强项目团队管理?这几点很重要:  1.流程计划非常重要 在软件开发中,项目团队需明确项目研发中的关键流程,而程序员更要清晰知道各项目阶段的工作计划 ...

  4. 中文稀疏GPT大模型落地 — 通往低成本高性能多任务通用自然语言理解的关键里程碑

    作者:同润,临在 团队:阿里云机器学习平台PAI 1. 概述 GPT模型能较好的处理NLP各个应用领域的任务,比如文本分类,推理,对话,问答,完形填空,阅读理解,摘要,生成等等.百亿/千亿参数量级的G ...

  5. 阿里云机器学习PAI开源中文NLP算法框架EasyNLP,助力NLP大模型落地

    作者:临在.岑鸣.熊兮 一 导读 随着 BERT.Megatron.GPT-3 等预训练模型在NLP领域取得瞩目的成果,越来越多团队投身到超大规模训练中,这使得训练模型的规模从亿级别发展到了千亿甚至万 ...

  6. 【每日新闻】企业微信终于与微信实现互通,微信生态商业化的想象力究竟有多大? | To B“非成勿扰”,解决企业服务对接难题

    每一个企业级的人  都置顶了 中国软件网 中国软件网  为你带来最新鲜的行业干货 小编点评 我们希望邀请更多的生态伙伴 共同探讨 共同行动 2018年4与人25日 北京站,不见不散! 趋势洞察 生态视 ...

  7. 大模型落地实践系列四、大模型研发应用的节奏?

    大模型落地实践系列四.大模型研发应用的节奏? 近年来,随着计算机硬件性能的提高和机器学习算法的不断优化,大模型已经成为了当今人工智能领域最热门的话题之一.在实际应用中,大模型可以帮助我们更好地完成诸如 ...

  8. border-box和CSS3 calc()解决盒模型加边框或边距后尺寸变大的问题

    border-box和CSS3 calc()解决盒模型加边框或边距后尺寸变大的问题 参考文章: (1)border-box和CSS3 calc()解决盒模型加边框或边距后尺寸变大的问题 (2)http ...

  9. 开发者的520!11位业界大咖齐聚,深度解读AI大模型落地“解法”

    明天就是"520"了,在这个特殊的日子里,面向开发者的AI告白盛会--WAVE SUMMIT 2022深度学习开发者峰会即将准点上线! 随着数据井喷.算法进步以及算力的突破,效果好 ...

最新文章

  1. 表格对决CSS--一场生死之战
  2. linux 内核 THIS_MODULE宏定义详解
  3. python入门之迭代器
  4. 技术 KPI 的量化
  5. .deploy 文件 php,关于php:Heroku deploy自动删除服务器文件?
  6. docker 导出堆栈信息.hprof_JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用...
  7. CommunityServer 的对象持久化
  8. centos安装rabbitmq_SpringCloud之RabbitMQ安装
  9. Visual Entity 使用(四)添加、删除属性
  10. 水电图纸——电气系统识图-3.4
  11. Navicat数据传输
  12. Intellig idea关闭自动更新
  13. 设计一个权限系统-RBAC
  14. Python基础学习笔记:匿名函数
  15. RGB和HSV颜色空间
  16. CSS如何实现内凹角效果
  17. SpringCloud之搭建PiggyMetrics项目
  18. HashSet集合保证元素唯一性原理分析
  19. Git使用教程:完全图解!
  20. springboot集成Lean Cloud 及时通讯

热门文章

  1. CodeFileBaseClass 属性
  2. VS2017动态链接库(.dll)的生成与使用
  3. CreateThread和_beginthreadex的区别
  4. C++基础知识友元friend、友元函数和友元类
  5. 这个结构体对齐输出有意思
  6. emailjava中怎么校验_Java使用注解实现参数统一校验功能
  7. 线性链表java实现_java实现线性单链表
  8. oschina mysql limit_Mysql中limit的用法
  9. MongoDB 数据库创建、删除、表(集合) 创建删除、数据的增、删、改、查
  10. Scala 入门1(变量、分支循环、函数)