guanqin作者

中篇 | 多轮对话机器之话题意图识别

引言

回顾一下自己参与的智能客服系统项目,从技术调研到游戏领域的对话文本数据分析和任务细分定义,再到建模调优以及最后的运营优化等整体流程的学习,收获良多。一般的智能客服系统包括三大模块,具体系统结构图如下:

对话系统整体结构图

对于多轮任务型对话,首先需要理解用户主要说了啥,怎么说的以及对话的逻辑流程,并借助于对业务的理解以及对话文本的数据分析,抽象出对用户发言的语义理解定义,也即是语义理解模块。本篇主要是讲述意图识别的技术知识。在我们的业务场景中,意图细分成了2层的层级意图结构,也即话题意图以及在每个话题下的用户行为意图,也可以理解为每种话题意图相当于一个Chatbot。所以,话题意图的识别效果对后续流程影响较大。       

话题意图识别属于文本分类任务,在我们的游戏安全场景中,定义了7种话题类别,包括安全模式、被盗、失误、封号、信用、举报,以及常用性发言。对于常用的文本分类任务,我们抽象出了一个通用的处理流程,从文本预处理,到寻找经典话术,也即是能覆盖到大部分用户发言的话术;然后基于经典话术人工打标,并根据文本相似性的方法来自动化扩展标签数据集,构成训练集合。这一构建监督训练数据集的方法,较适用于缺乏人力,又想更好地覆盖原始数据的分布的情况。最后,基于各种特征抽取器构建模型并调优。其具体流程结构如下图,其中虚线部分是从数据和模型两个层面不断优化分类效果,其中图中红色的2、3点是从数据层面来修正部分样本的标签以及获取更多的标签样本,红色的 1点是从模型结构来优化性能。

常见文本处理任务通用流程图

上图中的抽取经典句子模块的目的是使得经典发言集合能够覆盖更多的用户发言集合,做到以经典话术代表绝大部分的语义。主要做法是基于主题模型、基于句子向量的无监督聚类、基于文本向量相似性构建的图数据并结合PageRank和图连通分量等方法的集成,能够从上百万的用户发言中共同找出少量的代表性发言,其数量在几千到1万多。

上图中的标签样本的自动化扩展模块主要是通过文本向量的相似性技术来做扩展,主要是基于编辑距离、基于关键词权重的加权词向量、Seq2Seq-AutoEncoder和BERT的句子向量相似性并结合阈值的方式来扩展标签样本。然后通过过滤操作弃掉一些badcase,主要是基于否定词和关键词(主要是针对短句,相似对中差集中含有一些表达话题语义的关键词)做过滤,最后按照每条种子样本自动化标记的情况分层抽样一部分自动标记的数据,通过人工简单审核,视情况修正。对于没有标记上的发言样本,可以重复抽取经典发言然后再自动化标签扩展的步骤来不断迭代得到更加大量和多样化表达的标签语料集合。     

上图中的编码器和特定任务部分,就是基于特定任务构建学习模型,对于神经网络来讲,是各种可以抽取文本语义表示的神经网络编码器。下面将从样本处理、模型构建、模型效果优化等方面详细介绍下话题意图分类模块。首先,本话题意图原始数据是基于游戏中一段对话的场景来打标签的,训练集样本的标签准确度不高,因此需要对样本做标签修正的预处理来提纯样本标签。

话题意图分类模块构建

1. 分类模块的具体构建流程

  • 数据预处理:通过基于关键词和短语结构的正则表达式、自动化标签扩展模块这2种方法,清理不纯样本和修正错误样本标签最终得到7 种topic类别(一般、安全模式、被盗、失误、封号、信用、举报)的数据, 约92w左右。

  • 通过新词发现模块把游戏名、装备名、地区名等名词加入到Jieba词表中;然后做带词性的切词,同时把句子切词后含有的游戏专有名词和游戏地区名替换为GameName、AreaName等通配符。这个Trick是为了减弱无关词对分类的影响,因为这些专有名词会在被盗、封号等类别中经常出现,影响分类效果。

  • 基于全量数据使用Word2vec算法来预训练词向量、词性向量。

  • 输入词编号和词性编号,加载预训练好的Embedding向量参数,训练基于两层CNN+Highway结构的文本分类模型,保存验证集合中准确率最好的模型。

  • 模型多标签分类预测时,取预测概率值最高的类别,但当所有类别的预测概率都小于0.3时,判定为common。经测试,此策略比单独取预测概率最高的类别返回,效果更好。因为话题模型是一个入口模型,决定着后续任务将交给哪一个类别的Chatbot处理,其中common类别是不触发具体的任务型Chatbot;所以采用宁可放过也不愿意错判的策略。

