目录
1 广度优先搜索
1. 概念:扩展最浅的未扩展节点(BFS, breadth-first search );
2. 搜索方法:对于同一深度的节点总是以从左往右的顺序进行扩展
这里假设G为目标节点:
搜索过程:由 A拓展出B,C(不包含目标节点,继续拓展);
先拓展节点B,得到D,E(不包含目标节点,继续拓展);
拓展C,得到F,G(得到目标节点,停止拓展)
3. 存在问题:
空间复杂度高,所有的节点都保存在内存中:
b : 树的最大分支因子;
d: 目标节点的深度;
BFS算法对存储空间的消耗是指数级的,在搜索空间比较大时,该方法不可行。
2 贪心搜索
1. 概念:每次搜索,搜索1次,按照判断最有利的选项;
2. 搜索方法:
假设起始节点: I
终止节点:B
搜索节点排列为:(1)I,G(1)J(2)E(3)H(4),
(2)选择G(1),G后继节点 D(2)J(3),D没有后继节点;
(3) 因为J(3) > J(2), 选择 I -- J(2);
(4)J(2)后继节点: A(3),E(5),选择E(5),顺序为I -- J(2)-- E(5);(不重复选择)
(5)E(5)后继节点:C(6),H(9),F(8),选择C(6),顺序为 I -- J(2) -- E(5) -- C(6);
(6) C(6)的后继节点:A(10),B(7),F(8),选择B(7)就为目标节点,顺序为I -- J(2) -- E(5) -- C(6) -- B(7);
上述搜索找到了最优解,但使用贪心搜索方法,不一定一定可以找到最优解,但会找到解(至于怎样找到解,在于你怎么讲全局最优解问题分解为局部最优解问题,子问题)
3. 对应在NLP中的应用是:
贪心搜索的每一步搜索都处理成仅仅与前面刚生成的一个单词相关,类似于马尔科夫假设。这显然是不合理的,具体来说,贪心搜索到的句子𝑦概率是使得下式概率最大:
然而实际上,根据全概率公式:
4. 存在问题:不从整体最优上加以考虑,所做的在某种意义上是局部最优解。
3 局部束搜索
1. 概念:在每一次深度扩展过程中,去除质量差的节点,保留质量较高的节点,这样可以减少存书空间的消耗,提高算法的时间效率;(可以理解为进行N次贪心搜索,对应到B)
2. 搜索方法:
启发式函数h: 衡量扩展节点重要性的指标;
束宽度B: 扩展节点中保留的节点数目;
(1)首先从根节点出发,扩展出它的所有后继节点;
(2)若拓展后的节点,不包含目标节点,则根据启发式函数的值对拓展节点进行排序,保留其中B个最优节点;
(3)再进行下一轮拓展,直到找到目标节点,或者无法继续扩展(达到内存的最大容量),搜索结束。
最短路径问题的束搜索: 已知起始节点和目标节点,在途中找到这两个节点最短路径
假设起始节点: I
终止节点:B
启发式函数: 上一个节点到当前节点的路程;
存储空间:8
当束宽度B = 3时:
搜索过程为:
(1)首先搜索I,由I拓展出后继节点: E,G,H,I;
(2)没有达到目标节点B,得到其各个节点的启发式函数值:E(3), G(1), H(4),J(2), 保留三个节点: E,G,J;
(3)再对上述三个节点进行拓展,得到后继的12个节点:E:C,F,H,I,J; G: D, I,J; J: A, E, G, I;
(4)没有找到目标节点,计算出这12个节点对应的启发式函数值:E:C(1),F(3),H(4),I(3),J(3); G: D(1), I(1),J(2); J: A(2), E(1), G(3), I(2),因此保留:C, D, A;
(5)搜索中,一般不允许回到上一次的节点,对这三个节点进行再一轮拓展,得到C:A, B, E, F; D: G; A: C, J;
(6)找到目标节点B搜索过程结束:
因此搜索树为:I -- EGJ -- ACD -- B, 不仅找出了解,并且该解是最优 的 ,并且刚好填满了存储空间。
其他情况:
当B = 1时: 搜索树:I -- G -- D 无解;
当B = 2时: 搜索树: I -- GJ -- AD -- C -- B,找到了解,但不是最优解;
当B = 4时: 搜索树: I -- EG HJ -- ACDF,找到解之前 搜索空间耗尽;
3. 对应在NLP中的应用是:
每步选取最可能的k个结果,再从k个结果中选取最合适的句子;
(1)首先decoder第一步搜索出最可能的𝑘个单词,找到, 他们的概率为
,最大的k个;
(2)分别进行k个模型副本的搜索,每个副本i,根据上一步选择的单词,选取概率最大的k个结果
,这样就有了k*k个可能的结果,概率为
(3)从(2)中选取k个结果出发,再进行k个模型副本的搜索,再选取出k个可能性最大的结果。
k = 1为贪心搜索,k越大,占用内存越大,对应束搜索的B;
可以发现概率的连乘使得概率越来越小,很可能溢出,为了保证模型的稳定性,常对概率连乘计算+log变为加法:
4. 存在问题:
当束宽度较小时,在搜索过程中,算法会很快集中在搜索空间的某个小区域,导致找不出问题的解,或者解不是最优的;
当束宽度较大时,搜索树又存在类似广度优先搜索算法的问题。
4 随机束搜索
1. 概念:在保留拓展节点不再是根据节点对应的启发式函数值大小,而是将值的大小转化为相应的概率,再由计算机系统根据概率对节点进行随机保留,避免算法陷入局部最优情况;
2. 搜索方法:
进行N次搜索(设置的B),但其按照概率随机选择,就是局部束搜索中不再选择h最好的节点了,会以一定的概率选择较低的值;
3. 对应在NLP中的应用是:
从Beam search的搜索过程中可以发现,Beam search偏向于找到更短的句子,也就是说,如果搜索过程中有一支搜索提前发现了<𝐸𝑂𝑆>,而另外𝑘−1支继续搜索找到其余更长的结果;
那么由于概率连乘(或log连加),越长的结果概率肯定越小;
因此有必要进行模型修正,即进行长度归一化,具体来说,即:
另外,实践中还做了如下修正:
式中,超参数𝛼取0.7比较合适.
4. 存在问题:可能有潜在的最佳方案被丢弃。
5 束搜索应用
1. 解决实际生活中搜索空间较大,一般算法无法满足相应存储要求的问题;
2. 带有剪枝的搜索,可以提高时间效率;
2. 多用于大型系统中,机器翻译系统,语音识别系统,在这些系统中,数据集一般非常庞大,而且结果也没有唯一正确的解,寻找一种能以最快速度找到最接近正确的解才是解决问题的关键。
参考:【NLP】选择目标序列:贪心搜索和Beam search - pigcv - 博客园
2021AI知识点11 Local beam search, stochastic beam search_哔哩哔哩_bilibili