Greedy search 和 beam search

2024-04-07 03:48
文章标签 search beam greedy

本文主要是介绍Greedy search 和 beam search,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

P(y|x)=∏nk=1p(yk|x,yk−1)P(y|x)=∏k=1np(yk|x,yk−1)

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

P(y|x)=∏nk=1p(yk|x,y1,y2,...,yk−1)P(y|x)=∏k=1np(yk|x,y1,y2,...,yk−1)

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

具体做法是:

首先decoder第一步搜索出最可能的kk个单词,即找到y11,y12,...,y1ky11,y12,...,y1k,他们的概率p(y11|x),...,p(y1k|x)p(y11|x),...,p(y1k|x)为最大的kk个。

进行第二步搜索,分别进行kk个模型副本的搜索。每个副本ii,根据上一步选取的单词y1iy1i,选取概率最大的kk个结果y21,y22,...,y2ky21,y22,...,y2k。这样,就有了k∗kk∗k个可能的结果,从这些结果中选择kk个概率最大的结果,即p(y1i|x)∗p(y2j|x,y1i)p(y1i|x)∗p(y2j|x,y1i)最大的kk个结果。

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

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

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

P(y|x)=log(∏nk=1p(yk|x,y1,y2,...,yk−1))P(y|x)=log(∏k=1np(yk|x,y1,y2,...,yk−1))

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

选择概率P(y|x)=1nlog(∏nk=1p(yk|x,y1,y2,...,yk−1))P(y|x)=1nlog(∏k=1np(yk|x,y1,y2,...,yk−1))最大的句子,式中,nn为该结果序列长度。

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

P(y|x)=1nαlog(∏nk=1p(yk|x,y1,y2,...,yk−1))P(y|x)=1nαlog(∏k=1np(yk|x,y1,y2,...,yk−1))

式中,超参数αα取0.7比较合适。

这篇关于Greedy search 和 beam search的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881574

相关文章

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

JavaScript正则表达式六大利器:`test`、`exec`、`match`、`matchAll`、`search`与`replace`详解及对比

在JavaScript中,正则表达式(Regular Expression)是一种用于文本搜索、替换、匹配和验证的强大工具。本文将深入解析与正则表达式相关的几个主要执行方法:test、exec、match、matchAll、search和replace,并对它们进行对比,帮助开发者更好地理解这些方法的使用场景和差异。 正则表达式基础 在深入解析方法之前,先简要回顾一下正则表达式的基础知识。正则

插件maven-search:Maven导入依赖时,使用插件maven-search拷贝需要的依赖的GAV

然后粘贴: <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.26</version> </dependency>

广度优先搜索Breadth-First-Search

目录  1.问题 2.算法 3.代码 4.参考文献  1.问题         广度优先搜索,稍微学过算法的人都知道,网上也一大堆资料,这里就不做过多介绍了。直接看问题,还是从下图招到一条从城市Arad到Bucharest的路径。  该图是连通图,所以必然存在一条路径,只是如何找到最短路径。 2.算法 还是贴一个算法的伪代码吧: 1 procedu

【0323】Postgres内核之 hash table sequentially search(seq_scan_tables、num_seq_scans)

0. seq scan tracking 我们在这里跟踪活跃的 hash_seq_search() 扫描。 需要这种机制是因为如果扫描正在进行时发生桶分裂(bucket split),它可能会访问两次相同的条目,甚至完全错过某些条目(如果它正在访问同一个分裂的桶中的条目)。因此,如果正在向表中插入数据,我们希望抑制桶分裂。 在当前的使用中,这种情况非常罕见,因此只需将分裂推迟到下一次插入即可。

Apache Beam 大数据处理一站式分析

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 一. 介绍 大数据处理其实经常被很多人低估,缺乏正确的处理体系,其实,如果没有高质量的数据处理流程,人工智能将只有人工而没有智能。现在的趋势是数据体量不断上涨,团队却低估了规模所带来的复杂度。大数据领域泰斗级人物Jesse Anderson曾做过研究,一个组织架构比较合理的人工智能团队,

Android Settings搜索Search方案分析

Android开发会遇到一些自写界面需要允许被搜索,或者三方应用挂靠在Settings,用户也希望能被搜索。 在知道怎么添加之前,得先了解下整个框架,才能更好地加入我们自己的代码。   这里稍微整理了下整个search database数据如何索引加载流程。 Settings搜索界面是由SearchFragment展现,当用户在Settings主页中点击搜索图标,会启动到SearchAc

SIM(Search-based user interest modeling)

导读 我们对电商场景兴趣建模的理解愈发清晰:1. 通过预估目标item的信息对用户过去的行为做search提取和item相关的信息是一个很核心有效的技术。2. 更长的用户行为序列信息对CTR建模是非常有效且珍贵的。从用户的角度思考,我们也希望能关注用户长期的兴趣。但是当前的search方法无论是DIN和DIEN都不允许我们在线对一个超长的行为序列比如1000以上做有效搜索。所以我们的目标就比较明

[LeetCode] 240. Search a 2D Matrix II

题:https://leetcode.com/problems/search-a-2d-matrix-ii/description/ 题目 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers i

最佳优先搜索best-find search

目录 1. 问题 2. 算法 3.代码 1. 问题 考虑下面这个问题:  我们要找到从Arad到Bucharest的路,最好是最短的路: 2. 算法 这是一个无向有环图, 可以采用最佳优先搜索: 最佳优先搜索的算法可以参考维基百科: 伪代码如下: // Pseudocode for Best First SearchBest-First-Search(Gr