【深度学习】Beam Search原理和实现、闲聊机器人优化

本文详细介绍了Beam Search的原理和实现,包括其在seq2seq模型中的应用,以及如何通过堆数据结构实现搜索。此外,还讨论了闲聊机器人的优化方法,如梯度裁剪和其他策略,以提升聊天机器人的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 Beam Search原理和实现

1. Beam Search的介绍

在进行模型评估的过程中,每次选择概率最大的token id作为输出,那么整个输出的句子的概率就是最大的么?

在这里插入图片描述

Beam search又被称作束集搜索,是一种seq2seq中用来优化输出结果的算法(不在训练过程中使用)。

例如:传统的获取解码器输出的过程中,每次只选择概率最大的那个结果,作为当前时间步的输出,等到输出结束,会发现整个句子可能并不通顺。虽然在每一个时间步上的输出确实是概率最大的,但是整体的概率不一定是最大的,经常把它叫做greedy search[贪心算法]

为了解决上述的问题,可以考虑计算全部输出的概率乘积,选择最大的哪一个,但是这样的话,意味着如果句子很长,候选词很多,那么需要保存的数据就会非常大,需要计算的数据量就很大

那么Beam Search 就是介于上述两种方法之间的一种方法,假设Beam width=2,表示每次保存的最大的概率的个数,这里每次保存两个,在下一个时间步骤一样,也是保留两个,这样就可以达到约束搜索空间大小的目的,从而提高算法的效率。

beam width =1 时,就是贪心算法,beam width=候选词的时候,就是计算全部的概率。beam width 是一个超参数。

比如在下图中:

使用一个树状图来表示每个time step的可能输出,其中的数字表示是条件概率

黄色的箭头表示的是一种greedy search,概率并不是最大的

如果把beam width设置为2,那么后续可以找到绿色路径的结果,这个结果是最大的

在这里插入图片描述

下图是要给beam width=3的例子

  1. 首先输入start token <s>,然后得到四个输出(x,y,z,</s>),选择概率最大三个,x,y,w
  2. 然后分别把x,y,w放到下一个time step中作为输入,分别得到三个不同的输出,找到三个输出中概率最大的三个,x,y,y
  3. 继续重复上述步骤,直到获得结束符(概率最大)或者是达到句子的最大长度,那么此时选择概率乘积最大的一个。
  4. 拼接整个路径上概率最大的所有结果,比如这里可能是<s>,y,y,x,w,</s>

在这里插入图片描述

2. Beam serach的实现

在上述描述的思路中,需要注意以下几个内容:

  1. 数据该如何保存,每一次输出的最大的beam width个结果,和之后之前的结果该如何保存
  2. 保存了之后的概率应该如何比较大小,保留下概率最大的三个
  3. 不能够仅仅只保存当前概率最大的信息,还需要有当前概率最大的三个中,前面的路径的输出结果

2.1 数据结构-堆-的认识

对于上面所说的,保留有限个数据,同时需要根据大小来保留,可以使用一种带有优先级的数据结构来实现,可以使用这种数据结构

是一种优先级的队列,但是它其实并不是队列,我们常说的队列都是先进先出或者是先进后出,但是只根据优先级的高低来取出数据。

在一起的另外一种数据结构叫做,有入栈和出栈的操作,可以理解为是一种先进后出的数据结构。

在python自带的模块中,有一个叫做heapq的模块,提供了堆所有的方法。如下代码展现了heapq的使用方法

my_heap = [] #使用列表保存数据

 #往列表中插入数据,优先级使用插入的内容来表示,就是一个比较大小的操作,越大优先级越高
heapq.heappush(my_heap,[29,True,"xiaohong"]) 
heapq.heappush(my_heap,[28,False,"xiaowang"])
heapq.heappush(my_heap,[29,False,"xiaogang"])

for i in range(3):
    ret= heapq.heappop(my_heap)  #pop操作,优先级最小的数据
    print(ret)
    
#输出如下:
[28, False, 'xiaowang']
[29, False, 'xiaogang']
[29, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneTenTwo76

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值