Transformer应用之构建聊天机器人(一)

news2024/11/17 3:52:16

一、概述

聊天机器人的基本功能是系统根据用户当前的输入语句,生成相应的语句并输出给用户,用户和聊天机器人之间的一问一答构成了一个utterance,多个utterance就构成了一段对话。目前流行的聊天机器人都是基于Transformer的架构来做的,在这之前也有使用RNN网络来构建聊天机器人的例子,譬如PyTorch框架提供给我们的“Chatbot Tutorial”(Chatbot Tutorial — PyTorch Tutorials 2.0.0+cu117 documentation)。本文使用前面用于语言翻译的Transformer模型来构建一个简单的聊天机器人,并与“Chatbot Tutorial”示例提供的基于RNN的GRU模型构建的聊天机器人进行对比测试,基于Transformer构建的聊天机器人同样使用“Chatbot Tutorial”示例中提到的语料进行训练。

二、训练数据准备

首先从PyTorch提供的chatbot turorial中下载训练语料“Cornell Movie-Dialogs Corpus.”,这是一个基于电影对话的语料,处理后包括以下文件:

原始的对话数据文件是utterances.jsonl,以下是内容示例,一个utterance包含一问一答:

首先需要对这些原始对话数据进行格式化处理:

每一行代表一个utterance,以”\t”作为分隔符,前半部分可以看成是用户输入的语句,后半部分看成是聊天机器人的输出语句。从这个语料库格式化处理后得到的可用于训练的utterances总共有22万左右,这里抽取其中的少量数据作为测试集,剩下的大部分数据都作为训练集来使用。

接下来需要构建词典,如果都是英文对话,使用一个词典就可以了:

       如果按照one hot编码的方式把训练集中所有语句的单词都拿出来构建词典,会造成词典过于庞大而影响性能,所以这里采用按照数据集中的词汇出现频率进行统计,只在词典中保留必要的词汇,另外为了防止预测时给出的词汇是词典中不存在的,需要添加UNK(unkown)标记,另外也需要加入PAD对不够长度的句子进行补齐:

加载数据时对于英文语句的单词切分使用了工具包nltk.tokenize:

三、模型构建

对于基于Transformer的这个聊天机器人,使用的还是前面博文提到的用于语言翻译的这个Transformer模型,只是使用了上面提到的基于电影对话的语料来训练模型,以下是这个模型的超参配置:

对于PyTorch框架提供的聊天机器人示例,使用的是基于RNN的GRU的Seq2Seq的模型,以下是这个模型的超参配置,这里的注意力计算方法为“dot”,另外注意这里的输入语句最大长度被限制在了10,GRU是基于RNN的变体,对于长句的处理能力有限:

在基于GRU构建的聊天机器人这个示例中,使用了注意力机制,相当于GRU模型的一个外挂,这个注意力机制与Transformer使用的注意力机制是有区别的,以下是关于这个称之为“Luong attention”的注意力机制的架构图:

在这个RNN的decoder部分,我们可以看到decoder是如何在每一步预测下一个单词时进行注意力计算的:

  • 通过一个单向的GRU模型获取单步的output及hidden
  • 把这个output与encoder的所有outputs(也就是输入语句经过encoder处理后得到的outputs)进行点积计算
  • 点积计算结果进行矩阵转置处理,然后调用softmax函数转换为0到1之间的概率,即注意力权重
  • 把上面得到的注意力权重通过方法bmm再次与encoder的outputs进行批量矩阵相乘,得到的结果称为“加权和”的context向量
  • 把这个context与上面decoder单步计算得到的output进行拼接(cat函数),得到基于context的input
  • 把这个基于context的input传入tanh函数得到一个output,基于它调用softmax来预测下一个单词

以下是decoder的forward关于使用注意力来预测单词的逻辑代码:

以下是这个RNN中使用到的注意力机制的计算逻辑代码,:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FT2000+ openEuler 20.03 LTS SP3 yum install qemu手动创建虚拟机 图形界面安装openEuler 20.03系统

安装qemu yum install qemu -y 安装系统 创建虚拟硬盘 /usr/bin/qemu-img create -f qcow2 openEuler.qcow2 20g 挂载iso启动 /usr/bin/qemu-kvm -machine virt,accelkvm,usbon -cpu host -m 32G -smp 8,sockets1,cores8,threads1 -boot d -hda /home/yeqiang/qemu-virt…

python字符串模糊匹配,并计算匹配分数

一、thefuzz thefuzz包以前叫fuzzywuzzy,0.19版本开始改名为thefuzz,github地址: GitHub - seatgeek/thefuzz: Fuzzy String Matching in Python 可以通过命令pip install thefuzz安装此包。用法还是比较简单的: from thefuzz import fuz…

redis_exporter 结合prometheus 监控redis cluster集群

redis_exporter 结合prometheus 监控redis cluster集群 前提1:已经搭建好redis cluster集群前提2:已搭建好prometheus 1、下载redis_exporter wget https://github.com/oliver006/redis_exporter/releases/download/v1.50.0/redis_exporter-v1.50.0.l…

WebServer项目(三)->linux网络编程基础知识

WebServer项目[三]->linux网络编程基础知识 1. I/O多路复用(I/O多路转接)2. select1)select简介2)select详解select具体怎么用?那FD_CLR函数是干嘛的?关于 fd_set,它具体是什么? 3. poll(改进select)4. epoll5.epoll的两种工作模式6.UDP通…

qemu-img resize gpt分区 parted修复分区信息 虚拟机 lvm 扩容根分区

