构建seq2seq模型,并训练完成后,我们只要将源句子输入进训练好的模型,执行一次前向传播就能得到目标句子,但是值得注意的是:

seq2seq模型的decoder部分实际上相当于一个语言模型,相比于RNN语言模型,decoder的初始输入并非0向量,而是encoder对源句子提取的信息。因此整个seq2seq模型相当于一个条件语言模型,本质上学习的是一个条件概率,即给定输入\(x\),学习概率分布\(P(y|x)\)。得到这个概率后,对应概率最大的目标句子\(y\)就是模型认为的最好的输出。我们不希望目标的输出是随机的(这相当于对学习的概率分布\(P(y|x)\)随机取样),但要选择最好的句子\(y\)需要在decoder的每一步遍历所有可能的单词,假如目标句子的长度为\(n\),词典大小为\(v\),那么显然,可能的句子数量是\(v^n\),这显然是做不到的。

1 Greedy search

一个自然的想法是贪心搜索(greedy search),即decoder的每一步都选择最可能的单词,最后得到句子的每一个单词都是每一步认为最合适的单词。但这样并不保证整个句子的概率是最大的,即不能保证整个句子最合适。实际上,贪心搜索的每一步搜索都处理成仅仅与前面刚生成的一个单词相关,类似于马尔科夫假设。这显然是不合理的,具体来说,贪心搜索到的句子\(y\)概率是使得下式概率最大:

\(P(y|x) = \prod_{k=1}^{n}{p(y_k|x,y_{k-1})}\)

而实际上,根据全概率公式计算得到\(P(y|x)\)为:

\(P(y|x) = \prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1})\)

2 Beam search

译为束搜索。思想是,每步选取最可能的\(k\)个结果,再从最后的\(k\)个结果中选取最合适的句子。\(k\)称为beam size。

具体做法是:

首先decoder第一步搜索出最可能的\(k\)个单词,即找到\(y_{11},y_{12},...,y_{1k}\),他们的概率\(p(y_{11}|x),...,p(y_{1k}|x)\)为最大的\(k\)个。

进行第二步搜索,分别进行\(k\)个模型副本的搜索。每个副本\(i\),根据上一步选取的单词\(y_{1i}\),选取概率最大的\(k\)个结果\(y_{21},y_{22},...,y_{2k}\)。这样,就有了\(k*k\)个可能的结果,从这些结果中选择\(k\)个概率最大的结果,即\(p(y_{1i}|x)*p(y_{2j}|x,y_{1i})\)最大的\(k\)个结果。

进行第三步搜索,从第二步中确定的\(k\)个结果出发,再进行\(k\)个模型副本的搜索,直到最后一步,从最后的\(k\)个结果中选取概率最大者。

显然,若\(k=1\)则为贪心搜索,\(k\)越大则占用内存越大,计算代价越大,实际应用中取10即可。

另外,可以发现概率的连乘使得概率越来越小,很可能溢出,为了保证模型的稳定性,常对概率连乘计算+log变为加法。

\(P(y|x) = log(\prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1}))\)

3 改进Beam search

从Beam search的搜索过程中可以发现,Beam search偏向于找到更短的句子,也就是说,如果搜索过程中有一支搜索提前发现了\(<EOS>\),而另外\(k-1\)支继续搜索找到其余更长的结果,那么由于概率连乘(或log连加),越长的结果概率肯定越小。因此有必要进行模型修正,即进行长度归一化,具体来说,即:

选择概率\(P(y|x) = \frac{1}{n}log(\prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1}))\)最大的句子,式中,\(n\)为该结果序列长度。

另外,实践中还做了如下修正:

\(P(y|x) = \frac{1}{n^\alpha}log(\prod_{k=1}^{n}p(y_k|x,y_1,y_2,...,y_{k-1}))\)

式中,超参数\(\alpha\)取0.7比较合适。

4 误差分析

对于训练的seq2seq模型,对它输出的句子\(y\),以及实际的句子\(y^*\),若概率\(y\)大于\(y^*\),(统计所有句子,平均来说是这个结果),则说明,seq2seq模型出错了。否则,说明,baem search并没有找到最合适的结果,可以考虑增大beam size大小。

