![](https://i-blog.csdnimg.cn/blog_migrate/2a3609c0c321caf591c806a5c3c47f20.jpeg)
本篇介绍了序列-序列机制和张量流的基本概念,基于中文语料库说明基于循环神经网络的语言翻译的实战应用。
01
序列-序列机制
序列-序列机制概述
序列-序列(Sequence To Sequence,Seq2Seq)是一个编码器-解码器 (Encoder-Decoder Mechanism)结构的神经网络,输入是序列(Sequence),输出也是序列(Sequence)。编码器(Encoder)将可变长度的序列转变为固定长度的向量表达,而解码器(Decoder)则将这个固定长度的向量转换为可变长度的目标信号序列,如图10-1所示,图中EOS是序列的结束标识符。
![](https://i-blog.csdnimg.cn/blog_migrate/0eef21d34a4745cddb38d1f1ad5416b5.png)
■ 图10-1序列-序列机制
序列-序列的基本模型包含三个部分,即编码器、解码器以及连接两者的中间状态向量语义编码(C)。编码器通过学习输入,将其编码成固定大小的状态向量,继而将语义编码传给解码器,解码器再通过对状态向量语义编码的学习输出对应的序列。
图10-2表示了序列-序列模型的基本工作流程。
![](https://i-blog.csdnimg.cn/blog_migrate/46ee52fd1b5de1e73b2b82c8a91a0527.png)
■ 图10-2序列-序列模型
注意力机制
注意力机制(Attention Mechanism)与编码器-解码器模型的区别在于不再要求编码器将所有输入信息都编码成固定长度的向量,而是编码成向量的序列,如图10-3所示,解码时选择性地从序列Ci(i=1,2,…,n)中选取子集进行处理。
![](https://i-blog.csdnimg.cn/blog_migrate/c7fc2210662264341245b9b8eaff2405.png)
■ 图10-3注意力机制
02
集束搜索概述
集束搜索(Beam Search)是一种基于序列-序列的搜索算法,通常用在解空间比较大的情况下,为了减少搜索所占用的空间和时间,在每一步深度扩展的时候,裁剪掉部分质量比较差的结点,保留下质量较高的结点,这样就减少了空间消耗,并提高了时间效率,其缺点是潜在的最佳方案有可能被丢弃。
集束搜索一般用于解析空间较大的系统,常用的场景如机器翻译和语音识别等,当系统的数据集比较大,计算资源受限,而且没有唯一最优解时,该算法能够较快地找到接近最正确的解。集束搜索的超参数束宽(Beam Size),假定其值为i。计算的基本步骤是:第一个时间步长选取当前条件概率最大的i个词,视为候选输出序列的第一个词,之后各时序步长基于上步长的输出序列筛选出所有组合中条件概率最大的i个结果,作为该时序下的候选输出序列,这样始终保持i个结果,最后从i中求解最优值。
03
智能客服开发流程
智能聊天客服程序开发过程中,首先需要明确需求,确定客服程序需要满足的主要功能。
智能客服的主要功能
智能客服系统的主要功能根据应用场景不同而变化,通常包括会话管理、任务管理、模型管理和权限管理等功能。
● 会话管理: 包含会话分类、问题查询以及问题更新等功能。
● 任务管理: 包括任务配置、任务更新、模型配置等。
● 模型管理: 包括模型更新、数据更新以及访问接口等。
● 权限管理: 包括权限控制、角色匹配以及业务对接等。
智能客服设计
客服程序设计中最重要的是自然语言理解问题,主要涉及实体识别、意图识别、情感识别、指代消解、省略恢复和拒绝判断等处理。实体识别即命名实体识别,主要涉及人名、地名和专有名词。意图识别主要包括显式意图识别和隐式意图识别,显式意图一般通过用户的输入信息明确表达,而隐式意图因为其含义潜藏在字面表述之外,因此通常判断比较困难。情感识别同样存在这个问题。指代消解和省略恢复是指在前文已经表述的前提下,后文提到同一个事物时使用指代词来表述,因此客服程序需要根据上下文进行正确指代匹配。拒绝判断是涉及服务超限时程序可以自动识别问题。
04
张量流商务智能实战
下面介绍基于张量流的序列-序列框架的中英翻译实例,该应用可以部署在有语言翻译场景的智能客服中。假定用户输入源语言文本(如中文),智能客服应用基于用户输入自动输出近似语义的目标语言文本(如英文)。本实例使用循环神经网络方法。本节首先介绍涉及的张量流相关基础知识,然后说明序列-序列的实现概要。
张量流概念简介
1. 张量
张量流(TensorFlow)的中文含义是张量和流(Tensor Flow),张量(Tensor)是张量流中基础但又重要的概念。张量是具有统一数据类型的数组,可以是一维、二维或者多维。张量可以来源自输入数据或计算结果,具有三种属性:名称、维度和数据类型。在张量流中,张量是维度特征向量(即数组,Array)的集合。例如,如果有一个2行4列的矩阵,表示为:
![](https://i-blog.csdnimg.cn/blog_migrate/010a9c66163087dcc753f5c70f4edcf9.png)
在张量流中以行特征向量为基准,表达式更新为:
![](https://i-blog.csdnimg.cn/blog_migrate/f8e446e2bd89225d20215fb0d7c614d4.png)
2. 张量基本操作
张量的常用基本操作包括四种:Variable、constant、placeholder和sparseTensor,下面给出其在TensorFlow Core V2.6.0 API中的各自定义。使用张量流前一般需要先使用命令pip install tensorflow安装库文件,然后使用import tensorflow导入张量流的库文件。
1) constant()
constant()函数可以从给定对象中创建张量,其语法定义为:
constant(value, dtype, shape, name)
主要参数说明如下。
value:张量值。
dtype:张量值的数据类型,可以指定string、float32、float64、int16和int32等类型。
shape:张量维度;二维情况下代表矩阵,即行和列信息。
name:张量名字。
【实例10-1】如果张量值是数值,则称为标量,比如基于给定值200生成张量,输入命令如下,其中,>>> 代表命令输入提示符。
输入命令:
>>> import tensorflow as tf>>> Scalar=tf.constant(200, tf.int32,0)>>> print(Scalar)
输出结果:
>>> tf.Tensor([], shape=(0,), dtype=int32)
【实例10-2】基于给定列表生成向量。
输入命令为:
>>> import tensorflow as tf>>> Scalar=tf.constant([10, 20, 30, 40, 50], dtype=tf.int64)>>> print(Scalar)
输出结果为:
>>> tf.Tensor([1020304050], shape=(5,), dtype=int64)
如果没有指定向量维度信息,则张量流默认按照行向量优先处理。
【实例10-3】基于列表生成指定维度张量。
输入命令为:
>>> Scalar=tf.constant([10, 20, 30, 40, 50], dtype=tf.int64,shape=(1,5))>>> print(Scalar)
输出结果为:
>>> tf.Tensor([[1020304050]], shape=(1, 5), dtype=int64)
在指定向量具体维度的前提下,张量流按照预先指定的维度信息生成向量。
【实例10-4】生成三行四列矩阵张量。
输入命令为:
>>> array=tf.constant(0, shape=(3, 4))>>&