精华内容
下载资源
问答
  • 开放域对话预训练模型 开放域对话预训练模型总结,主要包括 PLATO,DialoGPT,Meena,Blender,PLATO-2 进行训练数据、模型架构、预训练任务、模型解码、结果评价等方面的对比 相关资源 论文、官方博客新闻以及...

    开放域对话预训练模型总结,主要包括 PLATO,DialoGPT,Meena,Blender,PLATO-2

    进行训练数据、模型架构、预训练任务、模型解码、结果评价等方面的对比

    在这里插入图片描述

    相关资源

    论文、官方博客新闻以及GitHub代码

    Model Paper & Blog GitHub
    DialoGPT DIALOGPT : Large-Scale Generative Pre-training for Conversational Response Generation
    Microsoft Blog
    microsoft/DialoGPT
    yangjianxin1/GPT2-chitchat
    Meena Towards a Human-like Open-Domain Chatbot
    Google AI Blog
    google-research/meena
    Blender Recipes for building an open-domain chatbot
    ParlAI Docs
    facebookresearch/ParlAI
    PLATO PLATO: Pre-trained Dialogue Generation Model with Discrete Latent Variable
    Baidu AI
    PaddlePaddle/Research
    PLATO-2 PLATO-2: Towards Building an Open-Domain Chatbot via Curriculum Learning
    Baidu AI
    PaddlePaddle/Knover

    训练数据

    大规模类似对话数据预训练

    Model Dataset Size Dataset Source
    DialoGPT 147M samples(1.8B words) Reddit
    Meena 341GB text(40B words) Reddit
    Blender 1.5B samples(88.8B words) Reddit
    PLATO 8.3M samples Twitter/Reddit
    PLATO-2 684M(EN)/1.2B(ZH) samples Reddit/Twitter (Chinese unk)
    • sample 构造成 (context, response) 形式
    • 均使用 Byte-Level BPE tokenizations
    • PLATO-2 中文数据(来自 GitHub issue
      • 考虑到不同的来源上文谈话的内容风格和话题差异比较大,为了保证训练语料的多样性和覆盖面,PLATO-2训练使用的中文数据来源是很丰富的(并不局限在一个数据集上),包括多个公开数据集,脱敏的社交媒体数据,以及人工标注数据

    模型架构

    图片来自T5论文

    在这里插入图片描述

    Model Architecture Parameters
    BERT Transformer Encoder 110/340M (Chinese 110M)
    DialoGPT Language Model (GPT-2) 117/345/762M
    Meena Seq2Seq Transformer (ET) 2.6B
    Blender PolyEncoder + Seq2Seq Transformer 90M/2.7B/9.4B
    PLATO Prefix LM (UniLM) 110M (132M)
    PLATO-2 Prefix LM (UniLM) 310M/1.6B (Chinese 333M)
    • Retrieve and Refine Model
      • Blender 中使用检索优化模型,在生成之前组合检索步骤,包括 Dialogue Retrieval 和 Knowledge Retrieval
        • Dialogue retrieval,使用 PolyEncoder 检索回复,将检索回复拼接到输入之前
          • 直接对话检索回复拼接到对话历史后面效果不好,需要随机替换为gold response,强迫生成模型从检索结果中 copy 词或者词组
        • Knowledge retrieval,使用 Wizard Generative model
          • 分别利用当前对话 topic(对话 topic 会事先告知)和最后两轮对话,各自检索出 top-K 的文章
          • 把所有文章各自分句,然后把各自文章的 title 追加到每个句子最前面,获得很多候选句子
          • 再利用 poly-encoder 结构的模型对候选句子排序,最终使用 top-1 的句子作为检索结果
          • 同时还会训练一个单独的分类器来判断是否需要从知识库中检索知识。回复某些对话 context 可以不需要额外知识,这时候就不用追加检索结果
    • UniLM 可以在 BERT 基础上改变 Mask 矩阵实现(上文使用双向 Attention,回复使用单向 Attention)
      • 论文中经过各项任务的反复验证,UniLM 在同等规模参数量的情况下具有最佳的性价比
      • PLATO 直接使用 BERT预训练模型参数初始化(然后再使用对话数据训练)

    训练任务

    Response Generation 为主要训练任务

    Model Pre-training Obejctive Loss Function Cost
    DialoGPT Language modeling (+MMI) Cross-entropy Loss 16 V100 -
    Meena Response generation Cross-entropy Loss TPU v3 Pod 30 days
    Blender Ranking for retrieval (+MLM)
    Likelihood training for generation
    Unlikelihood training for generation
    Cross-entropy Loss MLE -
    PLATO Response generation
    Latent act recognition
    Response selection
    Negative log likelihood loss (NLL)
    Bag-Of-Words (BOW)
    Loss Binary Cross-entropy Loss
    8 V100 32G 2 weeks
    PLATO-2 Ibid.
    Response selection (+MLM)
    NLL/BOW+RCE/MLM 64 V100 3 weeks
    • DialoGPT

      • Language Modeling
        p(TS)=n=m+1Np(xnx1,,xn1) p(T|S) = \prod_{n=m+1}^N p (x_n | x_1, \cdots, x_{n-1})
    • Blender

      • Ranking for Retrieval,在检索中使用同一 batch 内其他回复作为反例

      • Likelihood Training for Generation

        • Given a dataset D={(x(i),y(i))}\mathcal{D} = \{(\mathbf{x}^{(i)}, \mathbf{y}^{(i)})\}, minimize

        LMLE(i)(pθ,x(i),y(i))=t=1y(i)logpθ(yt(i)x(i),y<t(i)) \mathcal{L}_{MLE}^{(i)} (p_{\theta}, \mathbf{x}^{(i)}, \mathbf{y}^{(i)}) = - \sum_{t=1}^{|y^{(i)}|} {\log p_{\theta}(y_t^{(i)} | \mathbf{x}^{(i)}, y_{<t}^{(i)})}

        • x(i)\mathbf{x}^{(i)} 是输入对话历史,y(i)\mathbf{y}^{(i)} 是对话回复
      • α\alpha-blending for retrieve and refine

        • 当添加检索结果后,MLE 的生成往往会忽视检索的结果
        • 训练阶段,随机将 α\alpha 比例的正确对话回复代替检索结果拼接(实现在检索和生成之间的平稳过渡)
      • Unlikelihood Training for Generation

        • 提升正确token概率同时,降低其他token 的概率(惩罚项);在选择负token时,选择容易组成常见n-gram的tokens;期望降低生成无意义回复的比例

        • Unlikelihood Loss 在每步 tt 会惩罚一部分 token,记为 Ct\mathcal{C}_t
          LUL(i)(pθ,C1:T,x,y)=t=1yycCtlog(1pθ(ycx,y<t)) \mathcal{L}_{UL}^{(i)}(p_{\theta}, \mathcal{C}_{1:T}, \mathbf{x}, \mathbf{y}) = - \sum_{t=1}^{|y|} \sum_{y_c \in \mathcal{C}_{t}} \log (1 - p_{\theta}(y_c | \mathbf{x}, y_{<t}))

        • 最终 Loss 为 MLE 和 UL 混合,混合比例为超参数
          LULE(i)=LMLE(i)+αLUL(i) \mathcal{L}_{ULE}^{(i)} = \mathcal{L}_{MLE}^{(i)} + \alpha \mathcal{L}_{UL}^{(i)}

    • PLATO

      • Response SelectionLatent act Recognition 同时进行,使用双向注意力编码;负例从数据集中随机选择
        LRS=logp(lr=1c,r)logp(lr_=0c,r_)p(lr=1c,r)=sigmoid(W3h[M]+b3) \mathcal{L}_{RS} = - \log p(l_r = 1 | c, r) - \log p(l_{r^\_}=0|c, r^\_) \\ p(l_r=1|c,r) = sigmoid(W_3 h_{[M]} + b_3)

        • 其中 h[M]RDh_{[M] \in \mathbb{R}^D} 是特殊 mask 标记的最后隐层状态表示(离散隐变量识别的实现中使用 Gumbel-Softmax,避免采样后梯度消失)
      • response generation 使用单向注意力解码,计算 NLL lossBOW loss

        • NLL loss
          LNLL=Ezp(zc,r)logp(rc,z)=Ezp(zc,r)t=1Tlogp(rtc,z,r<t) \mathcal{L}_{NLL} = - \mathbb{E}_{z \sim p(\mathbf{z}|c, r)} \log p(r| c, z) \\ = - \mathbb{E}_{z \sim p(\mathbf{z}|c, r)} \sum_{t=1}^T \log p(r_t| c, z, r_{<t}) \\

          • 其中 zz(c,r)(c,r) 的隐变量取值,通过概率分布p(zc,r)p(\mathbf{z}|c,r)获得

          p(zc,r)=softmax(W1h[M]+b1)RK p(\mathbf{z}|c,r) = softmax(W_1 h_{[M]} + b_1) \in \mathbb{R}^K

        • BOW loss(和NLL相比,BOW打乱了语序,促使离散隐变量学习目标回复的局部信息)
          LBOW=Ezp(zc,r)t=1Tlogp(rtc,z)=Ezp(zc,r)t=1TlogefrtvVefv \mathcal{L}_{BOW} = - \mathbb{E}_{z \sim p(\mathbf{z}|c,r)} \sum_{t=1}^T \log p(r_t|c,z) \\ = - \mathbb{E}_{z \sim p(\mathbf{z}|c,r)} \sum_{t=1}^T \log \frac{e^{f_{r_t}}}{\sum_{v \in V} e^{f_v}}

          • 其中 VV是整个词表,ff 是以非自回归的方式预测目标回复中的单词(hzh_z是离散隐变量的隐层表示)
            f=softmax(W2hz+b2)RV f = softmax(W_2 h_z + b_2) \in \mathbb{R}^{|V|}
      • 最终优化目标
        L=LNLL+LBOW+LRS \mathcal{L}= \mathcal{L}_{NLL} + \mathcal{L}_{BOW} + \mathcal{L}_{RS}

    • PLATO-2

      • 采取了课程学习的方法,逐步优化参数,加快训练效率
      • PLATO-2 采用了 GPT-2 的前置正则化层的方式,以更好适应大规模训练的需求
      • 训练步骤
        • **第一步,PLATO-2 先训练了不含隐变量的模型。**该模型进行的是简化的“一对一”建模,容易生成安全回复
        • **第二步,在前一步模型基础上,添加上隐变量,然后同时训练 Generation + Recognition 和 Response Selection 两个不同模型。**其中,Response Selection 模型在合适度预测的基础上,还添加了 Masked Language Model 作为辅助任务,以强化模型对语义的理解。

    模型解码

    几乎都在解码中尝试各种方式来提高回复生成的多样性

    各种解码方法参考 huggingface blog

    Model Method
    DialoGPT MMITop-K sampling
    Meena Sample-and-rank,Top-K-sampling(Sampling is better than Beam Search)
    Blender Beam Search(Length Controlling + Subsequence blocking)
    PLATO Beam Search(Response Selection)
    PLATO-2 Beam Search(Response Coherence Estimation)
    • Maximum mutual information(MMI)

      • 使用预训练的后向模型来预测从给定回复 target 到对话历史 source 的生成概率 i.e., P(Sourcetarget)P(Source|target)
      • MMI 倾向于惩罚枯燥乏味的回复,频繁和重复的回复会和许多上文关联,因此对于某些特殊的回复会返回较低的分数
      • 论文中使用 345M 的 GPT-2 medium model 作为 Backward model
    • Sample-and-rank

      强大的模型生成回复的 ppl 足够小,可以牺牲 ppl 来生成多样性回复

      1. sample N independent candidate responses using plain random sampling with temperature T
      2. select the candidate response with the highest probability to use as the final output(Hinton et al., 2015)

      给定当前所有单词的概率,T越大,概率分布越平缓,概率差距缩小,容易随机取到其他的单词

      pi=exp(zi/T)jexp(zi/T) p_i = \frac{exp(z_i/T)}{\sum_j exp(z_i/T)}

    • Beam Search(Length Controlling,Subsequence Blocking)

      Beam Search改进方法较多,如果模型本身不够好,起到的作用很小(与 sampling 效果差不多)

      • 控制生成回复的最小长度
        • Minimum Length,设置最小长度阈值(20效果比不设置好)
        • Predictive Length,额外训练回复长度分类器(<10/20/30,>30, poly-encoder),增大模型复杂度
      • 屏蔽重复的子序列(Subsequence Blocking),不允许产生当前句子和前面对话(context)中已经存在的 3-grams(不显著)

    效果评估

    Fine-tune

    进行效果测试的下游任务

    Model Dataset
    DialoGPT DSTC-7 Dialogue Generation Challenge
    Reddit
    Meena -
    Blender ConvAI2
    Wizard of Wikipedia(WoW)
    Empathetic Dialogues
    Blended SKill Talk
    PLATO Persona-Chat
    Daily Dialog
    DSTC7-AVSD
    PLATO-2 -

    评价方式

    Model Static Evaluation Dynamic Evaluation 3-Level Pairwise Evaluation Desc
    DialoGPT ✔︎ ✔︎ ✔︎ fine-tuning
    Meena ✔︎ ✔︎ ✔︎ human-bot chat SSA
    PPL
    Blender ✔︎ ✔︎ ✔︎ fine-tuning,self-chat
    PLATO ✔︎ ✔︎ fine-tuning
    PLATO-2 ✔︎ ✔︎ ✔︎ ✔︎ self-chat,actual-eval
    • Static Evaluation
      • 输入预设的对话历史,要求模型预测回复(fine-tune);自动评价+人工评价
    • Dynamic Evaluation
      • 和模型进行动态对话交互,根据机器人的每轮回复进行评分(一般打分区间为 {1,2,3})
      • (PLATO-2英文采用 Self-Chat方式,给定启动句,人工评估多轮对话效果;中文采用 Human-Bot Chat)
    • Pairwise Evaluation
      • Human-Bot Chat 耗费人力、物力,采用机器人之间聊天的方式
      • 提供2组(machine-human/machine-machine)对话日志,(针对每组中的特定机器人)选择更有吸引力和接近人类的对话(ACTUAL-Eval,Self-Chat)
    • Meena 中提出 使用新的人工评价指标SSA(sensibleness and specificity avarage);包括合理性(常识正确性、逻辑连贯性和一致性)和特定性(针对对话历史);论文中证明 PPL 和 SSA 存在高度负相关性

    未来改进

    Model Model
    DialoGPT -
    Meena SSA指标还可以加入其他的人类对话属性
    包括幽默,同理心,深入的推理,问题解答和知识讨论技巧
    Blender 倾向于使用高频词
    倾向于生成重复信息(copy)
    内容冲突和遗忘
    无法深度对话(外部知识的使用)
    无法深度理解
    更长的对话仍然存在问题(低成本评测?)
    PLATO -
    PLATO-2 探索强化学习应用
    展开全文
  • TOD-BERT:任务导向型对话预训练自然语言理解模型 摘要:普通文本和任务型对话之间的语言模式的潜在差异使得现在的与训练语言模型在实际使用中作用不大。在这项工作中,我们统一了九个人与人之间的多回合任务的...

    因为有一个NLP课程的作业需要找与研究领域相关的比较近的一篇论文进行翻译,所以就找到了TOD-BERT这篇论文~
    目前也在看作者们给出的代码,如果可以会自己去训练一下试试看~~

    放在前面:

    • 学到的点:主要就是TOD-BERT模型,但是我对于这种修改方法的优点还并不是特别的了解,可能要等跑通代码之后才能更好的理解吧。

    TOD-BERT:任务导向型对话的预训练自然语言理解模型

    摘要:普通文本和任务型对话之间的语言模式的潜在差异使得现在的与训练语言模型在实际使用中作用不大。在这项工作中,我们统一了九个人与人之间的多回合任务的对话数据集进行语言建模。为了在预训练期间更好的模拟对话行为,我们将用户和对话系统的token合并放入带mask的语言模型中。我们提出了一个对比目标函数去模拟响应选择任务。我们的预训练任务导向型对话的BERT模型(TOD-BERT)在四个下游的面向任务的对话应用中(包含意图识别,对话状态追踪,对话行为预测和响应选择)都优于BERT基线。我们还发现,TOD-BERT具有较强的few-shot能力,可以缓解面向任务对话的数据稀缺的问题。

    一、介绍

    具有自注意力编码结构的预训练模型已经被广泛的应用到许多NLP领域中。这些模型是基于大规模的通用文本语料库(如英语维基百科或书籍)进行自监督的。通过进一步微调这些模型,各种下游任务,特别是自然语言理解的突破不断被报道。
    然而,以往的研究表明,直接对会话语料库进行微调在表现上存在一些不足。一个可能的原因是人类对话和写作文本之间语言模式的内在差异,导致数据分布的巨大差异。因此,最近研究了使用来自社交媒体(如Twitter和Reddit)的聊天语料库进行预训练的对话语言模型,特别是在对话响应生成和检索方面。尽管这些开放域的对话很多样,也很容易获得,但是他们通常很短,有很多噪音,没有具体的聊天目标。
    另一方面,以任务为导向的对话有着明确的目标(比如餐馆预定和机票预定)和许多的会话互动。但是每个数据集通常都很小并且很分散,因为获取和标记这些数据是非常费时的。此外,面向任务的对话有明确的用户和系统行为,其中用户有自己的目标,系统有自己的任务和数据库的信息,这使得语言理解成分和对话策略学习比那些聊天场景更为重要。
    本文旨在证明一个假说:对任务导向型的下游任务,使用任务型语料库的自监督语言模型预训练可以比现有的预训练模型学习到更好的表征。我们强调我们最关心的并不是我们的预训练模型是否在每一个下游任务中都能够达到最先进的结果,因为目前最好的模型大多是建立在预训练模型的基础上的,我们的模型可以很容易的替换他们。在我们的实验中进行微调时,我们避免在预训练架构的基础上添加太多额外的组件。
    我们收集并整合了9个面向人和多回合的任务型对话的语料库来训练一个面向任务的对话BERT(TOD-BERT)。总体而言,有大约10万个对话,140万个话语,超过60个不同的领域。与BERT一样,TOD-BERT由带mask的语言模型构成,并且使用一个深度双向的Transformer的Encoder作为其模型结构。与BERT不同的是,TOD-BERT为用户和系统引入了两个特殊的token来模拟相应的对话行为。在预训练阶段结合响应选择任务的对比目标函数来捕捉响应的相似性。我们选择BERT是因为它是目前NLP研究领域中应用最广泛的模型。并且我们的统一数据集可以很容易的应用在任何现有的语言模型的预训练中。
    我们在面向任务的对话系统的四个核心下游任务中测试了TOD-BERT,包括意图识别、对话状态跟踪、对话行为预测和响应选择。我们观察到:TOD-BERT在所有我们选择的下游任务上都优于BERT和GPT-2、DialoGPT等强基线,这进一步证实了它对提高对话语言理解的有效性。我们发现响应对比学习是有用的,但是目前在对话预训练的研究中却没有得到很好的研究。更重要的是,TOD-BERT在每项任务上都比BERT有更强的few-shot的能力,这表明它可以减少对昂贵的人工标注数据的需要。TOD-BERT能够很容易地利用和适应新的面向任务的对话数据集。我们的源代码和数据处理已经发布了,以促进未来对任务型对话在预训练和微调上的研究。

    二、相关工作

    一般的预训练语言模型,是在例如维基百科和图书语料库等大量文本上训练的,大致可以被分成两类:单向注意机制和双向注意机制。GPT和GPT-2是使用Transformer解码器的单向语言模型的代表,其目标是最大化从左到右的生成可能性。这些模型通常被应用到自然语言生成任务中。另一方面,BERT, RoBERTa和他们的方差是使用双向token预测的Transformer编码器预训练的。这些模型通常用来评估分类任务,例如GLUE或者基于广度的问答任务。
    对话预训练模型一般是在Reddit或Twitter等开放领域的数据集上进行训练的,用于对话响应的生成。Transfertransfo用GPT-2在ConvAL-2对话比赛中取得了良好的成绩。DialoGPT是GPT-2的一个扩展,它是在Reddit数据上预训练的,用于生成开放域的响应。ConveRT预训练了一个双向Transformer解码器,用于大规模Reddit(输入,响应)响应选择任务。PLATP使用了Twitter和Reddit的数据去预训练了一个带有离散潜变量的对话生成模型。所有这些都是为处理开放域聊天机器人的响应生成任务而设计的。
    另一方面,针对任务型对话的预训练却鲜有相关的研究。. Budzianowski 等人在2019年的论文中第一次将GPT-2模型应用到响应生成任务中,以系统信念(system belief),数据库结果和最后一轮对话作为输入,预测下一个来自系统的响应。他们只用了一个数据集去训练他们的模型,因为很少有公共数据集有可用的数据库信息。Henderson等人预训练了一个面向任务对话的响应选择模型。他们首先对Reddit语料库进行预训练,然后对目标对话域进行微调,但是他们的训练和微调的代码并未公布。Peng等人聚焦于自然语言生成任务,该任务假定给定对话行为和槽填充(slot-tagging)结果来生成自然语言的响应。利用GPT-2模型对一组标注的自然语言语料库进行预训练,可以提高条件生成的质量。

    三、方法

    本章节主要讨论了面向任务的预训练中使用的每一个数据集以及我们如何处理数据。然后介绍了所选择的预训练的基础模型和目标函数。

    3.1 数据集

    我们收集了九个不同的任务型数据集,它们是英语的,人和人产生的多回合对话。总计有100707个对话,包含超过60个领域的1388152个话语。数据集统计如表1所示。

    MetaLWOZ(Meta-Learning Wizard-of-Oz):元学习的绿野仙踪数据集是一个旨在帮助开发能够预测未知领域中用户响应的模型的数据集。这个大型数据集由众包37884个面向任务的对话创建,涵盖47个领域的227个子任务。
    Schema:模式引导对话有22825个对话,它为一些任务提供了一个有挑战性的测试平台,特别是对话状态追踪。每一个模式就是一组追踪槽,每个域都可能有多个可能的模式。这使得单个对话系统能够支持许多服务,并促进了新服务的简单集成,而不需要太多的培训数据。Schema数据集被用作DSTC8对话比赛的对话状态跟踪任务。
    Taskmaster:该数据集包括13215个对话,包含六个域,其中有5507个口语对话和7708个书面对话,由两个不同的过程创建。其中一种是两人绿野仙踪(Wizard of Oz)方法,一个人像机器人一样行动,另一种是自对话的方法,即众包工人自己编写整个对话。
    MWOZ:多领域绿野仙踪数据集包含7个领域上的10420个对话,并且在单个对话中包含多个域。它详细的描述了数据收集过程,用户目标,系统行为和对话状态标签。与现有的大多数语料库不同,它还提供了完整的数据库信息。
    MSR-E2E:微软的端到端对话挑战赛在电影票预定、餐厅预定和出租车预定三个领域共有10087个对话。它还包括一个实验平台,每个领域内都内置了模拟器。
    SMD:斯坦福的多域对话是一个车内个人助理的数据集,包含3301个对话和三个域:日程安排,天气信息检索和兴趣点导航。它被设计成与知识库的平滑接口,其中知识片段作为简化的数据库信息附在每个对话中。
    Frames:该数据集包含1369个人与人对话,每个对话平均14.6轮,其中用户在预定行程时受到一些限制,助手在数据库中搜索合适的行程。与其他的数据库不同,它有标签来跟踪不同的语义框架,这是用户在每个对话中的决策行为。
    WOZ和CamRest676:这两个语料库用了相同的数据收集过程和来自DSTC2的相同本体。他们是第一批使用“绿野仙踪”风格的对话数据集,用文本输入代替语音输入,提高了模型的语义理解能力,而不是其对自动语音识别错误的鲁棒性。

    3.2 TOD-BERT

    我们基于BERT结构来训练我们的TOD-BERT,使用了两个损失函数:MLM损失和响应对比损失(RCL)。请注意,我们使用的数据集可以用来预训练任何现有的语言模型体系结构,这里我们选择BERT是因为它是NLP研究中使用最广泛的模型。我们使用了BERT的基础模型,它是一个Transformer自注意编码器,具有12层和12个注意头,隐藏层大小为768。
    为了捕捉说话人的信息和对话中潜在的交互行为,我们在字节对嵌入中增加了两个特殊的token[USR]和[SYS]。我们为每个用户的话语和系统的响应都加上特殊的token前缀,并将同一对话中的所有话语连接成一个平面序列,如图1所示。例如,对一个对话D={S_1,U_1,…,S_n,U_n },其中n是对话轮次,每个S_i或U_i包含一个单词序列,即预训练的输入。模型采用标准的位置嵌入和分段嵌入进行处理,即将输入处理为"[SYS] S_1 [USR] U_1…"
    **带mask的语言模型(Masked language modeling)**是一种常见的类BERT结构的预训练策略,它在输入序列中选择一个随机的token,然后用特殊的token[MASK]去替换它。MLM的损失函数是去预测被掩盖掉的token的交叉熵损失。在最初的实现中,随机的掩盖和替换在开始时执行一次,并在训练中一直保存。在这里我们在批处理训练时动态的进行token的mask。TOD-BERT由一个好的初始参数集BERT进行初始化,然后在这些面向任务的语料库上进一步的预训练。MLM损失函数为:
    MLM loss

    其中,M为被mask的token的总数,P(x_m )是tokenx_m在词汇表上预测的概率。
    **响应对比损失(Response contrastive loss)**也能被用于对话语言模型,因为它不需要任何额外的人类注释。使用RCL进行预训练有以下几个优点:1)是我们能够学到[CLS]这个token的更好的表示,这对于所有下游任务都是必不可少的。2)是我们鼓励模型去捕获潜在的对话顺序、结构信息和响应的相似性。
    与BERT预训练中最初的下一句预测(NSP)目标不同(BERT将两段A和B连接起来,以预测B是否是A的下一句),我们采用双编码器方法,模拟了多个负样本。我们首先收集一批对话{D_1,…,D_b }并在随机选择的回合t分割每个对话。例如,D_1将被分割成两部分,一部分是上下文11
    ,另一部分是是响应S_(t+1)^1。我们用TOD-BERT分别编码所有上下文和它们对应的回应。
    然后,我们通过从b对话中获得输出[CLS]的表示得到了一个上下文矩阵C和一个响应矩阵R。我们将同一批次中的其他反应视为随机选择的负样本。RCL目标函数为:
    RCL loss

    将批处理大小增加到一定程度,可以在下游任务上获得更好的性能,特别是在响应选择方面。Softmax函数规范化每行的向量。在我们的设置里,增加批次大小也意味着改变对比学习中的正负例比。批次大小是一个能够被硬件限制的超参数。我们在预训练阶段也尝试了不同的负抽样策略,如局部抽样,但与随机抽样相比没有显著变化。
    **整体(Overall)**预训练的损失函数为L_mlm和L_rcl的加权和,在我们的实验中,我们简单的将它们相加。我们在没有热身期的情况下逐渐降低学习率。我们使用AdamW优化器训练TOD-BERT,在所有层和注意权重上的drop率为0.1。使用GELU激活函数。模型用一个延迟开发集的困惑分数实现早停策略(early-stopped),小批次包含32个序列,每个序列最大长度为512个token。实验在两个NVIDIA Tesla V100 GPU上进行。
    TOD-BERT

    四、下游任务

    在这篇论文中,我们最关心的是TOD-BERT这个使用聚合的任务型对话语料库的预训练语言模型是否显示出了它相比于BERT的优势。因此,在对每一个下游任务进行微调时,我们避免在它的结构之上增加太多的组件。此外,我们使用同样的结构和相似数量的参数做一个公平的比较。在微调时,所有的模型都用同样的超参数进行梯度修剪(gradient clipping)到1.0的方法更新。我们选了四个关键的任务导向型的下游任务去评估,分别时:意图识别,对话状态追踪,对话行为预测和相应选择。所有的这些下游任务都是模块化任务导向系统的核心组件。
    意图识别任务是一个多分类问题,我们输入一个句子U,然后模型在超过i个可能的意图中预测一个单一的意图。
    ytsb

    其中,F是预训练语言模型,我们用它的[CLS]嵌入作为输出的表示,W_1∈R^(I×d_B )是一个可训练的线性映射。模型在预测的分布P_int和真实意图标签之间使用交叉熵损失来训练。
    对话状态追踪可以被看作一个使用预定义主体的多分类问题。与意图不同,我们使用对话的历史X(一系列的话语)作为输入,然后模型预测每一个对话回合中每一个(域,槽)对的槽值。每一个对应的值v_i^j(表示第j个(域,槽)对的第i个值)被传递到预训练的模型中,并在训练期间被固定表示。
    111

    其中Sim是余弦相似函数,Sj∈R|v^j | 是第j个(域,槽)对在其可能值上的概率分布。G_j是第j个槽的槽投影层,|G|投影层的数量和(域,槽)对的数量相同。该模型采用将所有对的交叉熵损失加和的方法进行训练。
    对话行为预测是一个多标签分类问题,因为系统的响应可能会包含多种对话行为,例如同时包含请求和通知。模型将对话历史作为输入并且对每种可能的对话行为预测一个二分类的结果。
    111

    其中W_2∈R^(d_B×N)是一个可训练的线性映射,N是可能的对话行为的数量,在经过一个sigmoid层之后,A中的每个值都在0到1之间。模型用二分类交叉熵损失来进行训练,当A_i>0.5时,第i个对话行为被认为是触发的对话行为。
    响应选择是一个排序问题,它的目的是从候选池中检索最相关的系统响应。我们使用双编码器策略并计算源X和目标Y之间的相似性分数,
    122

    其中,Y_i是第i个候选响应,r_i是它的余弦相似度分数。源X可以被截断,在我们的实验中,我们将上下文长度限制为最多256个token。我们从语料库中随机的抽取几个系统响应当作负例。虽然它可能不是一个真的负例,但是这样去训练和评估它的结果是很常见的。

    五、评价数据集

    我们选取了几个数据集OOS、DSTC2、GSIM和MWOZ进行下游评估。前三个数据集不包括在进行预训练的面向任务的数据集中。对于MWOZ来说,公平地说,我们不包括它在预训练阶段的测试集对话。下面讨论了每个评估数据集的详细信息:
    OOS:超意图数据集是最大的注释意图数据集之一,包括分别用于训练、验证和测试集的15100/3100/5500个样本。它涵盖了10个领域的151个意图类,包括150个范围内意图和一个范围外意图。超范围意图是指不属于任何预定义意图的用户话语。每个意图有100个训练样本。
    DSTC2:DSTC2是一个面向人机任务的数据集,其中可能包含特定的系统响应噪声。它有1612/506/1117个对话,分别用于训练、验证和测试集。我们遵循Paul等人(2019)将原始的对话行为标签映射为普遍对话行为,这导致了19种不同的系统对话行为。
    GSIM:GSIM是一个面向任务的人工重写机器语料库,包括1500/469/1039个分别用于训练、验证和测试集的对话。我们将它的两个领域,电影和餐厅领域,合并成一个单一的语料库。它是由机器与机器对话(M2M)方法收集的,这是一种功能驱动的过程,结合了对话自演步骤和众包步骤。我们将其对话行为标签映射为普遍对话行为,从而产生13种不同的系统对话行为。
    MWOZ:MWOZ是面向任务的对话最常用的基准,尤其是对话状态跟踪。它有8420/1000/1000对话,分别用于训练、验证和测试集。在七个不同的域中,总共有30个(域、槽)对需要在测试集中跟踪。我们使用它的修订版MWOZ2.1,它有相同的对话记录,但是有更清晰的状态标签注释。

    六、结果

    对每一个下游任务,我们首先用全部的数据集进行实验,然后我们模拟few-shot设置去展示我们TOD-BERT的强度。为了减少样本的方差,我们至少对每一个few-shot实验用三次不同的随机种子去运行,并报告这些有限数据场景的平均值和标准差。我们研究了两个版本的TOD-BERT,一个是TOD-BERT-mlm,在预训练时它只用到了MLM损失;另一个是TOD-BERT-jnt,它用MLM损失和RCL损失进行联合训练。我们将TOD-BERT和BERT以及其余的基线(包括两个其它的强大的预训练模型,GPT2和DialoGPT)进行比较。对于一个基于GPT的模型,我们使用隐藏状态的平均池作为它的输出表示,我们发现这样比只用最后一个token要更好。

    6.1 线性探头

    在对每个预先训练好的模型进行微调之前,我们首先通过探测它们的输出表示来研究它们的特征提取能力。提出了探测方法来确定所学习的嵌入在本质上携带了什么信息。我们在一个固定的预先训练的语言模型上使用一个单层感知器来探测输出表示,并且只针对具有相同超参数的下游任务微调该层。
    表3显示了MWOZ上的域分类、OOS上的意图识别和MWOZ上的对话行为预测的探测结果。TOD-BERT-jnt在这个设置中实现了最高的性能,这表明它的表示包含了最有用的信息。
    b3

    6.2 意图识别

    在一个最大的意图识别数据集中,TOD-BERT优于BERT和其他强基线,如表2所示。我们评估所有数据的准确性,分别评估了域内意图和域外意图。请注意,有两种方法可以预测域外的意图,一种是将其视为附加类,另一种是设置预测置信度的阈值。这里我们报告第一次设置的结果。TOD-BERT-jnt达到了最高的范围内和范围外的准确率。另外,我们在训练集中每个意图的类别中都随机抽取一个和十个话语,进行一次和十次实验。与一次实验的BERT相比,TOD-BERT-jnt在所有意图的正确率增加了13.2%,在领域准确率增加了16.3%。
    B2

    6.3 对话状态追踪

    在对话状态跟踪任务中,常用两种评价指标:联合目标准确度和槽准确度。联合目标准确度将预测的对话状态与每个对话回合的真是状态进行比较。真实状态包括所有可能(域,槽)对的槽值。当且仅当所有预测值与其基本真值完全匹配时,输出才被认为是正确的预测。另一方面,槽准确度将每个(域,槽,值)三元组分别与其基本真值标签进行比较。
    在表5中,我们比较了MWOZ2.1数据集上的BERT和TOD-BERT-jnt,发现后者的联合目标精度提高了2.4%。由于Budzianowski等人提供的原始本体不完整(一些标记值未包含在本体中),我们创建了一个包含所有可能注释值的新本体。我们还列出了几个著名的对话状态跟踪器作为参考,包括DSTReader、HyST、TRADE和ZSDST。我们还报告了使用1%、5%、10%和25%数据的少量few-shot实验。注意,1%的数据有大约84个对话。TOD-BERT在所有情境下的表现都优于BERT,这进一步显示了任务型对话预训练中的优势。
    B5

    6.4 对话行为预测

    我们在三个不同的数据集上进行了实验,并报告了对话行为预测任务(一个多标签分类问题)的micro-F1和macro-F1分数。对于MWOZ数据集,我们从原始系统标签中删除域信息。例如,“出租车通知”将简化为“通知”。这一进程将可能的对话行为从31个减少到13个(对行为进行合并)。对于DSTC2和GSIM语料库,我们遵循Paul等人的方法,应用通用对话行为映射,将原始对话行为标签映射为通用对话行为格式,分别在DSTC2和GSIM中产生19个和13个系统对话行为。我们运行另外两个基线,MLP和RNN,以进一步显示基于BERT的模型的优势。MLP模型简单地利用包中的单词进行对话行为预测,RNN模型是一个双向GRU网络。
    在表4中,我们可以观察到,在全数据场景中,无论是哪种数据集或哪种评估指标,TOD-BERT始终比BERT和其他基线工作得更好。在few-shot实验中,TOD-BERT-mlm在1%数据的情况下,在MWOZ语料库上的micro-F1和macro-F1分别比BERT好3.5%和6.6%。我们还发现,10%的训练数据可以获得接近全数据训练的良好性能。

    B4

    6.5 响应选择

    为了评估任务型对话中的响应选择,我们遵循k-to-100的准确性,这正成为研究界的标准。k-of-100度量是使用100个示例的随机批计算的,因此来自同一批中的其他示例的响应可以用作随机负例候选。这使我们能够高效地计算跨多个示例的度量。虽然不能保证随机负例确实是“真”负例,但是1/100的度量仍然提供了一个有用的评估信号。在推断过程中,我们运行五个不同的随机种子来抽样批次并报告平均结果。
    在表6中,我们对三个数据集(MWOZ、DSTC2和GSIM)进行了响应选择实验。TOD-BERT-jnt在MWOZ上的1-to-100准确率为65.8%,3-to-100准确率为87.0%,分别超过BERT18.3%和11.5%。在DSTC2和GSIM数据集中也一致地观察到类似的结果,并且TOD-BERT-jnt的优势在few-shot场景中更为明显。我们不报告TOD-BERT-jnt在MWOZ数据集上的few-shot设置,是因为在预训练的响应对比学习阶段使用了完整的MWOZ数据集,这和其它的模型去比较是不公平的。响应选择结果对训练批量很敏感,因为批量越大,预测越困难。在我们的实验中,我们将所有模型的批量大小设置为25。
    B6

    七、可视化

    在图2中,我们给定来自MWOZ测试集的相同输入,给出了可视化的BERT、TOD-BERT-mlm和TOD-BERT-jnt的嵌入。每个样本点都是一个系统响应表示,通过一个预训练的模型,利用t分布随机邻域嵌入(tSNE)进行降维,将其高维特征降为一个二维点。因为我们知道每个话语的真实领域和对话行为标签,所以我们使用不同的颜色来表示不同的领域和对话行为。可以观察到,TOD-BERT-jnt比TOD-BERT-mlm有更清晰的群体边界,并且它们两个都比BERT更好。
    为了定量分析结果,我们在BERT和TOD-BERT的输出嵌入的基础上运行了Kmeans(一种常见的无监督聚类算法)。我们把K的K均值设为10和20。在聚类之后,我们可以将MWOZ测试集中的每个语句分配给一个预测类。然后计算聚类结果与每个话语的实际域标签之间的归一化互信息。我们观察到:TOD-BERT的NMI得分始终高于BERT。对于K=10,TOD-BERT的NMI得分为0.143,BERT只有0.094。当K=20时,TOD-BERT的NMI得分为0.213,而BERT的NMI得分为0.109。
    T2

    八、结论

    我们提出了一种任务导向对话BERT模型(TOD-BERT)训练方法,该方法训练了9个跨60多个领域的人与人之间多轮任务对话的数据集。TOD-BERT在四个对话下游任务,包括意图识别、对话状态跟踪、对话行为预测和响应选择上都优于BERT。当只有有限的标记数据可用时,它在少量的few-shot实验中也有明显的优势。TOD-BERT易于部署,并且将是开源的,允许NLP研究社区应用或微调任何面向任务的会话问题。

    展开全文
  • 点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入!语言模型是机器理解人类语言的途径,而预训练的理念是将训练得到的模型参数对模型初始化后,再不断进行训练。预训练语言模型在对话生成领域...

    点击蓝字

    关注我们

    AI TIME欢迎每一位AI爱好者的加入!

    语言模型是机器理解人类语言的途径,而预训练的理念是将训练得到的模型参数对模型初始化后,再不断进行训练。预训练语言模型在对话生成领域取得一定的成功,然而现有方法也存在一定缺陷,将多轮对话的上下文视为一段较长的单词序列进行表示学习,一方面难以准确获取句子层级之间的连贯关系,另一方面效率也比较低。

    针对这个问题,本期介绍了一种新型会话响应生成模型,AI TIME特邀请论文 DialogBERT: Discourse-Aware Response Generation via Learning to Recover and Rank Utterances 的作者——上海交通大学副教授顾小东就其研究内容做报告分享。

    欢迎大家参与交流讨论,可以在文末点击阅读原文将疑问填在问卷中,周三直播时讲者会予以解答。

    3月3日晚7:30-9:00

    AI TIME特别邀请了上海交通大学副教授,博士生导师顾小东跟大家共同开启AAAI 专场一!

    哔哩哔哩直播通道

    扫码关注AITIME哔哩哔哩官方账号

    观看直播

    链接:https://live.bilibili.com/21813994

    ★ 邀请嘉宾 ★

    顾小东上海交通大学副教授,博士生导师,研究方向为程序搜索、对话生成、语言模型等。2017年博士毕业于香港科技大学,师从Sunghun Kim教授。2015-2016年间作为实习生在微软亚研院从事程序自动生成方面的研究。以第一作者在ICLR、ICSE、FSE、AAAI、IJCAI等人工智能和软件工程领域顶级会议发表论文数篇,并担任审稿人。

    报告题目:

    基于学习排序的对话模型预训练策略

    摘要:

    预训练语言模型在对话生成领域取得一定的成功,然而现有的方法通常将多轮对话上下文视为一段较长的单词序列,采用字符级的自注意机制进行表示学习。该策略难以准确获取句子层级的连贯关系,并且在时间上很低效。本文提出一种针对多轮对话生成的预训练模型DialogBERT,采用层次化BERT构建句子级的连贯关系,并提出两种预训练方法:掩藏句编码回归和分布式句子顺序预测。在微博、DailyDialog等长短对话数据集上的实验结果标明DialogBERT相比现有基于预训练的对话模型如BART, DialoGPT等可以生成更连贯、细致的应答。

    ★ Reference ★

    论文标题:

    DialogBERT: Discourse-Aware Response Generation via Learning to Recover and Rank Utterances

    论文链接:

    https://arxiv.org/abs/2012.01775

    直播结束后我们会邀请讲者在微信群中与大家答疑交流,请添加“AI TIME小助手(微信号:AITIME_HY)”,回复“aaai”,将拉您进“AAAI 2021交流群”!

    AI TIME微信小助手

    主         办:AI TIME 、AMiner

    合作伙伴:谱·AI、中国工程院知领直播、学堂在线、CSDN、学术头条、biendata、大数据文摘、数据派、 Ever链动、机器学习算法与自然语言处理

    AMiner是学术搜索和社会网络挖掘研究的重要数据和实验平台,由清华大学计算机系研发,拥有我国完全自主知识产权。平台包含了超过2.3亿学术论文/专利和1.36亿学者的科技图谱,提供学者评价、专家发现、智能指派、学术地图等科技情报专业化服务。系统2006年上线,吸引了全球220个国家/地区1000多万独立IP访问,数据下载量230万次,年度访问量超过1100万。        

    1)AMiner平台:https://www.aminer.cn

    2)会议专题页面:https://www.aminer.cn/conf/emnlp2020

    AI TIME欢迎AI领域学者投稿,期待大家剖析学科历史发展和前沿技术。针对热门话题,我们将邀请专家一起论道。同时,我们也长期招募优质的撰稿人,顶级的平台需要顶级的你,

    请将简历等信息发至yun.he@aminer.cn!

    微信联系:AITIME_HY

    AI TIME是清华大学计算机系一群关注人工智能发展,并有思想情怀的青年学者们创办的圈子,旨在发扬科学思辨精神,邀请各界人士对人工智能理论、算法、场景、应用的本质问题进行探索,加强思想碰撞,打造一个知识分享的聚集地。

    更多资讯请扫码关注

     

    我知道你在看

    点击 阅读原文 写下你的问题

    展开全文
  • 预训练模型的应用背景1.1 多任务学习与迁移学习1.2 自监督学习2. 快速使用PaddleHub2.1 通过Python代码调用方式 使用PaddleHub2.1.1 CV任务原图展示人像扣图人体部位分割人脸检测关键点检测2.1....


    十行代码能干什么? 相信多数人的答案是可以写个“Hello world”,或者做个简易计算器,本章将告诉你另一个答案,还可以实现人工智能算法应用。基于PaddleHub,可以轻松使用十行代码完成所有主流的人工智能算法应用,比如目标检测、人脸识别、语义分割等任务。

    PaddleHub是飞桨预训练模型应用工具,集成了最优秀的算法模型,旨在帮助开发者使用最简单的代码快速完成复杂的深度学习任务,另外,PaddleHub提供了方便的Fine-tune API,开发者可以使用高质量的预训练模型结合Fine-tune API快速完成模型迁移到部署的全流程工作。

    图1是2020年疫情期间,PaddleHub提供的十行代码即可完成根据肺部影像诊断病情的任务,以及检测人像是否佩戴口罩的任务。


    图1:PaddleHub产业应用

    运行如下代码,快速体验一下

    1. 安装PaddleHub并升级到最新版本。

      # 下载安装paddlehub到最新版本,仅第一次运行项目时执行此命令
      !pip install paddlehub==1.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple #指定版本安装PaddleHub,使用清华源更稳定、更迅速
      !pip install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple #升级到最新版本,使用清华源更稳定、更迅速
      
      • 1
      • 2
      • 3
    2. 使用Paddlehub实现口罩人脸检测,只需要几行命令。其中,test_mask_detection.jpg是一张测试图片。

      ! wget  https://paddlehub.bj.bcebos.com/resources/test_mask_detection.jpg #下载测试图片
      ! hub install pyramidbox_lite_mobile_mask==1.3.0 #加载预训练模型
      ! hub run pyramidbox_lite_mobile_mask --input_path test_mask_detection.jpg #运行预测结果
      
      • 1
      • 2
      • 3

    本节将从如下几个方面介绍PaddleHub

    • 预训练模型的应用背景;
    • PaddleHub的快速使用方法和PaddleHub支持的模型列表;
    • 通过一个完整的案例,介绍如何使用自己的数据Fine-tune PaddleHub的预训练模型。

    1. 预训练模型的应用背景

    众所周知,深度学习任务依赖较多的数据完成神经网络的训练。在实际场景中,数据量的大小与成本成正比,常遇到语料数据或者图像数据较少,不足以支持完成神经网络模型训练的场景。

    经过不断的探索,人们发现有两种思路可以解决训练数据不足的问题。

    1.1 多任务学习与迁移学习

    人们发现处理很多任务所依赖的信息特征是相通的,比如从图片中框选出一只猫的任务与识别一个生物是不是猫的任务,均需要提取出标识猫的有效特征。这是符合认知的,人类处理一件任务也会不自觉的运用上从其他任务上学习到的知识和方法,比如我们学习英语的时候,也会代入已经掌握的很多中文语法习惯。

    基于迁移学习的思想,我们可以将模型先在数据丰富的任务上学习,再使用新任务的小数据量做Fine-tune(网络参数的微调,继承了从数据丰富任务上学习到的知识),最终达到较好的效果。

    图2展示了对于不同的自然语言任务,很多本质的信息和知识是可以共享的。词性标注、句子句法成分划分、命名实体识别、语义角色标注等NLP任务适合采用多任务学习来解决。PaddleHub提供了预训练好的语义表示库ERNIE,它是这方面的佼佼者。


    图2:多任务学习与迁移学习

    1.2 自监督学习

    通过一些巧妙的方法,我们可以将一些无监督的数据样本转变成监督学习,来学习数据中的知识。如图3所示,按照通常的理解,一张无标签的图片和一段自然语言文本是无监督的数据。但我们可以将部分图像进行遮挡,未遮挡的部分作为监督模型的输入,遮挡的部分作为模型需要预测的输出。同样的,也可以将一段文本中的部分短语遮挡,未遮挡的部分作为监督模型的输入,遮挡的部分作为模型需要预测的输出。


    图3:自监督学习

    PaddleHub中预置了大量的预训练模型,均采用了上述两种技术,并结合了百度在互联网领域海量的独有数据积累,数十种广受开发者欢迎的模型均是PaddleHub独有的。

    2. 快速使用PaddleHub

    既然PaddleHub的使用如此简单,功能又如此强大,那么读者们是否迫不及待了呢?下面我们就展示下快速使用PaddleHub的两种方式:Python代码调用命令行调用

    2.1 通过Python代码调用方式 使用PaddleHub

    首先以计算机视觉任务为例,我们选用一张测试图片test.jpg,分别实现如下四项功能:

    注:有关调用的模型名字参考官方文档

    2.1.1 CV任务

    原图展示

    # 待预测图片
    test_img_path = ["./test.jpg"]
    

    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg

    img = mpimg.imread(test_img_path[0])

    # 展示待预测图片
    plt.figure(figsize=(10,10))
    plt.imshow(img)
    plt.axis(‘off’)
    plt.show()

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMNhrP8y-1594442261635)(C:\Users\ADMINI~1\AppData\Local\Temp\1594438697714.png)]

    人像扣图

    #安装预训练模型
    !hub install deeplabv3p_xception65_humanseg==1.1.0
    
    • 1
    • 2
    Downloading deeplabv3p_xception65_humanseg
    [==================================================] 100.00%
    Uncompress /home/aistudio/.paddlehub/tmp/tmpybp717db/deeplabv3p_xception65_humanseg
    [==================================================] 100.00%
    Successfully installed deeplabv3p_xception65_humanseg-1.1.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    import paddlehub as hub
    import matplotlib.image as mpimg
    import matplotlib.pyplot as plt
    

    module = hub.Module(name=“deeplabv3p_xception65_humanseg”)
    res = module.segmentation(paths = ["./test.jpg"], visualization=True, output_dir=‘humanseg_output’)

    res_img_path = ‘humanseg_output/test.png’
    img = mpimg.imread(res_img_path)
    plt.figure(figsize=(10, 10))
    plt.imshow(img)
    plt.axis(‘off’)
    plt.show()

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8NlreER9-1594442261638)(C:\Users\ADMINI~1\AppData\Local\Temp\1594438787148.png)]

    人体部位分割

    #安装预训练模型
    !hub install ace2p==1.1.0
    
    • 1
    • 2
    Downloading ace2p
    [==================================================] 100.00%
    Uncompress /home/aistudio/.paddlehub/tmp/tmpses1557l/ace2p
    [==================================================] 100.00%
    Successfully installed ace2p-1.1.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    import paddlehub as hub
    import matplotlib.image as mpimg
    import matplotlib.pyplot as plt
    

    module = hub.Module(name=“ace2p”)
    res = module.segmentation(paths = ["./test.jpg"], visualization=True, output_dir=‘ace2p_output’)

    res_img_path = ‘./ace2p_output/test.png’
    img = mpimg.imread(res_img_path)
    plt.figure(figsize=(10, 10))
    plt.imshow(img)
    plt.axis(‘off’)
    plt.show()

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XgSbI5sH-1594442261640)(C:\Users\ADMINI~1\AppData\Local\Temp\1594438880710.png)]

    人脸检测

    #安装预训练模型
    ! hub install ultra_light_fast_generic_face_detector_1mb_640==1.1.2
    
    • 1
    • 2
    Downloading ultra_light_fast_generic_face_detector_1mb_640
    [==================================================] 100.00%
    Uncompress /home/aistudio/.paddlehub/tmp/tmpstkqzi19/ultra_light_fast_generic_face_detector_1mb_640
    [==================================================] 100.00%
    Successfully installed ultra_light_fast_generic_face_detector_1mb_640-1.1.2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    import paddlehub as hub
    import matplotlib.image as mpimg
    import matplotlib.pyplot as plt
    

    module = hub.Module(name=“ultra_light_fast_generic_face_detector_1mb_640”)
    res = module.face_detection(paths = ["./test.jpg"], visualization=True, output_dir=‘face_detection_output’)

    res_img_path = ‘./face_detection_output/test.jpg’
    img = mpimg.imread(res_img_path)
    plt.figure(figsize=(10, 10))
    plt.imshow(img)
    plt.axis(‘off’)
    plt.show()

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JeMJKreB-1594442261645)(C:\Users\ADMINI~1\AppData\Local\Temp\1594438957906.png)]

    关键点检测

    #安装预训练模型
    !hub install human_pose_estimation_resnet50_mpii==1.1.0
    
    • 1
    • 2
    File human_pose_estimation_resnet50_mpii_1.1.0.tar.gz already existed
    Wait to check the MD5 value
    MD5 check failed!
    Delete invalid file.
    Downloading human_pose_estimation_resnet50_mpii_1.1.0.tar.gz
    [==================================================] 100.00%
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    import paddlehub as hub
    import matplotlib.image as mpimg
    import matplotlib.pyplot as plt
    

    module = hub.Module(name=“human_pose_estimation_resnet50_mpii”)
    res = module.keypoint_detection(paths = ["./test.jpg"], visualization=True, output_dir=‘keypoint_output’)

    res_img_path = ‘./keypoint_output/test.jpg’
    img = mpimg.imread(res_img_path)
    plt.figure(figsize=(10, 10))
    plt.imshow(img)
    plt.axis(‘off’)
    plt.show()

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqm5dE72-1594442261646)(C:\Users\ADMINI~1\AppData\Local\Temp\1594439040844.png)]

    2.1.2 NLP 任务

    对于自然语言处理任务,下面以中文分词和情感分类的任务为例,待处理的数据以函数参数的形式传入。

    #安装预训练模型
    !hub install lac==2.1.1
    
    • 1
    • 2
    Downloading lac
    [==================================================] 100.00%
    Uncompress /home/aistudio/.paddlehub/tmp/tmpt0t3qlhr/lac
    [==================================================] 100.00%
    Successfully installed lac-2.1.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    import paddlehub as hub
    

    lac = hub.Module(name=“lac”)
    test_text = [“1996年,曾经是微软员工的加布·纽维尔和麦克·哈灵顿一同创建了Valve软件公司。他们在1996年下半年从id software取得了雷神之锤引擎的使用许可,用来开发半条命系列。”]
    res = lac.lexical_analysis(texts = test_text)
    print(“中文词法分析结果:”, res)

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    [2020-05-25 10:40:44,605] [    INFO] - Installing lac module
    [2020-05-25 10:40:44,610] [    INFO] - Module lac already installed in /home/aistudio/.paddlehub/modules/lac
    中文词法分析结果: [{'word': ['1996年', ',', '曾经', '是', '微软', '员工', '的', '加布·纽维尔', '和', '麦克·哈灵顿', '一同', '创建', '了', 'Valve软件公司', '。', '他们', '在', '1996年下半年', '从', 'id', ' ', 'software', '取得', '了', '雷神之锤', '引擎', '的', '使用', '许可', ',', '用来', '开发', '半条命', '系列', '。'], 'tag': ['TIME', 'w', 'd', 'v', 'ORG', 'n', 'u', 'PER', 'c', 'PER', 'd', 'v', 'u', 'ORG', 'w', 'r', 'p', 'TIME', 'p', 'nz', 'w', 'n', 'v', 'u', 'n', 'n', 'u', 'vn', 'vn', 'w', 'v', 'v', 'n', 'n', 'w']}]
    
    • 1
    • 2
    • 3
    #安装预训练模型
    ! hub install senta_bilstm==1.1.0
    
    • 1
    • 2
    Downloading senta_bilstm
    [==================================================] 100.00%
    Uncompress /home/aistudio/.paddlehub/tmp/tmpjh2vgjcx/senta_bilstm
    [==================================================] 100.00%
    Successfully installed senta_bilstm-1.1.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    import paddlehub as hub
    

    senta = hub.Module(name=“senta_bilstm”)
    test_text = [“味道不错,确实不算太辣,适合不能吃辣的人。就在长江边上,抬头就能看到长江的风景。鸭肠、黄鳝都比较新鲜。”]
    res = senta.sentiment_classify(texts = test_text)
    print(“中文词法分析结果:”, res)

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    [2020-05-25 10:43:00,885] [    INFO] - Installing senta_bilstm module
    [2020-05-25 10:43:00,949] [    INFO] - Module senta_bilstm already installed in /home/aistudio/.paddlehub/modules/senta_bilstm
    [2020-05-25 10:43:02,875] [    INFO] - Installing lac module
    [2020-05-25 10:43:02,877] [    INFO] - Module lac already installed in /home/aistudio/.paddlehub/modules/lac
    中文词法分析结果: [{'text': '味道不错,确实不算太辣,适合不能吃辣的人。就在长江边上,抬头就能看到长江的风景。鸭肠、黄鳝都比较新鲜。', 'sentiment_label': 1, 'sentiment_key': 'positive', 'positive_probs': 0.9775, 'negative_probs': 0.0225}]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2 通过命令行调用方式 使用PaddleHub

    PaddleHub在设计时,为模型的管理和使用提供了命令行工具,也提供了通过命令行调用PaddleHub模型完成预测的方式。比如,上面人像分割和文本分词的任务也可以通过命令行调用的方式实现。

    #通过命令行方式实现人像分割任务
    ! hub run deeplabv3p_xception65_humanseg --input_path test.jpg
    
    • 1
    • 2
    [{'data': array([[-226.66667, -226.66667, -226.66667, ..., -226.66667, -226.66667,
            -226.66667],
           [-226.66667, -226.66667, -226.66667, ..., -226.66667, -226.66667,
            -226.66667],
           [-226.66667, -226.66667, -226.66667, ..., -226.66667, -226.66667,
            -226.66667],
           ...,
           [-226.66667, -226.66667, -226.66667, ..., -226.66667, -226.66667,
            -226.66667],
           [-226.66667, -226.66667, -226.66667, ..., -226.66667, -226.66667,
            -226.66667],
           [-226.66667, -226.66667, -226.66667, ..., -226.66667, -226.66667,
            -226.66667]], dtype=float32)}]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    #通过命令行方式实现文本分词任务
    !hub run lac --input_text "今天是个好日子"
    
    • 1
    • 2
    [{'word': ['今天', '是', '个', '好日子'], 'tag': ['TIME', 'v', 'q', 'n']}]
    
    • 1

    上面的命令中包含四个部分,分别是:

    • hub 表示PaddleHub的命令。
    • run 调用run执行模型的预测。
    • deeplabv3p_xception65_humanseglac表示要调用的算法模型。
    • --input_path/--input_text 表示模型的输入数据,图像和文本的输入方式不同。

    PaddleHub的命令行工具在开发时借鉴了AnacondaPIP等软件包管理的理念,可以方便快捷的完成模型的搜索、下载、安装、升级、预测等功能。
    可点击Github的网址了解详情。
    目前,PaddleHub的命令行工具支持以下12个命令:

    • install:用于将Module安装到本地,默认安装在{HUB_HOME}/.paddlehub/modules目录下;
    • uninstall:卸载本地Module
    • show:用于查看本地已安装Module的属性或者指定目录下确定的Module的属性,包括其名字、版本、描述、作者等信息;
    • download:用于下载百度提供的Module
    • search:通过关键字在服务端检索匹配的Module,当想要查找某个特定模型的Module时,使用search命令可以快速得到结果,例如hub search ssd命令,会查找所有包含了ssd字样的Module,命令支持正则表达式,例如hub search ^s.\* 搜索所有以s开头的资源;
    • list:列出本地已经安装的Module
    • run:用于执行Module的预测;
    • version:显示PaddleHub版本信息;
    • help:显示帮助信息;
    • clearPaddleHub在使用过程中会产生一些缓存数据,这部分数据默认存放在${HUB_HOME}/.paddlehub/cache目录下,用户可以通过clear命令来清空缓存;
    • autofinetune:用于自动调整Fine-tune任务的超参数,具体使用详情参考PaddleHub AutoDL Finetuner使用教程;
    • config:用于查看和设置Paddlehub相关设置,包括对server地址、日志级别的设置;
    • serving:用于一键部署Module预测服务,详细用法见PaddleHub Serving一键服务部署

    PaddleHub的产品理念是模型即软件,通过Python API或命令行实现模型调用,可快速体验或集成飞桨特色预训练模型。

    此外,当用户想用少量数据来优化预训练模型时,PaddleHub也支持迁移学习,通过Fine-tune API,内置多种优化策略,只需少量代码即可完成预训练模型的Fine-tuning

    3. PaddleHub提供的预训练模型

    为了更好的应用PaddleHub的各种能力,我们需要知道PaddleHub集成了哪些模型。PaddleHub提供的预训练模型涵盖了图像分类、目标检测、视频分类、图像生成、图像分割、关键点检测、词法分析、语义模型、情感分析、文本审核等主流模型。PaddleHub的资源已有100多个分布在各领域的预训练模型,其中各领域均有百度独有数据训练或独有技术积累的模型,即只能在PaddleHub中找到的强大预训练模型,如 图4 所示。


    图4:PaddleHub特色预训练模型

    PaddleHub中集成的模型列表如下(持续扩充中):

    • NLP模型列表
      • 语义模型:word2vec_skipgram、simnet_bow、rbtl3、rbt3、Ernie_v2_eng_large、ernie_v2_eng_base、ernie_tiny、ERNIE、chinese-roberta-wwm-ext-large、chinese-roberta-wwm-ext、chinese-electra-small、chinese-electra-base、chinese-bert-wwm-ext、chinese-bert-wwm
      • 文本审核: porn_detection_lstm、 porn_detection_gru、 porn_detection_cnn
      • 词法分析:lac
      • 情感分析:senta_lstm、senta_gru、senta_cnn、senta_bow、senta_bilstm、emotion_detection_textcnn
    • CV模型列表
      • 图像分类:vgg、xception、shufflenetv2、se_resnet、resnet、resnet_vd、resnet_v2、pnasnet、mobilenet、inception_v4、Googlenet、efficientent、dpn、densent、darknet、alexnet
      • 关键点检测:pose_resnet50_mpii、face_landmark_localization
      • 目标检测:yolov3、ssd、Pyramidbox、faster_rcnn
      • 图像生成: StyleProNNet、stgan、cyclegan、attgan
      • 图像分割:deeplabv3、ace2p
      • 视频分类:TSN、TSM、stnet、nonlocal

    4. 使用自己的数据Fine-tune PaddleHub预训练模型

    果农需要根据水果的不同大小和质量进行产品的定价,所以每年收获的季节有大量的人工对水果分类的需求。基于人工智能模型的方案,收获的大堆水果会被机械放到传送带上,模型会根据摄像头拍到的图片,控制仪器实现水果的自动分拣,节省了果农大量的人力。


    图5:水果在工厂传送带上自动分类

    下面我们就看看如果采集到少量的桃子数据,如何基于PaddleHubImageNet数据集上预训练模型进行Fine-tune,得到一个更有效的模型。桃子分类数据集取自AI Studio公开数据集桃脸识别,该桃脸识别数据集中已经将所有桃子的图片分为2个文件夹,一个是训练集一个是测试集;每个文件夹中有4个分类,分别是B1M2R0S3


    图6:自动分类结果示意

    使用PaddleHub中的模型进行迁移学习的步骤如 图7 所示:


    图7:PaddleHub模型迁移学习步骤

    实现迁移学习,包括如下步骤:

    1. 安装PaddleHub
    2. 数据准备
    3. 模型准备
    4. 训练准备
    5. 组建Fine-tune Task
    6. 启动Fine-tune

    在迁移学习的过程中,除了指定迁移学习的问题类型之外(通过选择模型的方式),还可以选择迁移学习的策略,以及对新收集样本做出数据增强的方法。

    4.1 安装PaddleHub

    paddlehub安装可以使用pip完成安装,如下:

    # 安装并升级PaddleHub,使用清华源更稳定、更迅速
    pip install paddlehub==1.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple 
    pip install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    • 1
    • 2
    • 3

    4.2 数据准备

    在本次教程提供的数据文件中,已经提供了分割好的训练集、验证集、测试集的索引和标注文件。如果用户利用PaddleHub迁移CV类任务使用自定义数据,则需要自行切分数据集,将数据集切分为训练集、验证集和测试集。需要三个文本文件来记录对应的图片路径和标签,此外还需要一个标签文件用于记录标签的名称。相关方法可参考用户自定义PaddleHub的数据格式

    ├─data: 数据目录	
      ├─train_list.txt:训练集数据列表	
      ├─test_list.txt:测试集数据列表	
      ├─validate_list.txt:验证集数据列表	
      ├─label_list.txt:标签列表	
      └─……	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    训练集、验证集和测试集的数据列表文件的格式如下,列与列之间以空格键分隔。

    图片1路径 图片1标签	
    图片2路径 图片2标签	
    ...
    
    • 1
    • 2
    • 3

    label_list.txt的格式如下:

    分类1名称	
    分类2名称	
    ...	
    
    • 1
    • 2
    • 3
    • 4

    准备好数据后即可使用PaddleHub完成数据读取器的构建,实现方法如下所示:构建数据读取Python类,并继承BaseCVDataset这个类完成数据读取器构建。只要按照PaddleHub要求的数据格式放置数据,均可以用这个数据读取器完成数据读取工作。

    !unzip -q -o ./data/data34445/peach.zip -d ./work
    
    • 1
    import paddlehub as hub
    from paddlehub.dataset.base_cv_dataset import BaseCVDataset  #加载图像类自定义数据集,仅需要继承基类BaseCVDatast,修改数据集存放地址即可
    

    class DemoDataset(BaseCVDataset):
    def init(self):
    # 数据集存放位置
    self.dataset_dir = “./work/peach-classification” #dataset_dir为数据集实际路径,需要填写全路径
    super(DemoDataset, self).init(
    base_path=self.dataset_dir,
    train_list_file=“train_list.txt”,
    validate_list_file=“validate_list.txt”,
    test_list_file=“test_list.txt”,
    #predict_file=“predict_list.txt”, #如果还有预测数据(没有文本类别),可以将预测数据存放在predict_list.txt文件
    label_list_file=“label_list.txt”,
    # label_list=[“数据集所有类别”] #如果数据集类别较少,可以不用定义label_list.txt,可以选择定义label_list=[“数据集所有类别”]
    )
    dataset = DemoDataset()

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4.3 模型准备

    我们要在PaddleHub中选择合适的预训练模型来Fine-tune,由于桃子分类是一个图像分类任务,这里采用Resnet50模型,并且是采用ImageNet数据集Fine-tune过的版本。这个预训练模型是在图像任务中的一个“万金油”模型,Resnet是目前较为有效的处理图像的网络结构,50层是一个精度和性能兼顾的选择,而ImageNet又是计算机视觉领域公开的最大的分类数据集。所以,在不清楚选择什么模型好的时候,可以优先以这个模型作为baseline

    使用PaddleHub,不需要重新手写Resnet50网络,可以通过一行代码实现模型的调用。

    #安装预训练模型
    ! hub install resnet_v2_50_imagenet
    
    • 1
    • 2
    Downloading resnet_v2_50_imagenet
    [==================================================] 100.00%
    Uncompress /home/aistudio/.paddlehub/tmp/tmpn1e1enxo/resnet_v2_50_imagenet
    [==================================================] 100.00%
    Successfully installed resnet_v2_50_imagenet-1.0.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    import paddlehub as hub
    

    module = hub.Module(name=“resnet_v2_50_imagenet”) #加载Hub提供的图像分类的预训练模型resnet_v2_50_imagenet

    • 1
    • 2
    • 3
    [2020-05-25 10:45:16,692] [    INFO] - Installing resnet_v2_50_imagenet module
    [2020-05-25 10:45:16,710] [    INFO] - Module resnet_v2_50_imagenet already installed in /home/aistudio/.paddlehub/modules/resnet_v2_50_imagenet
    
    • 1
    • 2

    将训练数据输入模型之前,我们通常还需要对原始数据做一些数据处理的工作,比如数据格式的规范化处理,或增加一些数据增强策略

    构建图像分类模型的数据读取器(Reader),负责将桃子dataset的数据进行预处理,以特定格式组织并输入给模型进行训练。

    如下数据处理策略,只做了两种操作:

    1. 指定输入图片的尺寸,并将所有样本数据统一处理成该尺寸。
    2. 对所有输入图片数据进行归一化处理。其中,需要通过参数指定上一步的dataset来链接到具体数据集,相当于在第一步的数据读取器上又包了一层处理策略。
    data_reader = hub.reader.ImageClassificationReader(
        image_width=module.get_expected_image_width(),   #预期桃子图片经过reader处理后的图像宽度
        image_height=module.get_expected_image_height(), #预期桃子图片经过reader处理后的图像高度
        images_mean=module.get_pretrained_images_mean(), #进行桃子图片标准化处理时所减均值。默认为None
        images_std=module.get_pretrained_images_std(),   #进行桃子图片标准化处理时所除标准差。默认为None
        dataset=dataset)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    [2020-05-25 10:45:19,933] [    INFO] - Dataset label map = {'R0': 0, 'B1': 1, 'M2': 2, 'S3': 3}
    
    • 1

    4.4 训练准备

    定义好模型,也设定好数据读取器后,我们就可以开始设置训练的策略。训练的配置使用hub.RunConfig函数完成,包括配置Fine-tune的轮数、Batchsize、评估的间隔等等,实现如下:

    # Setup runing config for PaddleHub Finetune API
    config = hub.RunConfig(
        use_cuda=True,                                                #是否使用GPU训练,默认为False;
        num_epoch=1,                                                  #Fine-tune的轮数;
        checkpoint_dir="cv_finetune_turtorial_demo",                  #模型checkpoint保存路径, 若用户没有指定,程序会自动生成;
        batch_size=32,                                                #训练的批大小,如果使用GPU,请根据实际情况调整batch_size;
        eval_interval=50,                                             #模型评估的间隔,默认每100个step评估一次验证集;
        strategy=hub.finetune.strategy.DefaultFinetuneStrategy())     #Fine-tune优化策略;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    [2020-05-25 10:45:22,634] [    INFO] - Checkpoint dir: cv_finetune_turtorial_demo
    
    • 1

    4.5 组建Fine-tune Task

    有了合适的预训练模型,并准备好要迁移的数据集后,我们开始组建一个Task。在PaddleHub中,Task代表了一个Fine-tune的任务。任务中包含了执行该任务相关的Program、数据读取器Reader、运行配置等内容。PaddleHub预置了常见任务的Task,每种Task都有特定的应用场景并提供了对应的度量指标,满足用户的不同需求。在这里可以找到图像分类任务的对应说明ImageClassifierTask

    由于桃子分类是一个四分类的任务,而我们下载的分类module是在ImageNet数据集上训练的1000分类模型。所以需要对模型进行简单的微调,即将最后一层1000分类全连接层改成4分类的全连接层,并重新训练整个网络。实现方案如下:

    1. 获取modulePaddleHub的预训练模型)的上下文环境,包括输入和输出的变量,以及Paddle Program(可执行的模型格式)。
    2. 从预训练模型的输出变量中找到特征图提取层feature_map,在feature_map后面接入一个全连接层,如下代码中通过hub.ImageClassifierTaskfeature_map参数指定。
    3. 网络的输入层保持不变,依然从图像输入层开始,如下代码中通过hub.ImageClassifierTask的参数feed_list变量指定。

    hub.ImageClassifierTask就是通过这两个参数明确我们的截取骨干网络的要求,按照这样的配置,我们截取的网络是从输入层“image”一直到特征提取的最后一层“feature_map”

    input_dict, output_dict, program = module.context(trainable=True) #获取module的上下文信息包括输入、输出变量以及paddle program
    

    img = input_dict[“image”] #待传入图片格式

    feature_map = output_dict[“feature_map”] #从预训练模型的输出变量中找到最后一层特征图,提取最后一层的feature_map

    feed_list = [img.name] #待传入的变量名字列表

    task = hub.ImageClassifierTask(
    data_reader=data_reader, #提供数据的Reader
    feed_list=feed_list, #待feed变量的名字列表
    feature=feature_map, #输入的特征矩阵
    num_classes=dataset.num_labels, #分类任务的类别数量
    config=config) #运行配置

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    [2020-05-25 10:45:26,755] [    INFO] - 267 pretrained paramaters loaded by PaddleHub
    
    • 1

    4.6 启动Fine-tune

    最后,使用Finetune_and_eval函数可以同时完成训练和评估。在Fine-tune的过程中,控制台会周期性打印模型评估的效果,以便我们了解整个训练过程的精度变化。

    run_states = task.finetune_and_eval() #通过众多finetune API中的finetune_and_eval接口,可以边训练,边打印结果
    
    • 1
    [2020-05-25 10:45:34,892] [    INFO] - Strategy with slanted triangle learning rate, L2 regularization, 
    /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/executor.py:804: UserWarning: There are no operators in the program to be executed. If you pass Program manually, please use fluid.program_guard to ensure the current Program is being used.
      warnings.warn(error_info)
    [2020-05-25 10:45:37,003] [    INFO] - Try loading checkpoint from cv_finetune_turtorial_demo/ckpt.meta
    [2020-05-25 10:45:37,952] [    INFO] - PaddleHub model checkpoint loaded. current_epoch=2, global_step=188, best_score=0.99760
    [2020-05-25 10:45:37,953] [    INFO] - PaddleHub finetune start
    [2020-05-25 10:45:37,954] [    INFO] - PaddleHub finetune finished.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Fine-tune完成后,我们使用模型来进行预测,实现如下:

    import numpy as np
    

    data = ["./work/peach-classification/test/M2/0.png"] #传入一张测试M2类别的桃子照片
    task.predict(data=data,return_result=True) #使用PaddleHub提供的API实现一键结果预测,return_result默认结果是False

    • 1
    • 2
    • 3
    • 4
    [2020-05-25 10:45:40,748] [    INFO] - PaddleHub predict start
    [2020-05-25 10:45:40,749] [    INFO] - Load the best model from cv_finetune_turtorial_demo/best_model
    [2020-05-25 10:45:42,838] [    INFO] - PaddleHub predict finished.
    ['M2']
    
    • 1
    • 2
    • 3
    • 4

    以上为加载模型后实际预测结果(这里只测试了一张图片),返回的是预测的实际效果,可以看到我们传入待预测的是M2类别的桃子照片,经过Fine-tune之后的模型预测的效果也是M2,由此成功完成了桃子分类的迁移学习。

    5. 相关参考链接

    • PaddleHub 官网链接:https://www.paddlepaddle.org.cn/hub
    • PaddleHub Github链接:https://github.com/PaddlePaddle/PaddleHub
    • PaddleHub 课程链接:https://aistudio.baidu.com/aistudio/course/introduce/1070
                                    </div>
    
    展开全文
  • 【Python3】DialoGPT 预训练模型funetune

    万次阅读 2019-12-05 04:31:11
    DialoGPT是基于GPT-2的对话生成预训练模型,在reddit数据集上训练 与2019年放出,现在已经在github上已经有了400+star,值得关注 DialoGPT原论文 本机环境 亚洲地区亚马逊服务器linux GPU 4 * V100 ...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 183
精华内容 73
关键字:

对话预训练