束搜索(Beam Search) 是一种更复杂的解码策略,在每个时间步保留多个可能的路径,而不是仅仅选择概率最高的一个路径。这样可以在一定程度上找到比贪心搜索更优的解码结果。束搜索允许我们考虑多个可能的符号序列,直到最后一步再选择得分最高的那个路径。 步骤: 初始化:开始时,路径集为空,且每条路径的初始得分为 1。
NetDecoder[{"CTCBeamSearch", alphabet}] 表示一个解码器,对概率向量序列进行解释,给出最有可能的序列解码. NetDecoder[{"CTCBeamSearch", ..., "BeamSize" -> n}] 表示具有指定柱宽度 (beam size) 的解码器.
一个更好的方法是使用beam search。beam search的idea在于,我们维护一个固定长度的候选集,每次循环我们都从候选集中所有的元素搜索一遍,然后我们通过排序来维持候选集长度不变,如下图所示: 实际上greedy search就是候选集长度为1时的beam search,因此通过增大候选集长度,我们就能得到比greedy search更好的结果。 但...
next_beam[prefix] = (n_p_b, n_p_nb)continue# Extend the prefix by the new character s and add it to the beam. Only the probability of not ending in blank# gets updated.end_t = prefix[-1]ifprefixelseNonen_prefix = prefix + (s,) n_p_b, n_p_nb = next_beam[n_prefix]ifs...
beam search(束搜索) decoding是一种在语言模型、文本识别等sep2sep的场景中快速、高效的神经网络解码算法。结合前面几个blog,我们重点展开一下beam search在场景文本识别中的作用。 通过前面几个blog的介绍,现在我们已经清楚,常规的场景文本识别算法都是由CNN+RNN+CTC组成的。
对于CTC解码,存在两种主要方法:贪心解码(Greedy Decode)与Beam Search。贪心解码的思想是在每一步选择当前概率最大的字符,从而构建标签序列。然而,CTC算法中定义了多对一的映射,意味着多个路径可以输出相同的标签。贪心解码只考虑了一条路径,这可能导致错误的解码结果。相比之下,Beam Search在每一步...
先来说一下Beam search算法,该算法有个参数叫做宽度,假设宽度设为3,在RNN的输出中,该算法每个时间t输出时,不同于贪婪算法只找最高的,而是找最高的三个概率作为下一次的输入,依次迭代,如下图所示,每次t时间都是基于t-1输出的最高三个查找当前概率最高的三个。(这里也可以看出,当宽度设置为1时就是贪婪算法)...
CTC中采用prefix beam search算法,想比于beam search 增加了路径合并的操作,即一方面在路径搜索的过程中对相同映射的路径进行合并;另一方面选取合适的beam size,仅保持最优的n条路径,剔除概率较少的候选路径,节约计算; 上图中,存在路径的合并操作,在T=2时刻aϵ和aa都对应a,于是二者概率叠加,路径合并为a;在T=...
常规的Beam Search在每个输入步骤计算一组新的候选。新的候选集是通过使用所有可能的输出字符扩展每个候选并仅保留最佳候选者而从前一组生成的。 \(\epsilon\)字符后存储输出前缀。在搜索的每一步,我们都会根据映射到它的所有对齐方式为给定前缀累积概率分数。
而常用的CTC解码算法一般有Greedy Search Decode(贪心搜索)、Beam Search Decode(束搜索)、Prefix Beam Search Decode(前缀束搜索)等,其中又以Greedy Search Decode(贪心搜索)和Prefix Beam Search Decode(前缀束搜索)使用的最多,本文将使用Python代码逐一实现上述三种算法。