本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一 Pytorch中的序列化容器
1. 梯度消失和梯度爆炸
在使用pytorch中的序列化容器之前,先来了解一下常见的梯度消失和梯度爆炸的问题
1.1 梯度消失
假设有四层极简神经网络:每层只有一个神经元
获取 w 1 的梯度有:▽ w 1 = x 1 ∗ f ( a 1 ) ’ ∗ w 2 ∗ f ( b 1 ) ’ ∗ w 3 ∗ ▽ o u t 获取w1的梯度有:▽w1 = x1*f(a1)’*w2*f(b1)’*w3*▽out 获取w1的梯度有:▽w1=x1∗f(a1)’∗w2∗f(b1)’∗w3∗▽out
假设使用sigmoid激活函数,即f为sigmoid函数,sigmoid的导数如下图
假设每层都取得sigmoid导函数的最大值1/4,那么在反向传播时, X 1 = 0.5 , w 1 = w 2 = w 3 = 0.5 X1=0.5,w1=w2=w3=0.5 X1=0.5,w1=w2=w3=0.5
∇ w 1 < 1 2 ∗ 1 4 ∗ 1 2 ∗ 1 4 ∗ 1 2 ∗ ∇ o u t = 1 2 7 ∇ o u t \nabla w1< \frac{1}{2} * \frac{1}{4}* \frac{1}{2}* \frac{1}{4}*\frac{1}{2}*\nabla out = \frac{1}{2^7} \nabla out ∇w1<21∗41∗21∗41∗21∗∇out=271∇out
当权重初始过小或使用易饱和神经元(sigmoid,tanh,) sigmoid在y=0,1处梯度接近0,而无法更新参数
,神经网络在反向传播时也会呈现指数倍缩小,产生“消失”现象。
1.2 梯度爆炸
假设 X 2 = 2 , w 1 = w 2 = w 3 = 2 X2=2,w1=w2=w3=2 X2=2,w1=w2=w3=2
$\nabla w1 = f’{a}2f‘{a}*x2\nabla out = 23f’(a)2 \nabla out $
当权重初始过大时,梯度神经网络在反向传播时也会呈现指数倍放大,产生“爆炸”现象。
1.3 解决梯度消失或者梯度爆炸的经验
-
替换易训练神经元
-
**改进梯度优化算法:**使用adam等算法
-
使用batch normalization
2. nn.Sequential
nn.Sequential
是一个有序的容器,其中传入的是构造器类(各种用来处理input的类),最终input会被Sequential中的构造器类依次执行
例如:
layer = nn.Sequential(
nn.Linear(input_dim, n_hidden_1),
nn.ReLU(True), #inplace=False 是否对输入进行就地修改,默认为False
nn.Linear(n_hidden_1, n_hidden_2),
nn.ReLU(True),
nn.Linear(n_hidden_2, output_dim) # 最后一层不需要添加激活函数
)
在上述内容中,可以直接调用layer(x),得到输出
x的被执行顺序就是Sequential中定义的顺序:
- 被隐层1执行,形状变为[batch_size,n_hidden_1]
- 被relu执行,形状不变
- 被隐层2执行,形状变为[batch_size,n_hidden_2]
- 被relu执行,形状不变
- 被最后一层执行,形状变为[batch_size,output_dim]
2. nn.BatchNorm1d
batch normalization
翻译成中文就是批规范化,即在每个batch训练的过程中,对参数进行归一化的处理,从而达到加快训练速度的效果。
以sigmoid激活函数为例,反向传播的过程中,在值为0,1的时候,梯度接近0,导致参数被更新的幅度很小,训练速度慢。但是如果对数据进行归一化之后,就会尽可能的把数据规范到[0-1]的范围,从而让参数更新的幅度变大,提高训练的速度。
batchNorm一般会放到激活函数之后,即对输入进行激活处理之后再进入batchNorm
layer = nn.Sequential(
nn.Linear(input_dim, n_hidden_1),
nn.ReLU(True),
nn.BatchNorm1d(n_hidden_1)
nn.Linear(n_hidden_1, n_hidden_2),
nn.ReLU(True),
nn.BatchNorm1d(n_hidden_2)
nn.Linear(n_hidden_2, output_dim)
)
4. nn.Dropout
dropout可以理解为对参数的随机失活
- 增加模型的稳健性
- 可以解决过拟合的问题(增加模型的泛化能力)
- 可以理解为训练后的模型是多个模型的组合之后的结果,类似随机森林。
layer = nn.Sequential(
nn.Linear(input_dim, n_hidden_1),
nn.ReLU(True),
nn.BatchNorm1d(n_hidden_1)
nn.Dropout(0.3) #0.3 为dropout的比例,默认值为0.5
nn.Linear(n_hidden_1, n_hidden_2),
nn.ReLU(True),
nn.BatchNorm1d(n_hidden_2)
nn.Dropout(0.3)
nn.Linear(n_hidden_2, output_dim)
)
二 问答机器人介绍
1. 目前企业中的常见的聊天机器人
-
QA BOT(问答机器人):回答问题
- 代表 :智能客服、
- 比如:提问和回答
-
TASK BOT (任务机器人):帮助人们做事情
- 代表:siri
- 比如:设置明天早上9点的闹钟
-
CHAT BOT(聊天机器人):通用、开放聊天
- 代表:微软小冰
2. 常见的聊天机器人怎么实现的
2.1 问答机器人的常见实现手段
-
信息检索、搜索 (简单,效果一般,对数据问答对的要求高)
关键词:tfidf、SVM、朴素贝叶斯、RNN、CNN
-
知识图谱(相对复杂,效果好,很多论文)
在图形数据库中存储知识和知识间的关系、把问答转化为查询语句、能够实现推理
2.2 任务机器人的常见实现思路
- 语音转文字
- 意图识别、领域识别、文本分类
- 槽位填充:比如买机票的机器人,使用命令体识别填充
从{位置}到{位置}的票
2个位置的 - 回话管理、回话策略
- 自然语言生成
- 文本转语音
2.3 闲聊机器人的常见实现思路
- 信息检索(简单、能够回答的话术有限)
- seq2seq 和变种(答案覆盖率高,但是不能保证答案的通顺等)
2. 企业中的聊天机器人是如何实现的
2.1 阿里小蜜-电商智能助理是如何实现的
参考地址:https://juejin.im/entry/59e96f946fb9a04510499c7f
2.1.1 主要交互过程
从图可以看出:
- 输入:语音转化为文本,进行理解之后根据上下文得到语义的表示
- 输出:根据语义的表是和生成方法得到文本,再把文本转化为语音输出
2.1.2 技术架构
可以看出其流程为:
- 判断用户意图
- 如果意图为面向目标:可能是问答型或者是任务型
- 如果非面向目标:可能是语聊型
2.1.3 检索模型流程(小蜜还用了其他的模型,这里以此为例)
通过上图可知,小蜜的检索式回答的流程大致为:
- 对问题进行处理
- 根据问题进行召回,使用了提前准备的结构化的语料和训练的模型
- 对召回的结果进行组长和日志记录
- 对召回的结果进行相似度计算,情感分析和属性识别
- 返回组装的结果
2.2 58同城智能客服帮帮如何实现的
参考地址:http://www.6aiq.com/article/1536149308075?p=1&m=0
2.2.1 58客服体系
58的客服主要用户为公司端和个人端,智能客服主要实现自动回答,如果回答不好会转到人工客服,其中自动回答需要覆盖的问题包括:业务咨询、投诉建议等
2.2.2 58智能客服整体架构
整体来看,58的客服架构分为三个部分
- 基础服务,实现基础的NLP的功能和意图识别
- 应用对话部分实现不同意图的模型,同时包括编辑运营等内容
- 提供对外的接口
2.2.3 业务咨询服务流程
大致流程
KB-bot的流程大致为:
- 对问题进行基础处理
- 对答案通过tfidf等方法进行召回
- 对答案通过规则、深度神经网络等方法进行重排序
- 返回答案排序列表
使用融合的模型
在问答模型的深度网络模型中使用了多套模型进行融合来获取结果
- 在模型层应用了 FastText、TextCNN 和 Bi-LSTM 等模型
- 在特征层尝试使用了单字、词、词性、词语属性等多种特征
通过以上两个模型来组合获取相似的问题,返回相似问题ID对应的答案
2.2.4 58的闲聊机器人
58同城的闲聊机器人使用三种方法包括:
- 基于模板匹配的方法
- 基于搜索的方式获取(上上图)
- 使用seq2seq的神经网络来实现
2.2.5 解决不了转人工服务
智能客服解决不了的可以使用人工客服来实现
三 需求分析和流程介绍
1. 需求分析
实现聊天机器人,起到智能客服
的效果,能够为使用app的用户解决基础的问题,而不用额外的人力。
但是由于语料的限制,所以这里使用了编程相关的问题,能够回答类似:python是什么
,python有什么优势
等问题
2. 实现流程
2.1 整体架构
整个流程的描述如下:
- 接受用户的问题之后,对问题进行基础的处理
- 对处理后的问题进行分类,判断其意图
- 如果用户希望闲聊,那么调用闲聊模型返回结果
- 如果用户希望咨询问题,那么调用问答模型返回结果
2.2 闲聊模型
闲聊模型使用了seq2seq模型实现
包含:
- 对数据的embedding
- 编码层
- attention机制的处理
- 解码层
2.4 问答模型
问答模型使用了召回和排序的机制来实现,保证获取的速度的同时保证了准确率
- 问题分析:对问题进行基础的处理,包括分词,词性的获取,词向量的获取
- 问题的召回:通过机器学习的方法进行海选,海选出大致满足要求的相似问题的前K个
- 问题的排序:通过深度学习的模型对问题计算准确率,进行排序
- 设置阈值,返回结果
四 环境准备
1. Anaconda环境准备
-
下载地址:
https://mirror.tuna.tsinghua.edu.cn/help/anaconda/
-
下载对应电脑版本软件,安装
- windows :双击exe文件
- unix:给sh文件添加可执行权限,执行sh文件
-
添加到环境变量
- windows安装过程中勾选
- unix:
export PATH="/root/miniconda3/bin:$PATH"
-
创建虚拟环境
conda create -n 名字 python=3.6(版本)
- 查看所有虚拟环境:
conda env list
-
切换到虚拟环境
conda activate 名字
-
退出虚拟环境
conda deactivate 名字
2. fasttext安装
文档地址:https://fasttext.cc/docs/en/support.html
github地址:<https://github.com/facebookresearch/fastText
安装步骤:
- 下载
git clone https://github.com/facebookresearch/fastText.git
- cd
cd fastText
- 安装
python setup.py install
3. pysparnn安装
文档地址:https://github.com/facebookresearch/pysparnn
安装步骤:
- 下载:
git clone https://github.com/facebookresearch/pysparnn.git
- 安装:
python setupy.py install