greedy search和beam search的原理以及实现

在自然语言处理seq2seq模型中,模型训练完成后,预测推理时需要预测每一步输出的最可能的单词,之后组合成完整的预测输出句子。这里每一步最可能的输出单词的选择就用到greedy search或者beam search。下面详细介绍一下这两种搜索的区别,以及实现方法。贪婪搜索 greedy searchgreedy search比较简单,就是贪婪式的搜索,每一步都选择概率最大的单词输出,最后组成整个句子输出。这种方法给出的结果一般情况结果比较差,因为只考虑了每一步的最优解,往往里全局最优解差距很大。贪婪
摘要由CSDN通过智能技术生成

在自然语言处理seq2seq模型中,模型训练完成后,预测推理时需要预测每一步输出的最可能的单词,之后组合成完整的预测输出句子。这里每一步最可能的输出单词的选择就用到greedy search或者beam search。下面详细介绍一下这两种搜索的区别,以及实现方法。

贪婪搜索(greedy search)

greedy search比较简单,就是贪婪式的搜索,每一步都选择概率最大的单词输出,最后组成整个句子输出。这种方法给出的结果一般情况结果比较差,因为只考虑了每一步的最优解,往往里全局最优解差距很大。
贪婪搜索实现比较简单,这里就不写了,每一部找一个最大值就好了。

集束搜索(beam search)

beam search是介于全局搜索和贪婪搜索之间。这里先讲一下全局搜索,全局搜索考虑的是全局最优解,需要把每一种可能输出结果都算出来,然后找出概率最大的输出。这种搜索空间是非常巨大的,假设我们的词表大小为N,句子长度为T个单词,整个搜索时间复杂度为O(N*N*T),一般N取值在几万到几十万级别,T在为几百个单词,实际计算比较慢。
而降低时间复杂度的方法就是寻找次优解,具体就是把搜索空间中的N减下来,每一步计算完只保留K个最大的取值路径,这样时间复杂度降为O(K*N*T),K取值一般比N小很多。这样得到的虽然不是最优解,但是在seq2seq模型的推理预测中可以兼顾时间和效果。

beam search实现

下面用python简单实现一下beam-search算法,这里实现的是假设每一步输出的可能概率是提前算好的,然后传入一个k值,计算beam-search的最优输出。
实际seq2seq中beam-search是要考虑每一部状态输出的,下一步预测输出需要上一步的状态,这里的实现暂时未考虑。

写法1:每次先排序,然后选择排序后的k个最大值。

import numpy as np

def beam_search(probs, k):
    seq_scores = [[list(), 1.0]] # 存放路径和概率
    for prob in probs:
        cands = list()
        for i in range(len(seq_scores)):
            seq, score = seq_scores[i]
            for j in range(len(prob)):
                cand = [seq+[j], score * prob[j]]
                cands.append(cand)
        # 寻找topk个最大
        seq_scores = sorted(cands, key=lambda x: x[1
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值