构建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. word中如何只修改英文的颜色

    替换->更多->使用通配符,查找[a-zA-Z],替换为^&,字体选红色

  2. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.3版本全新发布

    1.RDIFramework.NET框架介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,为企业或个人快速开发系统提供了强大的支持,开发人员不需要开发系统的基础功能和 ...

  3. Dynamics CRM项目实例之九:CRM 2015的产品中的捆绑销售

    关注本人微信和易信公众号: 微软动态CRM专家罗勇,回复140或者20150112可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!      今天的博客主要是介绍Dy ...

  4. 放下技术,是PM迈出的第一步

    上一篇,我们从项目层面提出了PM的核心能力架构.今天,我想从公司层面,分析一下PM的核心能力架构中的过程能力,这也是PM当下最关心.最真切的痛点. 还记得上一篇我的同事老A吗? 为什么他能在知名外企带 ...

  5. There is already an object named '#xxxx' in the database.

    这个案例是前几天同事遇到的一个案例,在存储过程中"删除"了一个临时表,然后重新创建这个临时表时遇到"There is already an object named 'x ...

  6. hbase snapshot 表备份/恢复

    snapshot其实就是一组metadata信息的集合,它可以让管理员将表恢复到以前的一个状态.snapshot并不是一份拷贝,它只是一个文件名的列表,并不拷贝数据.一个全的snapshot恢复以为着 ...

  7. js坚持不懈之13:JavaScript查找HTML元素的方法

    1. 通过 id 查找 HTML 元素 <!DOCTYPE html> <html> <body> <p id = "intro"> ...

  8. 用java命令重新签名apk

    apk简介 APK是AndroidPackage的缩写,即Android安装包(apk).APK是类似Symbian Sis或Sisx的文件格式.通过将APK文件直接传到Android模拟器或Andr ...

  9. Azure存储账户的日志分析方法

    1.首先确认日志功能是否开启(日志文件根据存储账户的类型,按使用量收费 . 2.在存储账户-Usage(classic)-Metrics中查看突出流量的时间: 3.在Explorer中下载对应时间点的 ...

  10. Binwalk的安装和使用

    Binwalk的安装和使用 一.安装Git 参考链接:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067 ...