我们知道,很多的NLP问题,诸如情感分析、概括、信息抽取等问题都事先规定好了我们具体的任务。而QA类型的问题和大部分问题有一个不同点,即当我们不知道具体的问句时,我们任务的目标是不确定的。因为问句的类型不同(询问地点、原因、人名、时间等),我们对应的任务(回答问题的方式方法)也有所差异。
既然对于不同类型的问句,我们回答的方式方法有所差异,那么我们能不能根据不同的问句而使用不同的模型呢?更进一步,我们是否可以预先设计一些神经网络模块,针对不同的问句,选择不同的模块进行组合,形成一个新的神经网络模型来回答该问题呢?
今天,我们将介绍一种全新的方法,根据问题的特点来动态组合神经网络模块以构造出一个适合回答该问题的模型(用不同的模型来回答不同类型的问句)。该方法也可看做是语义解析方法的一种扩展。
我们以UC Berkely 16年发表的这篇Learning to Compose Neural Networks for Question Answering文章为例,进行介绍。
该方法思路如下:
1.定义不同的神经网络模块
2.对问句进行解析
3.针对问句对神经网络模块进行组合
4.使用组合模型回答问题
我们先看下面这个图,对该方法来一个直观的感受:
首先我们定义了一些模块,如上图(a)所示,这些模块都由不同的神经网络组成。不同模块具有不同数量的输入和输出(图a黑点表示输入和输出)以及参数(模块空白部分表示参数)。
接着我们对问句进行解析并以此确定模型的结构(Network layout),即使用哪些模块组合出模型,如图b(方括号里的内容表示模块的参数)。
得到组合模型后,将外部知识(知识库或图片)作为模型的输入(图d),得出答案(图c)。
值得一提的是,该方法不仅可以用于文本的QA,还可以用于图像的QA(即VQA)。
接下来,我们来看看作者具体定义了哪些模块。
作者针对文本问答和图像问答两个任务,统一设计了不同的模块,该方法可以同时应用在这两个任务上。模块共有6种,注意这里模块的输入为外部知识W(即知识库 for KB-QA 或 图片 for VQA)或其他模块的输出,各模块的详细信息如下 :
对于KB-QA,Lookup模块可以在外部知识(即知识库)中找到相应的实体。
2. Find查找模块,根据参数i(i即查找对象)对外部知识生成相应的注意力attention矩阵,该模块是一个MLP(多层感知机),输入外部知识矩阵W,输出对于W的注意力矩阵。
对于VQA,以图像作为外部知识,假设对于图片我们的问题为_where is a bird?_我们则可以使用模块find[bird],输出注意力矩阵,该矩阵将注意力放在图像中和鸟相关的像素上。对于不同的参数i,我们的模块将使用不同的参数变量,如下表中的,其余网络参数如下表中的
则共享,即模块find[bird]和find[cat]是两个不同的模型,但共用了部分参数。
对于KB-QA,find模块可以找到和概念i相关的实体,如find[city],返回输入中所有满足类型为city的实体。
3. Relate相关模块,以attention和外部知识W为输入,根据参数i,生成新的attention,该模块和find模块类似,不同点在于它先将attention应用到外部知识W上,再根据参数生成新的attention。该模块可以根据问题对attention进行变换。
对于VQA,假设我们的问题为鸟的上方有什么,那么我们就可以调用relate[above],以find[bird]的attention作为输入,则返回当前attention位置上方的区域,作为新的attention。
而对于KB-QA,我们可以用relate模块找到和输入具有关系i相关的实体,如我们想寻找在纽约有哪些实体,则可以调用lookup[new york] 接上relate[in],先在知识库查找到实体纽约,再寻找和纽约具有in关系的实体。
该三个模块的详细介绍如下表所示:
接下来我们再介绍另外三个模块:
4. And模块,该模块可以有多个输入,输出为输入attention的交集,即对一系列输入的attention求交(对所有的attention矩阵进行elementwise的相乘)。
对于VQA,假设我们想找白色的猫,则可调用find[white]和find[cat]寻找白色和猫的区域attention,再将两个attention输入给and模块,得到交集。
对于KB-QA,我们可以筛选出满足多个条件的实体,如我们的问题为 _格鲁吉亚有哪些城市_,那么我们可以先调用lookup[georgia],得到格鲁吉亚实体,再调用relate[in],找到和georgia具有关系in相关的实体,我们再单独调用模块find[city]找到所有类型为城市的实体,最后将find[city]和lookup[georgia]->relate[in] 输入到add模块求交集,就可以找到在格鲁吉亚中的城市,整个流程如下图所示:
5. Describe模块,将输入的attention应用到外部知识中,再得出标签。
Describe模块主要用于VQA中,用于描述attention区域中的物体,比如discribe[color],返回该attention区域的颜色。也可以用于KB-QA中描述某个属性,下图展示了关于VQA的三个例子:
(上图第一行为外部知识【图片】, 第二行是 图片的attention, 第三行是问句,第四行是该问句所对应的模块组合的拓扑结构)
6. Exists模块,该模块和describe模块类似,用于回答yes or no类的问题。
Add、Describe、Exists模块的详细介绍如下表
有了以上6种模块 Lookup、Find、Relate、And、Descirbe和Exisits,我们就可以根据不同的问题组合出我们想要的模型,再将外部知识(知识库或图片)输入到动态生成的模型中得到答案。
这里再给出两个KB-QA对应的动态模型的例子:
可以看出,模块的针对性设计,让每个模块有了更加具体的目标,而针对不同问题动态构造出组合模型则更加具有针对性和可解释性。
接下来,我们再看看如何通过问题去预测模型的结构(layout),得到组合模型。
模块结构预测主要分为三个阶段:
1.对问题进行解读:通过Stanford Dependency Parser先得到问题的依存关系树,保留依存关系树上所有和疑问词及系动词相连的名词、动词和介词短语
2.确定候选组合模型:对于删减后的依存关系树,为每个名词和动词分配find模块,为专有名词分配lookup模块,为介词短语分配relate模块。对于这些模块所构成的集合,选取任意子集,对两两模块通过And模块进行合并组合,形成树结构,并在顶部插入describe模块或exists模块作为根节点(即最终的输出节点)。通过该方式,我们可以得到一系列候选模型。
3.选择模型:对于这些候选模型,我们构造两个特征向量,通过一个MLP(多层感知机)对候选模型进行打分。【打分模型】的输入是两个特征向量(问题特征和模型特征): 问题特征向量是将问题输入到LSTM,把LSTM最后一个时刻的隐层向量作为问题特征向量,模型特征向量包含了一系列的指示器(indicator),指示模型中每个类型模块的数量,打分函数如下:
其中为第i种组合模型,
为问题,
为LSTM的输出,
为模型的特征向量,其余为参数。
通过softmax对各模型的得分进行计算,得到【选择各个模型的概率分布】:
其中为【打分模型】MLP中的所有参数。
对于每一个模型,通过执行该模型可以得到关于最终答案标签的概率分布,记作
其中为输出的标签,
为外部知识(图片或知识库),
为整个【组合模型】的参数。
由于候选的组合模型数量很多,在训练的时候,我们的数据只有_(外部知识、问题、答案)_三元组,没有【打分模型】直接的target标签,无法进行直接的监督训练。我们只能通过执行每个候选模型,通过它的输出和答案标签比对,才能确定如何选择候选模型。那么问题在于执行每个候选模型的代价比较大(组合模型可以看作是一个深度神经网络模型),训练时难以承受该计算量。而选择每个候选模型(即执行【打分模型】MLP,是一个浅层的神经网络模型)的代价却相对较小。
因此,作者提出了使用增强学习的方法来训练【打分模型】,将【打分模型】计算出来的【选择各个模型的概率分布】看作是增强学习中选择动作的策略(Policy),选择模型看作是动作(Action),由于我们的目标是要选择输出的答案尽量准确的模型,因此将选择的模型执行后得到的输出概率log值看作是奖赏(Reward)。这样我们就可以通过增强学习中的policy-gradient方法进行优化了。
具体步骤为:对【各个模型的概率分布】对进行采样,采样出一个模型z,执行模型z,得到输出概率分布,通过policy-gradient构造以下损失函数进行优化:
(对于增强学习不了解并且感兴趣的朋友可以关注知乎专栏智能单元,专栏作者对增强学习的基础知识进行了很清晰的介绍,这里我不再赘述)
通过policy-gradient的方法我们就高效的完成了【打分模型】的训练,在训练时,打分模型和组合模型一起训练,这样各个模块的参数也一起进行训练。
至此,我们就介绍完了我们的【问题解析】、【候选模型构造方式】和【打分模型】,通过以上方法,我们就可以根据问题得到我们的组合模型,进而通过输入外部知识得出答案。
作者用该方法同时在VQA和QA两个领域进行了测试,都取得了不错的效果。
在QA问题上,作者并没有采用KB-QA的benchmark数据集,而是采用了一个数据量相对较小的数据集GeoQA,该数据集的问题大多和地理位置相关。通过find模块学习实体的类别特征,通过relate模块学习关系特征,通过and模块连接各个模块,最后用exists或describe模块输出答案。该方法相比一般的逻辑回归和感知机方法有较大的提升。
可以看出,这个方法具有一定程度的缺陷,如选择模型过程中会引入额外的错误(选择到了不是最优的模型、对问题的解析有误),由于定义模块是人为定义的,不一定适合所有的数据,需要引入一定的先验知识。
总的来说,虽然该方法在VQA和KB-QA上没有取得state-of-the-art的表现,但是其方法却有非常高的创新性,具有很强的解释性和可扩展性,一定程度上打破了深度学习的黑盒(打破黑盒是以后AI研究的一个重点方向),我相信该方法具有很大的潜力和研究价值,很多领域的任务都可以借鉴。
Original url: Access
Created at: 2018-11-02 11:53:25
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论