(注:各个topic单独设计基于正则表达式的前置过滤规则,可配置过滤badcase,便于安全运营,待积累一段时间的错判语料后,再更新线上的话题分类模型)

2. 模型结构介绍

我们尝试了4、5种不同RNN、CNN以及Attention等组合结构的深度学习文本分类结构。从我们的应用场景出发,用户发言一般是短文本,长度大多在几十个字内,关键词和短语对分类显著的作用,同时基于处理效率和性能的考虑,最终采用CNN的模型结构。CNN结构具有位置平移不变和局部特征组合的特性,多层CNN能够扩大感受野,组合更长的局部短句,然后经过池化层获取需要的显著特征。我们的模型是两层CNN结合Highway网络的结构。在卷积层中,采用了1,2,3,4四种不同宽度的一维卷积核,同种卷积核操作会操作两次,也即两层CNN。池化层后再接一个Highway层。Highway层可以更大程度地池化后的重要特征。Highwigh网络层的公式如下:

基于CNN分类模型的具体结构图如下:

基于CNN的Topic分类模型

效果评估:

我们对比了是否使用Highway层以及1,2,3不同层CNN结构的效果差别,最终是上图的结构效果最好。由于是上年做的项目,不同模型的效果对比找不到了。下面只给最终的模型评估。从训练集合随机抽取的测试集合(27521条数据),模型预测并结合线上规则的预测结果, 采用微平均(micro-average)的整体评估指标值如下:

Accuracy

Recall

F1_score

0.986

0.982

0.984

 话题热词分析

对于抽取每个topic下的热词,可以使用传统的TF-IDF、词性、Text Rank、句子语法和语义结构等方法做热词抽取、过滤和重排等操作。也可以使用基于注意力机制神经网络模型,或者两者做结合。我们是基于话题意图语料,利用RNN Attention模型在做分类预测的时候,得到每个词的注意力权重,然后根据权重值提取热词,具体做法如下:

  1.  训练基于RNN-Attention结构的分类模型,流程同上。

  2.  基于小天部分线上经典发言,利用注意力机制的分类模型做预测,然后取出网络结构中的权重层,最后累加各个词语的权重,排序得到各个topic下有显著特性的关键词。

  3.  基于RNN-Attention模型结构图如下:

基于Multi-head自注意力机制的意图分类模型

由于注意力机制层,采用了多重的Self-Attention,本模型中是设置了5个不同矩阵参数,所以学习到5种不同的表达特征,然后对发言中同一个词语的5种权重值做求和取平均操作,得到发言中各个词语的最终权重,这样既考虑了词语的出现次数和在句子中的重要性。单头Self-Attention是沿用早期翻译中的注意力机制原理,单头自注意力机制的公式如下, 其中H是输入向量:

   4. 各个话题抽取的热词效果如下:

    common(3777句):

    什么, 你们, 没有, 为什么, 游戏, 人工, 承诺, 问题, 不是

    aqmode(782句):   

    安全, 模式, 解除, 冻结, 解冻, 微信, 失败,异常, 绑定, 密码

    beidao(134句):    

    被盗, 找回, 异地, 装备, 申诉, 登录, 被盗号,  账号, 安全, 密码, 角色, 盗号者,盗号

    shiwu(21句):

    错误,失误, 赛利亚, 了解, 恢复, 跨错, 找回,回来, 误操作, 装备, 分解,看清楚,商店, 优先,小心

    fenghao(4062 句):

    制裁,  解封,  减刑,  封号,  开挂,  申诉, 外挂,  处罚,  禁赛,  账号, 作弊

    xinyong(152句):   

    信用分, 信用, 信誉, 星级, 制裁, 积分, 信用等级, 查下, 帮忙, 为什么, 一下, 账号, 多少, 满星, 四颗星

    jubao(134句):  

    举报, 外挂, 举报人, 有人, 恶意, 辱骂, 开挂, 炸团, 人头, 封号, 挂机, 诈骗     

可以看到,完全数据驱动的方法得到的效果还可以,但是也有一些badcase,例如xinyong话题中热词出现了“制裁”,主要是问“游戏信用分话题“的发言中,存在一些“多少信用分能够解制裁”,“账号被制裁,多少信用分能解”之类的问题。后续可以根据业务需求增加后过滤处理操作。

话题意图模型的运营优化

在运营优化方面,主要基于badcase来作分析:

