浅谈意图识别各种实现&数学原理
\]
目前的智能客服会话的难点是进行用户意图匹配,只有明确了意图,才能给出针对性的回答。如果匹配不了意图,再进入传统问答机器人到语料库,所有或者其他各种方式匹配得分最高预料答案进行回答。
所以下面将针对意图识别的一般性原理进行讲解和分析。
意图识别
对于在线机器人而言,就是判断用户此次咨询的问题分类。
例如,这张票不要了
->退票
,我的订单出票了没
->催出票
,我要预订明天的机票
->帮下单
等等。一般会使用下面几种方式进行提取。
基于命名实体提取和词库
例如我的订单出票了没
,使用HanLp
自然语言处理工具包, 会抽取以下2个词语
订单
、出票
,根据停用词词典去除掉订单
,然后根据出票
到词库中进行匹配对应的分类,找到对应意图催出票
。对于复杂的句子,可以统计词频,根据频率最高的找到对应的分类意图。
使用这种方式优点是操作方便,用搜索的方式很快找出对应的意图。但缺点也很明显,比如 这个订单还没出票,没出票不要了
,意图是退票,很明显提取出来的是错误。准确率很难做到较高。
所以此种方式一般作为机器学习意图槽位数据提取。
基于模板的匹配
查询非常符合规则的类别,通过规则解析的方式来获取查询的意图。
帮我预订明天的苏州到北京的机票,可以使用规则模板,进行如下提取
[苏州]到[北京][明天][机票]。
这种方使用需要借助命名实体提取,词性标准,语义分析才能完成,对于规则性比较强的咨询有较好的准确率。但此种方式对于研发和训练师需要做大量的工作,较难进行扩展。
基于机器学习
逻辑回归
意图识别在机器学习中的分类问题,也就是使用逻辑回归进行分类。
在使用逻辑回归之前,首先要对词语进行分词,向量化。 分词可以比较各个分词的效果,最常用是jieba
分词。支持配置专业名词及停用词。
分词完成后,需要将词与进行向量化。
一般有2种方式,一种是使用One-Hot编码,这种方式一般针对专业性比较强的领域使用,另一种是word2vec,这种编码方式可以很好的标识词之间的关系。
one-hot编码一半般将所有词行列进行排列,相同的地方记做1,比如分词完成后,按照词频排序结果如下:
- | 订单 | 出票 | 取消 |
---|---|---|---|
订单 | 1 | 0 | 0 |
出票 | 0 | 1 | 0 |
取消 | 0 | 0 | 1 |
那么[订单,出票,取消]得到的词向量为[[1,0,0],[0,1,0],[0,0,1]]
假如一个句子是这个订单还没出票,没出票不要了
,订单出现一次,出票出现2次,这个句子最终的向量为
\]
使用word2vec得到的结果类似。
针对意图识别,一般是多类分类。但多分类问题是从二分类问题进行扩展。
二元分类
对于二分问题,在对于未知概率分布条件下,一般假设为正态分布(高斯分布),多维高斯分布如下,也是多个高斯分布相乘得到的结果。
\]
带入贝叶斯公式,最终得到是关于w,b的函数,也是sigmoid
函数。
=\frac{1}{1+e^{-z}}=\frac{1}{1+e^{-(b+\sum\limits_k w_k x_k)}}=f(w,b)=\sigma(z)
\]
对于数据量较少的分类,可以使用生成模型(Generative Model),计算\(P(C_1),P(C_2)\)和各个分类样本数据的均值 \(u\) 和共用协方差矩阵\(\Sigma\),即可得到w,b,对于任意输入x
\]
代表数据分类属于\(C_1\),否则属于\(C_2\)。由于是二元分类,不必单独计算\(P(C_2|x)\)。
但针对数据量较多的情况,一般使用判别模型(Discriminative Model),
针对二分类问题,根据最大拟然估算,Loss函数为
\]
所有就是要找到\(w,b\),使得
\]
为了计算方便,将公式取对数
-ln(L(w,b))=-ln(f_{w,b}(x_1))-ln(f_{w,b}(x_2))-....-ln(f_{w,b}(x_n)
\]
由于C1和C2的概率表达式不统一,上面的式子无法写成统一的形式,为了统一格式,这里将所有Training data都打上0和1的标签, y = 1代表 \(C_1\), y= 0代表\(C_2\),于是上式进一步改写成:
-[y_2*ln(f_{w,b}(x_2)) - (1-y^2)*ln(1-f_{w,b}(x_2)]
-....\\
= \sum_{n=0}^m-[y^nlnf_{w,b}(x_n)-(1-y)^nln(1-f_{w,b}(x_n))]
\]
这个形式其实就是两个分布的交叉熵
\]
表示个概率分布有多接近。
下面就是对这个loss函数使用梯度下降求解最小值,对w,b微分最终得到每次更新的梯度,
b_i = b_{i-1} - \eta \sum_{n}-(y_n-f_{w,b}(x_n)) \\
\]
最终得到w,b,带入sigmoid
函数即可得到结果。
另外,一般情况下判别模型比生成模型要高。
以上二元分类的情况,对于多元分类问题,其原理的推导过程与二元分类基本一致。
多分类
假设我们用的是高斯分布,共用协方差矩阵,经过一般推导,也就是各种变换后,可以得到一个softmax函数。
假设有三个分类:\(C_1,C_2,C_3\),每一个\(C_i\)都有自己的\(w_i\)和\(b_i\),\(w_1,w_2,w_3\)分布代表三个向量,\(b_1,b_2,b_3\)分别代表三个常量,输入 x也是一个向量。
用softmax
进行输出正则化。softmax
计算方式如下:
sum = \sum_{j=1}^3 e^{z_j} \\
y^1 = \frac {e^{z_1}}{sum} 、y^2 = \frac {e^{z_2}}{sum} 、y^3 = \frac {e^{z_3}}{sum}
\]
z可以是任何值,但是做完softmax之后,输出 的值一定是介于0~1之间,并且它们的和一定是1。
多分类任务中输出的是目标属于每个类别的概率,所有类别概率的和为1,其中概率最大的类别就是目标所属的分类。
即二分类使用sigmoid
函数输出得到结果,而多分类使用softmax得到结果。
如下图所示,input x经过三个式子分别生成,经过softmax转化成output ,它们分别是这三个 分类的概率,由于sum=1,因此做完softmax之后就可以把y的分布当做是一个概率分布。
我们在训练的时候还需要有一个输出,因为是三个分类,输出是三维的,对应的输出也是三维的,为了满足交叉熵的条件,输出也必须是概率分布,这里我们不能使用1,2,3作为分类的区分,为了保证所有分类之间的关系是一样的,这里使用类似于one-hot编码的方式。
和二元分类求解一样,利用交叉熵,最终通过微分得到最优\(w_1,w_2,w_3\),\(b_1,b_2,b_3\)。
神经网络
对于输入参数比较复杂,比如对于word2vec,输入的可能是一个100*100的矩阵,这个时候就需要对数据进行处理。或者输入的特征无法在数据源上进行数据处理。这个时候就需要在逻辑回归之前再接上一个逻辑回归,对数据源做处理。
多个逻辑回归就构成了一个类神经网络,也就是深度学习,如(CNN,LTSM)。
对于分类问题,深度学习的最后输出函数也就是sigmoid
或者softmax
函数。
对话管理
通过上一次的语义抽取和意图识别,对话会进入后续对话树模块。
根据前一模块抽取数据和用户本身数据,将数据填充到对话树的对应部分,对话数节点也可以根据条件拉取其他数据,最终这些数据最终都会在当前会话中保存。
可以根据用户问题,如果条件满足,通过NLG模块生成对应话术返回。
最终一次用户会话的完整的流程
graph LR
A[用户提问]-->B[语义分析&实体抽取]
B--> C[意图识别]
C-->D[对话树数据填充]
D-->E[NL生成]
E-->F[数据处理]
F-->G[答案返回]
总结
上面是自己在机器学习中的一些总结,欢迎大家多多交流。
浅谈意图识别各种实现&数学原理的更多相关文章
- 浅谈Eclipse调用Tomcat服务的原理
浅谈Eclipse调用Tomcat服务的原理 转:http://www.thinksaas.cn/group/topic/341645/ 转:http://www.173it.cn/Html/?581 ...
- 浅谈人脸识别中的loss 损失函数
浅谈人脸识别中的loss 损失函数 2019-04-17 17:57:33 liguiyuan112 阅读数 641更多 分类专栏: AI 人脸识别 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- 浅谈history对象以及路由插件原理
简介 History对象最初设计用来表示窗口的浏览历史,但是,出于隐私方面的原因,History对象不再允许脚本访问已经访问过的实际URL.虽然,我们不清楚历史URL,但是,我们可以通过History ...
- 浅谈卡特兰数(Catalan number)的原理和相关应用
一.卡特兰数(Catalan number) 1.定义 组合数学中一个常出现在各种计数问题中出现的数列(用c表示).以比利时的数学家欧仁·查理·卡特兰的名字来命名: 2.计算公式 (1)递推公式 c[ ...
- 浅谈 Vue v-model指令的实现原理 - 如何利用v-model设计自定义的表单组件
原文请点击此链接 链接1 http://www.7zhang.com/index/cms/read/id/234515.html 链接2 http://blog.csdn.net/yangbing ...
- Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...
- 浅谈JavaScript的面向对象和它的封装、继承、多态
写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- TODO:浅谈pm2基本工作原理
TODO:浅谈pm2基本工作原理 要谈Node.js pm2的工作原理,需要先来了解撒旦(Satan)和上帝(God)的关系. 撒旦(Satan),主要指<圣经>中的堕天使(也称堕天使撒旦 ...
随机推荐
- Vue & Sentry & ErrorHandler
Vue & Sentry & ErrorHandler import * as Sentry from '@sentry/browser'; import { Vue as VueIn ...
- sass文件编译(.scss->.css),使用ruby环境,在windows10,koala工具,Error: Invalid GBK character "\xE5"
1 注意事项: 问题描述: 请确保 Encoding.default_external = Encoding.find('utf-8') 是uft-8 编码! sass文件编译时候使用ruby环境,在 ...
- CSS multi colors circle
CSS multi colors circle <!DOCTYPE html> <html lang="zh-Hans"> <head> < ...
- React Hooks in depth
React Hooks in depth React Hooks https://reactjs.org/docs/hooks-rules.html https://www.npmjs.com/pac ...
- 【转】【机器人学:运动规划】OMPL开源运动规划库的安装和demo
https://blog.csdn.net/gpeng832/article/details/73736225
- ECMAScript 等性运算符
判断两个变量是否相等是程序设计中非常重要的运算.在处理原始值时,这种运算相当简单,但涉及对象,任务就稍有点复杂. ECMAScript 提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等 ...
- spring-ioc心得
1.创建spring容器,严格的来说就是创建ClassPathXmlApplicationContext对象, 该对象属于ApplicationContext类型(是一个接口)该接口下有很多实现类, ...
- ElementUI使用总结
首先声明,我这总结的官网都有,只是将自己使用时遇到的问题,重新记录一下,官网地址:https://element.eleme.cn/ 1.表格内指定行数给定不同样式(类似于隔行变色,也能叫指定行数不同 ...
- 为什么我们在定义HashMap的时候,就指定它的初始化大小呢
在当我们对HashMap初始化时没有设置初始化容量,系统会默认创建一个容量为16的大小的集合.当HashMap的容量值超过了临界值(默认16*0.75=12)时,HashMap将会重新扩容到下一个2的 ...
- vue之下拉菜单Dropdown的使用
通过组件slot来设置下拉触发的元素以及需要通过具名slot为dropdown 来设置下拉菜单.默认情况下,下拉按钮只要hover即可,无需点击也会显示下拉菜单. <el-dropdown> ...