写点什么

机器人是如何识别你的意图的?多轮对话机器人打造(中篇):话题意图识别

  • 2019-11-05
  • 本文字数:4981 字

    阅读完需:约 16 分钟

机器人是如何识别你的意图的?多轮对话机器人打造(中篇):话题意图识别

多轮对话聊天机器人,作为人工智能的典型应用场景,也是一项极具挑战的任务,不仅涉及多方面异构知识的表示、抽取、推理和应用,还涉及包括自然语言理解在内的其他人工智能核心技术的综合利用。上篇文章《多轮对话机器人打造(上篇):着手设计》中,我们做好了基础的工作,本文将围绕话题意图识别,进一步讲解如何打造多轮对话机器人。


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



对话系统整体结构图


对于多轮任务型对话,首先需要理解用户主要说了啥,怎么说的以及对话的逻辑流程,并借助于对业务的理解以及对话文本的数据分析,抽象出对用户发言的语义理解定义,也即是语义理解模块。本篇主要是讲述意图识别的技术知识。在我们的业务场景中,意图细分成了 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)的整体评估指标值如下:



话题热词分析:


对于抽取每个 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 话题中热词出现了“制裁”,主要是问“游戏信用分话题“的发言中,存在一些“多少信用分能够解制裁”,“账号被制裁,多少信用分能解”之类的问题。后续可以根据业务需求增加后过滤处理操作。

话题意图模型的运营优化

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

2. Badcase 的分类错误原因

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

  • 训练集中的 label 标错了。

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


  1. Badcase 的修正

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



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



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


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

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

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



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


(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)


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

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

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

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


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接:


https://mp.weixin.qq.com/s/IfxD8yFv6hAfhrTC6ysGOw


2019-11-05 18:413875

评论 1 条评论

发布
用户头像
大师,上篇在哪呢?
2021-02-19 13:34
回复
没有更多了
发现更多内容

终于有人把TCP协议与UDP协议给搞明白了

编程菌

Java 编程 程序员 计算机 java技术宅

架构师训练营-毕业设计

俞立夫

神策分析 iOS SDK 全埋点解析之元素点击与页面浏览

神策技术社区

大前端 后端 数据 埋点

当知识图谱遇上预训练语言模型

博文视点Broadview

Fil今日价格行情?Fil未来多少钱一枚?

区块链 分布式存储 IPFS fil价格 fil行情

八家知名大厂联合手写的Java面试手册刚上线!竟就到达巅峰?

Java~~~

Java 架构 面试 JVM 多线程

python——execl写入数据2

YUKI0506

OceanBase数据库源码解读之模块结构

OceanBase 数据库

数据库 分布式数据库 oceanbase OceanBase 开源 OceanBase 社区版

activiti整合在现有系统,业务绑定,流程在线设计@附源码

金陵老街

2021 OceanBase 数据库大赛来袭!邀你改编世界,码出未来

OceanBase 数据库

数据库 oceanbase OceanBase 开源 OceanBase 社区版 OceanBase 数据库大赛

好评如潮,PerfDog两年迭代正式启动商业化探索

WeTest

数字人民币专利数激增, “区块链”领域大有可为

CECBC

浅析fil:fil未来价值到底在哪?

区块链 分布式存储 IPFS fil FIL价值

插上NIO翅膀,FunTester飞上天

FunTester

nio 性能测试 接口测试 测试框架 FunTester

云原生 | 混沌工程工具 ChaosBlade Operator Node 篇

RadonDB

数据库 云原生 混沌工程

经济学人:若比特币价格清零会怎样?

CECBC

云时代的到来会淘汰运维人员吗?运维工作可以一直做吗?

行云管家

云计算 运维 云服务 IT运维 云时代

IM开发技术学习:揭秘微信朋友圈这种信息推流背后的系统设计

JackJiang

即时通讯 IM 微信朋友圈

阿里这份15w字Java核心面试笔记!GitHub凭借百万下载量位居榜首

Java~~~

Java 架构 面试 微服务 多线程

容器化 | ClickHouse on K8s 基础篇

RadonDB

数据库 Kubernetes Clickhouse

容器化 | ClickHouse on K8s 部署篇【建议收藏】

RadonDB

数据库 Kubernetes Clickhouse

架构实战营毕业总结

俞立夫

架构实战营

牛客网论坛最具争议的Java面试成神笔记,GitHub已下载量已过百万

Java~~~

Java 架构 面试 算法 架构师

还不了解 static ?年轻人,劝你耗子尾汁...

神策技术社区

数据分析 大前端 后端 埋点

为什么你的数据总是丢?

神策技术社区

数据分析 大前端 后端 埋点

Activity之间跳转时,生命周期的变化

W🌥

android 8月日更

“区块链”赋能智慧社区,多维度提升管理质效

旺链科技

区块链 智慧社区

工具 | 使用 CLion 编译调试 MySQL 8.0

RadonDB

MySQL 数据库

金融助力补链强链 科技发挥关键作用

CECBC

2021 年 iOS 应用程序开发七种最佳语言

iOSer

Java flutter ios objective-c swift

python——利用tkinter制作可视化窗体1

YUKI0506

机器人是如何识别你的意图的?多轮对话机器人打造(中篇):话题意图识别_AI&大模型_guanqin_InfoQ精选文章