Badcase的分类错误原因一般有:

  • 发言中含有部分常见词,在其他Topic中出现,本质是句子中存在片段的 交集,而且交集片段在不同topic中的统计分布 差异大。

  • 训练集中的label标错了。

  • 训练样本中没有出现过类似的样本。

Badcase的修正

1.   数据层(样本的整理):

2.   模型层(时间性能和效果平衡):


3.   规则层(规则粒度的大小(灵活性+维护成本)):

主要是解决模型很难识别的特殊样本,为每个分类话题分别配置正则过滤规则

构建更大量样本数据集方法介绍

基于集成模型的方法更快地构造更好、更多的标签样本集

在样本标签数据的扩展部分,除了可以使用自动化模块扩展外,还可以基于集成模型的方法来做而二次标签样本的扩展,下面是使用一份情感数据做的尝试。

1、对9千多样本数据作为种子, 使用自动化标签扩展模块来进行样本标签的扩展并经过后过滤处理,一共构造训练数据7w多条, 分布如下:

2、对训练数据, 构建并训练了4种不同结构的神经网络分类模型,每种模型的准确率如下:

然后对未标记90万左右数据做做二次样本扩展。具体做法是:取出4个模型预测标签相同并且概率大于0.9的样本作为额外的新增标签样本和原训练样本合并并去重(避免出现不一致的样本标签),同时由于DIRTY和WHITE样本量过大,做了下采样操作, 其余类别做了重复采样操作。一共得到了24w左右的训练样本, 分布如下:

3、基于全量的训练数据,最后使用效果最好的第四个分类模型, 也即完全基于注意力机制的网络结构(SelfAttention-multiAttention-Highway),训练最终的分类模型。整体准确率是98.7%(为了样本平衡,部分类别的样本复制了多遍,所以评测有所偏差)

4、同时,对集成模型扩展后数据做进一步提纯过滤,也可以采用K折交叉验证的方法来找到并处理badcase。具体是利用模型的差异性,使用投票等策略规则来更快找出可疑标签样本,然后抽取不同的数据做训练和预测,从而达到找到整个样本中的可疑标签样。对于可疑标签样本的处理可以人工或者规则自动处理,不断迭代优化模型的数据。其流程图如下:


经验总结和展望

1. 训练集量少时,预训练全量数据word2vec或者使用字词结合的方式,减少未登录词。训练模型时,微调Word2vec,效果一般会更好 

2.    CNN作为baseline会更快,多层使用batch-norm,以及结合highway层做尝试。

3.    考虑样本分布,样本不平衡处理方法:

(1)对于少数样本重复采样(基于batch数据)、多数样本负采样 

(2)调整阈值(抽样人工比较或者看PR曲线来设置)

(3)对于二分类修改Loss(代价敏感),例如同时考虑难分样本和样本类别平衡性的focalloss。