【NLP】选择目标序列:贪心搜索和Beam search的更多相关文章

  1. Beam Search快速理解及代码解析

    目录 Beam Search快速理解及代码解析(上) Beam Search 贪心搜索 Beam Search Beam Search代码解析 准备初始输入 序列扩展 准备输出 总结 Beam Sea ...

  2. Beam Search快速理解及代码解析(上)

    Beam Search 简单介绍一下在文本生成任务中常用的解码策略Beam Search(集束搜索). 生成式任务相比普通的分类.tagging等NLP任务会复杂不少.在生成的时候,模型的输出是一个时 ...

  3. 集束搜索beam search和贪心搜索greedy search

    贪心搜索(greedy search) 贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度. 集束搜索(beam search) 集束搜索可以认为是维特比算法的贪心形式,在维特 ...

  4. [DeeplearningAI笔记]序列模型3.2有条件的语言模型与贪心搜索的不可行性

    5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.2选择最可能的句子 Picking the most likely sentence condition lan ...

  5. 实现nlp文本生成中的beam search解码器

    自然语言处理任务,比如caption generation(图片描述文本生成).机器翻译中,都需要进行词或者字符序列的生成.常见于seq2seq模型或者RNNLM模型中. 这篇博文主要介绍文本生成解码 ...

  6. Beam Search(集束搜索/束搜索)

    找遍百度也没有找到关于Beam Search的详细解释,只有一些比较泛泛的讲解,于是有了这篇博文. 首先给出wiki地址:http://en.wikipedia.org/wiki/Beam_searc ...

  7. BLAST - 序列数据库搜索

    我生信入门,老师就要求我学好blast比对,说得也确实是很有道理,是个人都知道比对是最基本的东西,现在再想想那老师的建议,也只能呵呵一笑. 北大生物信息公开课有一章专门讲得序列数据库搜索,可以好好看看 ...

  8. LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  9. LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

随机推荐

  1. 深入理解Linux内核 学习笔记(2)

    第二章 :内存寻址 略.基本同计算机组成原理中的讲述 内核代码和数据结构会存储在一个保留的页框中. 常规Linux安装在RAM物理地址0x00100000开始的地方.因为:页框0是由BIOS使用,存放 ...

  2. 浅析Servlet执行原理

    在JavaWeb学习研究中,Servlet扮演重要的作用,学好它,是后续JavaWeb学习的良好基础.无论是SSH,还是SSM,微服务JavaWeb技术,都应先学好Servlet,从而达到事半功倍的效 ...

  3. 玩转Spring Cloud之API网关(zuul)

    最近因为工作原因,一直没有空写文章,所以都是边忙项目,边利用空闲时间,周末时间学习总结,最终在下班回家后加班加点写完本篇文章,若有不足之处,还请谅解,谢谢! 本文内容导航: 一.网关的作用 二.网关与 ...

  4. Netflix网关zuul(1.x和2.x)全解析

    zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul可以通过加载动态过滤机制,从而实现以下各项功能: 验证与安全保障: 识别面向各类 ...

  5. 通用mapper认识和用法

    目录 0. 认识 1. 导包 2. mybatis的config文件:mybatis-mapper-config.xml 3. spring与mybatis整合配置文件:mybatis.xml 4. ...

  6. Spring MVC的文件上传和下载

    简介: Spring MVC为文件上传提供了直接的支持,这种支持使用即插即用的MultipartResolver实现的.Spring MVC 使用Apache Commons FileUpload技术 ...

  7. JS:onmouseover 、onmouseout

    鼠标移动到P标签上时,改变文本和边框样式 <style type="text/css"> .onmouseover { color: red; border: 1px ...

  8. springboot2.0拦截器和webconfigure配置

    接下来介绍一下springboot如何配置拦截器,很简单,只需要两个配置文件就可以了 首先配置登陆拦截器 @Component public class LoginInterceptor implem ...

  9. C++,std::shared_future的使用

    今天给大家分享一个类似多线程任务的方法,具体如下: std::shared_future<int> tmp = std::async(p1,p2,p3); int tmpInt = tmp ...

  10. OpenGL Windows 窗口程序环境搭建

    OpenGL环境搭建步骤: Downloading OpenGL 根据官网的说法: In all three major desktop platforms (Linux, macOS, and Wi ...