beam search - 局部束搜索、随机束搜索

目录

1 广度优先搜索

2 贪心搜索

3 局部束搜索

4 随机束搜索

5 束搜索应用


1 广度优先搜索

1. 概念:扩展最浅的未扩展节点(BFS, breadth-first search );

2. 搜索方法:对于同一深度的节点总是以从左往右的顺序进行扩展

这里假设G为目标节点:

搜索过程:由 A拓展出B,C(不包含目标节点,继续拓展);

                先拓展节点B,得到D,E(不包含目标节点,继续拓展);

拓展C,得到F,G(得到目标节点,停止拓展)

3. 存在问题:

        空间复杂度高,所有的节点都保存在内存中:

        b + b^2 + ... + b^d = O(b^d)

        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中的应用是:

        贪心搜索的每一步搜索都处理成仅仅与前面刚生成的一个单词相关,类似于马尔科夫假设。这显然是不合理的,具体来说,贪心搜索到的句子𝑦概率是使得下式概率最大:        

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

然而实际上,根据全概率公式:

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

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第一步搜索出最可能的𝑘个单词,找到y_{11},y_{12},...y_{1k}, 他们的概率为p(y_{11}|x),p(y_{12}|x),...p(y_{1k}|x),最大的k个;

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

                (3)从(2)中选取k个结果出发,再进行k个模型副本的搜索,再选取出k个可能性最大的结果。

                k = 1为贪心搜索,k越大,占用内存越大,对应束搜索的B;

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

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

4. 存在问题:

        当束宽度较小时,在搜索过程中,算法会很快集中在搜索空间的某个小区域,导致找不出问题的解,或者解不是最优的;

        当束宽度较大时,搜索树又存在类似广度优先搜索算法的问题。

4 随机束搜索

1. 概念:在保留拓展节点不再是根据节点对应的启发式函数值大小,而是将值的大小转化为相应的概率,再由计算机系统根据概率对节点进行随机保留,避免算法陷入局部最优情况;

2. 搜索方法:

        进行N次搜索(设置的B),但其按照概率随机选择,就是局部束搜索中不再选择h最好的节点了,会以一定的概率选择较低的值;

3. 对应在NLP中的应用是:

        从Beam search的搜索过程中可以发现,Beam search偏向于找到更短的句子,也就是说,如果搜索过程中有一支搜索提前发现了<𝐸𝑂𝑆>,而另外𝑘−1支继续搜索找到其余更长的结果;

        那么由于概率连乘(或log连加),越长的结果概率肯定越小

        因此有必要进行模型修正,即进行长度归一化,具体来说,即:

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

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

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

        式中,超参数𝛼取0.7比较合适.

4. 存在问题:可能有潜在的最佳方案被丢弃。

5 束搜索应用

1. 解决实际生活中搜索空间较大,一般算法无法满足相应存储要求的问题;

2. 带有剪枝的搜索,可以提高时间效率;

2. 多用于大型系统中,机器翻译系统,语音识别系统,在这些系统中,数据集一般非常庞大,而且结果也没有唯一正确的解,寻找一种能以最快速度找到最接近正确的解才是解决问题的关键

参考:【NLP】选择目标序列:贪心搜索和Beam search - pigcv - 博客园

2021AI知识点11 Local beam search, stochastic beam search_哔哩哔哩_bilibili

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值