(4)数据增强(随机打乱语序、同义词替换(同义词表)、模板修改、数据生成的方法(GAN)    

4.    样本是否绝对互斥,否则用基于sigmoid的多标签损失函数,一般会收敛更快。

5.    模型的效果进行多次迭代修正后,会导致数据更符合当前模型(即是使用复杂模型也不一定更好),所以要先选择好模型,再做迭代优化。

6.    当只有小量数据集时,可以使用基于BERT的分类模型。随机取了训练集合中的2w数据作为训练和随机抽取2000条样本作为测试集。在同一CPU服务器上做测试,基于多层CNN分类模型,测试时间:18s,预测F1值:92.1% 。基于BERT的分类模型,测试时间:400s,差一个数量级,是5个样本1s,预测F1值:93.8%。对于BERT的性能优化,可以只利用前几层的结构做Finetune,或者借鉴google出品的Learn2Compress中的方法进行模型压缩优化等。

7.    对于一些话题类别数据量少的识别冷启动问题,除了上面介绍扩展样本量的方法,还可以从一些小样本学习方法来考虑,例如Few-shot learning,具体有Induction Network等。

腾讯技术工程
腾讯技术工程

腾讯技术工程事业群在机器之心的内容专栏

工程CNN数据集成数据增强多标签分类
4
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

数据分析技术

数据分析是一类统计方法,其主要特点是多维性和描述性。有些几何方法有助于揭示不同的数据之间存在的关系,并绘制出统计信息图,以更简洁的解释这些数据中包含的主要信息。其他一些用于收集数据,以便弄清哪些是同质的,从而更好地了解数据。 数据分析可以处理大量数据,并确定这些数据最有用的部分。

池化技术

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

自注意力技术

自注意力(Self-attention),有时也称为内部注意力,它是一种涉及单序列不同位置的注意力机制,并能计算序列的表征。自注意力在多种任务中都有非常成功的应用,例如阅读理解、摘要概括、文字蕴含和语句表征等。自注意力这种在序列内部执行 Attention 的方法可以视为搜索序列内部的隐藏关系,这种内部关系对于翻译以及序列任务的性能非常重要。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

文本分类技术

该技术可被用于理解、组织和分类结构化或非结构化文本文档。文本挖掘所使用的模型有词袋(BOW)模型、语言模型(ngram)和主题模型。隐马尔可夫模型通常用于词性标注(POS)。其涵盖的主要任务有句法分析、情绪分析和垃圾信息检测。

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

分层抽样技术

先将总体的单位按某种特征分为若干次级总体(层),然后再从每一层内进行单纯随机抽样,组成一个样本的方法。 一般地,在抽样时,将总体分成互不交叉的层,然后按一定的比例,从各层次独立地抽取一定数量的个体,将各层次取出的个体合在一起作为样本,这种抽样方法是一种分层抽样。 又称分类抽样或类型抽样。

注意力机制技术

我们可以粗略地把神经注意机制类比成一个可以专注于输入内容的某一子集(或特征)的神经网络. 注意力机制最早是由 DeepMind 为图像分类提出的,这让「神经网络在执行预测任务时可以更多关注输入中的相关部分,更少关注不相关的部分」。当解码器生成一个用于构成目标句子的词时,源句子中仅有少部分是相关的;因此,可以应用一个基于内容的注意力机制来根据源句子动态地生成一个(加权的)语境向量(context vector), 然后网络会根据这个语境向量而不是某个固定长度的向量来预测词。

验证集技术

验证数据集是用于调整分类器超参数(即模型结构)的一组数据集,它有时也被称为开发集(dev set)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

逻辑技术

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

特征抽取技术

word2vec技术

Word2vec,为一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。 训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。该向量为神经网络之隐藏层。 Word2vec依赖skip-grams或连续词袋(CBOW)来建立神经词嵌入。Word2vec为托马斯·米科洛夫(Tomas Mikolov)在Google带领的研究团队创造。该算法渐渐被其他人所分析和解释。

对话系统技术

对话系统大致被分成两类: 任务为导向的对话系统,帮助用户去完成特定任务,比如找商品,订住宿,订餐厅等。实现任务为导向的对话系统,主要有两类方式,流水线方法和端到端方法。非任务导向的对话系统,与用户进行互动并提供回答,简单的说,就是在开放领域的闲聊。实现非任务导向对话系统也主要可分为两类,生成方法和基于检索的方法。

交叉验证技术

交叉验证,有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证的目标是定义一个数据集到“测试”的模型在训练阶段,以便减少像过拟合的问题,得到该模型将如何衍生到一个独立的数据集的提示。

主题模型技术

主题模型(Topic Model)在机器学习和自然语言处理等领域是用来在一系列文档中发现抽象主题的一种统计模型。直观来讲,如果一篇文章有一个中心思想,那么一些特定词语会更频繁的出现。比方说,如果一篇文章是在讲狗的,那“狗”和“骨头”等词出现的频率会高些。如果一篇文章是在讲猫的,那“猫”和“鱼”等词出现的频率会高些。而有些词例如“这个”、“和”大概在两篇文章中出现的频率会大致相等。但真实的情况是,一篇文章通常包含多种主题,而且每个主题所占比例各不相同。因此,如果一篇文章10%和猫有关,90%和狗有关,那么和狗相关的关键字出现的次数大概会是和猫相关的关键字出现次数的9倍。一个主题模型试图用数学框架来体现文档的这种特点。主题模型自动分析每个文档,统计文档内的词语,根据统计的信息来断定当前文档含有哪些主题,以及每个主题所占的比例各为多少。

聚类技术

将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。“物以类聚,人以群分”,在自然科学和社会科学中,存在着大量的分类问题。聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法。聚类分析起源于分类学,但是聚类不等于分类。聚类与分类的不同在于,聚类所要求划分的类是未知的。聚类分析内容非常丰富,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预报法等。

F1值技术

为了能够评价不同算法的优劣,在Precision和Recall的基础上提出了F1值的概念,来对Precision和Recall进行整体评价。F1的定义如下: F1值 = 正确率 * 召回率 * 2 / (正确率 + 召回率)

感受野技术

一个感觉神经元的感受野是指这个位置里适当的刺激能够引起该神经元反应的区域。感受野一词主要是指听觉系统、本体感觉系统和视觉系统中神经元的一些性质。

暂无评论
暂无评论~