• 深度学习【PyTorch中序列化容器、QA机器人、环境准备】


    一 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=x1f(a1)w2f(b1)w3out

    假设使用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<2141214121out=271out

    当权重初始过小或使用易饱和神经元(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 解决梯度消失或者梯度爆炸的经验

    1. 替换易训练神经元

      在这里插入图片描述

    2. **改进梯度优化算法:**使用adam等算法

    3. 使用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) # 最后一层不需要添加激活函数
                 )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在上述内容中,可以直接调用layer(x),得到输出

    x的被执行顺序就是Sequential中定义的顺序:

    1. 被隐层1执行,形状变为[batch_size,n_hidden_1]
    2. 被relu执行,形状不变
    3. 被隐层2执行,形状变为[batch_size,n_hidden_2]
    4. 被relu执行,形状不变
    5. 被最后一层执行,形状变为[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) 
                 )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4. nn.Dropout

    dropout可以理解为对参数的随机失活

    1. 增加模型的稳健性
    2. 可以解决过拟合的问题(增加模型的泛化能力)
    3. 可以理解为训练后的模型是多个模型的组合之后的结果,类似随机森林。
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    二 问答机器人介绍

    1. 目前企业中的常见的聊天机器人

    1. QA BOT(问答机器人):回答问题
      1. 代表 :智能客服、
      2. 比如:提问和回答
    2. TASK BOT (任务机器人):帮助人们做事情
      1. 代表:siri
      2. 比如:设置明天早上9点的闹钟
    3. CHAT BOT(聊天机器人):通用、开放聊天
      1. 代表:微软小冰

    2. 常见的聊天机器人怎么实现的

    2.1 问答机器人的常见实现手段

    1. 信息检索、搜索 (简单,效果一般,对数据问答对的要求高)

      关键词:tfidf、SVM、朴素贝叶斯、RNN、CNN

    2. 知识图谱(相对复杂,效果好,很多论文)

      在图形数据库中存储知识和知识间的关系、把问答转化为查询语句、能够实现推理

    2.2 任务机器人的常见实现思路

    1. 语音转文字
    2. 意图识别、领域识别、文本分类
    3. 槽位填充:比如买机票的机器人,使用命令体识别填充 从{位置}到{位置}的票2个位置的
    4. 回话管理、回话策略
    5. 自然语言生成
    6. 文本转语音

    2.3 闲聊机器人的常见实现思路

    1. 信息检索(简单、能够回答的话术有限)
    2. seq2seq 和变种(答案覆盖率高,但是不能保证答案的通顺等)

    2. 企业中的聊天机器人是如何实现的

    2.1 阿里小蜜-电商智能助理是如何实现的

    参考地址:https://juejin.im/entry/59e96f946fb9a04510499c7f

    2.1.1 主要交互过程

    在这里插入图片描述

    从图可以看出:

    1. 输入:语音转化为文本,进行理解之后根据上下文得到语义的表示
    2. 输出:根据语义的表是和生成方法得到文本,再把文本转化为语音输出
    2.1.2 技术架构

    在这里插入图片描述

    可以看出其流程为:

    1. 判断用户意图
    2. 如果意图为面向目标:可能是问答型或者是任务型
    3. 如果非面向目标:可能是语聊型
    2.1.3 检索模型流程(小蜜还用了其他的模型,这里以此为例)

    在这里插入图片描述

    通过上图可知,小蜜的检索式回答的流程大致为:

    1. 对问题进行处理
    2. 根据问题进行召回,使用了提前准备的结构化的语料和训练的模型
    3. 对召回的结果进行组长和日志记录
    4. 对召回的结果进行相似度计算,情感分析和属性识别
    5. 返回组装的结果

    2.2 58同城智能客服帮帮如何实现的

    参考地址:http://www.6aiq.com/article/1536149308075?p=1&m=0

    2.2.1 58客服体系

    在这里插入图片描述

    58的客服主要用户为公司端和个人端,智能客服主要实现自动回答,如果回答不好会转到人工客服,其中自动回答需要覆盖的问题包括:业务咨询、投诉建议等

    2.2.2 58智能客服整体架构

    在这里插入图片描述

    整体来看,58的客服架构分为三个部分

    1. 基础服务,实现基础的NLP的功能和意图识别
    2. 应用对话部分实现不同意图的模型,同时包括编辑运营等内容
    3. 提供对外的接口
    2.2.3 业务咨询服务流程
    大致流程

    在这里插入图片描述

    KB-bot的流程大致为:

    1. 对问题进行基础处理
    2. 对答案通过tfidf等方法进行召回
    3. 对答案通过规则、深度神经网络等方法进行重排序
    4. 返回答案排序列表
    使用融合的模型

    在这里插入图片描述

    在问答模型的深度网络模型中使用了多套模型进行融合来获取结果

    1. 在模型层应用了 FastText、TextCNN 和 Bi-LSTM 等模型
    2. 在特征层尝试使用了单字、词、词性、词语属性等多种特征

    通过以上两个模型来组合获取相似的问题,返回相似问题ID对应的答案

    2.2.4 58的闲聊机器人

    58同城的闲聊机器人使用三种方法包括:

    1. 基于模板匹配的方法
    2. 基于搜索的方式获取(上上图)
    3. 使用seq2seq的神经网络来实现
    2.2.5 解决不了转人工服务

    ​ 智能客服解决不了的可以使用人工客服来实现

    三 需求分析和流程介绍

    1. 需求分析

    实现聊天机器人,起到智能客服的效果,能够为使用app的用户解决基础的问题,而不用额外的人力。

    但是由于语料的限制,所以这里使用了编程相关的问题,能够回答类似:python是什么python有什么优势等问题

    2. 实现流程

    2.1 整体架构

    在这里插入图片描述

    整个流程的描述如下:

    1. 接受用户的问题之后,对问题进行基础的处理
    2. 对处理后的问题进行分类,判断其意图
    3. 如果用户希望闲聊,那么调用闲聊模型返回结果
    4. 如果用户希望咨询问题,那么调用问答模型返回结果
    2.2 闲聊模型

    闲聊模型使用了seq2seq模型实现

    包含:

    1. 对数据的embedding
    2. 编码层
    3. attention机制的处理
    4. 解码层

    在这里插入图片描述

    2.4 问答模型

    问答模型使用了召回和排序的机制来实现,保证获取的速度的同时保证了准确率

    1. 问题分析:对问题进行基础的处理,包括分词,词性的获取,词向量的获取
    2. 问题的召回:通过机器学习的方法进行海选,海选出大致满足要求的相似问题的前K个
    3. 问题的排序:通过深度学习的模型对问题计算准确率,进行排序
    4. 设置阈值,返回结果
      在这里插入图片描述

    四 环境准备

    1. Anaconda环境准备

    1. 下载地址:https://mirror.tuna.tsinghua.edu.cn/help/anaconda/
    2. 下载对应电脑版本软件,安装
      1. windows :双击exe文件
      2. unix:给sh文件添加可执行权限,执行sh文件
    3. 添加到环境变量
      1. windows安装过程中勾选
      2. unix:export PATH="/root/miniconda3/bin:$PATH"
    4. 创建虚拟环境
      1. conda create -n 名字 python=3.6(版本)
      2. 查看所有虚拟环境: conda env list
    5. 切换到虚拟环境
      1. conda activate 名字
    6. 退出虚拟环境
      1. conda deactivate 名字

    2. fasttext安装

    文档地址:https://fasttext.cc/docs/en/support.html

    github地址:

    安装步骤:

    1. 下载 git clone https://github.com/facebookresearch/fastText.git
    2. cd cd fastText
    3. 安装 python setup.py install

    3. pysparnn安装

    文档地址:https://github.com/facebookresearch/pysparnn

    安装步骤:

    1. 下载:git clone https://github.com/facebookresearch/pysparnn.git
    2. 安装:python setupy.py install
  • 相关阅读:
    可解释机器学习:SHAP 值
    Java“牵手”义乌购商品列表页数据采集+义乌购商品价格数据排序,义乌购API接口申请指南
    HTML静态网页成品作业(HTML+CSS)——花主题介绍网页设计制作(1个页面)
    ACMUG活动回顾 | MySQL创始人见面会&技术分享会圆满结束
    扰动算法(哈希函数)
    【算法】蓝桥杯全攻略:从语言基础到数学算法,一站式解锁竞赛技巧
    如何使用html、css制作一个期末作业网站【羽毛球体育运动主题html网页设计】
    【Linux】常用工具的使用
    什么是零日攻击?
    【算法】欧拉筛 输出任意范围内的质数
  • 原文地址:https://blog.csdn.net/weixin_43923463/article/details/126492806