-
exhaustive search(穷举搜索)
最直观的方法就是穷举所有可能的输出序列。从所有的排列组合中找到输出条件概率最大的序列。穷举搜索能保证全局最优,但计算复杂度太高,当输出词典稍微大一点根本无法使用。 -
greedy search(贪心搜索)
贪心搜索在解码下一个选择的时候,直接选择条件概率最大的候选值作为当前最优。 -
beamsearch(集束搜索)
beam search的每一步不再只选择条件概率最大的值,而是选择概率值topk个(也即beam_size(束宽))。然后分别以这K个值做为下一个字解码的输入,则下个字会预测出K^2个概率。然后从这些概率中再选择topK个,重复上述过程。当beam_size=1时集束搜索就退化成了贪心搜索。 -
bayessearch (贝叶斯搜索)
建立目标函数的概率模型,并用它来选择最有希望的超参数来评估真实的目标函数。利用先验知识逼近未知目标函数的后验分布从而调节超参。花一点时间选择下一个超参数,以减少对目标函数的调用。贝叶斯调参采用高斯过程,考虑之前的参数信息,不断地更新先验;网格搜索未考虑之前的参数信息,贝叶斯调参迭代次数少,速度快;贝叶斯调参针对非凸问题依然稳健。 -
viterbisearch (维特比搜索)
相应的当前选择,最优解一定是前一个选择的最优解。在没有得到最终结果之前,每一个选择都有可能是最优解,所以在序列生成过程中,保留每一个选择的前一个选择的最优选,到最后一个选择时,回溯出全局最优解。
设建模单元为N, beam_size为K,解码所需时间步骤为T:
(1) 如果k=1,即为greedy search,时间复杂度为O(NT)(2)beam_search,时间复杂度为O(KNT),局部最优
(3)如果K=N,即维特比算法,时间复杂度为O(NNT),全局最优