扩容qcow2虚拟盘 关闭虚拟机 virsh destroy redflag1 qemu-img resize从20G扩容至40G qemu-img resize redflag.qcow2 40G 启动 virsh start redflag1 查看状态,当前无任何变化 fdisk 查看vda,已经变大 查看lvm信息 xfs_info 扩容虚拟机根分区 修…

KD2684S电机匝间耐电压测试仪

一、产品简介 试验仪适用于电机、变压器、电器线圈等这些由漆包线绕制的产品。因漆包线的绝缘涂敷层本身存在着质量问题,以及在绕线、嵌线、刮线、接头端部整形、绝缘浸漆、装配等工序工艺中不慎而引起绝缘层的损伤等,都会造成线圈层间或匝间绝缘层的绝缘…

BGP的路径属性及选路规则

路径属性 路径属性对于BGP而言,BGP路径属性描述了该条路由的各项特征,同时,路由携带的路径属性也在某些场景下影响BGP路由优选的决策。 公认属性-----所有的BGP路由器均可以识别的属性 强制属性-----指当BGP路由器使用update报文通报路由更新…

机器学习实战:Python基于DT决策树模型进行分类预测(六)

文章目录 1 前言1.1 决策树的介绍1.2 决策树的应用 2 Scikit-learn数据集演示2.1 导入函数2.2 导入数据2.3 建模2.4 评估模型2.5 可视化决策树2.6 优化模型2.7 可视化优化模型 3 讨论 1 前言 1.1 决策树的介绍 决策树(Decision Tree,DT)是一…

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…

【springboot】缓存之@Cacheable、@CachePut、@CacheEvict的用法

目录 一、注解参数说明1.1 属性说明1.1.1 value/cacheNames 属性1.1.2 key属性1.1.3 keyGenerator属性1.1.4 cacheManager属性1.1.5 cacheResolver属性1.1.6 condition属性1.1.7 unless 属性1.1.8 sync 属性 1.2 Cacheable注解1.3 CachePut注解1.4 CacheEvict注解1.4.1 allEntr…

低代码产品如何分类,大部分人都没有搞清楚

最近许多技术峰会都出现了低代码这个名词,可以说,低代码是中台之后,又一个热门话题和名词了。 一、什么是低代码平台? 低代码平台是无需编码或通过少量代码就可以快速生成应用程序的开发平台。也是一款图形化、拖拉拽方式快速实…

hadoop伪分布式安装

文章目录 1. 将安装包hadoop-3.1.3.tar.gz上次至linux中2. 进行解压操作3. 修改目录名称4. 配置环境变量5. 修改自定义配置文件5.1 hadoop-env.sh5.2 core-site.xml5.3 hdfs-site.xml5.4 workers 6. 格式化集群7. 免密登录8. 启动hdfs9. 关闭hdfs 1. 将安装包hadoop-3.1.3.tar.…

群晖NAS与阿里云盘同步的方法

同步方法:通过在 docker 中安装 aliyundrive-webdav 实现与阿里云盘同步。 下载和安装 aliyundrive-webdav 在 docker 的注册表中搜素 aliyun,选择点赞比较多的 messense/aliyundrive-webdav: 下载后安装。建议在配置和启动之前&#xff…

Docker 的安装和镜像容器的基本操作

文章目录 一、Docker 概述1、Docker的概念2、容器的优点3、容器与虚拟机的区别4、容器在内核中支持2种重要技术5、Docker核心概念 二、Docker的安装1、docker的安装步骤2、实例操作:安装docker 三、Docker 镜像操作1、搜索镜像2、获取镜像3、镜像加速下载4、查看镜像…

基础工业工程(易树平、郭伏)——第三草 工作研究

第三草 工作研究 第一节 工作研究概述 一、工作研究的对象 工作研究的对象是作业系统,这是一个由多个相互关联的因素所组成的有机整体,旨在实现预定的功能和目标。作业系统的目标表现为输出一定的“产品”或“服务”,主要由材料、设备、能…

超级简洁、彻底组件化的轻量级Android Kotlin Jetpack MVVM组件化框架

结构 特点: 彻底组件化,且更简洁,Module具有独立的Application、AndroidMinifast、资源文件等;Application和Library的切换更加快捷;超级简洁、且多功能的网络层封装,自带2级缓存,App端内嵌了日…

盛元广通高校实验室安全智能管理平台

实验室安全问题一直以来都是高校管理的重点,依据《高等学校实验室安全规范》相关要求,应教育相关部门以及应急管理部门的相关规定,关于安全工作的系列重要指示和部署,必须按照危险源管控分级管理体系对实验室进行分级分类管理&…

ebay、速卖通、ozon销量下滑怎么办?怎样可以提高转化率

单量不好,就开始焦虑,而真正需要了解为什么会出现销量下滑的原因,从不断更新自己的知识,提高自己的技能,如何提高自己的技能呢? 把所学到的知识学以致用,listing的评分,退货率&…

ESP32学习四-自定义分区表

1、简介 ESP32-WROOM-32集成了4MB SPI FLASH。对应的,也会对这4MB FLAHS进行分区处理。在编译esp32程序时,通过make menuconfig -> Partition Table可以设置三种分区。 工厂程序(无OTA分区) 工厂程序(双OTA分…

自旋锁/读者写者问题

自旋锁 自旋锁的概念和理解 锁在处理需要申请加锁的线程的时候,一般有两种处理方法:一种是挂起等待,另外一种是自旋。自旋即轮询。 挂起等待: 当一个线程成功申请锁,并进入临界区后,其它线程在申请的时候…