波束搜索算法图解【Beam Search】

news2024/11/15 12:48:21

许多 NLP 应用程序(例如机器翻译、聊天机器人、文本摘要和语言模型)都会生成一些文本作为其输出。此外,图像字幕或自动语音识别(即语音转文本)等应用程序也会输出文本,即使它们可能不被视为纯 NLP 应用程序。

所有这些应用程序都使用几种常用算法作为其产生最终输出的最后一步:

  • 贪婪搜索(Greedy Search)就是这样一种算法,它经常被使用,因为它简单快捷。
  • 另一种方法是使用波束搜索(Beam Search),它非常受欢迎,因为尽管它需要更多的计算,但通常会产生更好的结果。

在本文中,我将探索 Beam Search 并解释使用它的原因及其工作原理。我们将简要介绍贪婪搜索作为比较,以便我们了解 Beam Search 如何改进它。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、NLP 模型如何生成输出

我们以序列到序列模型(Seq2Seq)为例。这些模型经常用于机器翻译等应用。

机器翻译的序列到序列模型

例如,如果使用此模型将英语翻译成西班牙语,它将以源语言中的句子(例如英语中的“You are welcome”)作为输入,并输出目标语言中的等效句子(例如西班牙语中的“De nada”)。

文本是单词(或字符)的序列,NLP 模型构建一个由源语言​​和目标语言中的整个单词集组成的词汇表。

该模型将源句子作为输入,并将其传递到嵌入层,然后传递到编码器。然后,编码器输出一个编码表示,该表示紧凑地捕获输入的基本特征。

然后,将此表示与“”标记一起输入到解码器以为其输出提供种子。解码器使用这些来生成自己的输出,即目标语言中句子的编码表示。

然后将其传递到输出层,该输出层可能由一些线性层和 Softmax 组成。线性层输出词汇表中每个单词在输出序列中每个位置出现的可能性的分数。然后,Softmax 将这些分数转换为概率:

词汇表中每个字符的概率、输出序列中每个位置的概率

当然,我们的最终目标不是这些概率,而是最终的目标句子。为了得到这个,模型必须决定它应该为目标序列中的每个位置预测哪个单词。

该模型根据概率预测输出句子

它是如何做到的?

2、贪婪搜索

一个相当明显的方法是简单地取每个位置上概率最高的单词并进行预测。它计算速度快,易于理解,而且通常能产生正确的结果:

贪婪搜索

事实上,贪婪搜索非常容易理解,我们不需要花更多时间来解释它😃。但我们能做得更好吗?

啊哈,终于把我们带到了真正的话题!

3、波束搜索简介

波束搜索比贪婪搜索有两点改进:

  • 使用贪婪搜索,我们只取每个位置上最好的一个词。相比之下,波束搜索扩展了这一点,并取了最好的“N”个词。
  • 使用贪婪搜索,我们单独考虑每个位置。一旦我们确定了该位置的最佳词,我们就不会检查它之前(即在前一个位置)或之后的内容。相比之下,波束搜索选择迄今为止最好的“N”个序列,并考虑所有前面的单词与当前位置的单词的组合概率。

换句话说,它比贪婪搜索投射的“搜索光束”更广泛一些,这就是它的名字的由来。超参数“N”称为波束宽度。

直观地看,这比贪婪搜索能给我们带来更好的结果。因为我们真正感兴趣的是最佳的完整句子,如果我们只在每个位置挑选最佳的单个单词,我们可能会错过它。

让我们举一个简单的例子,波束宽度为 2,并使用字符来保持简单:

波束搜索示例,宽度 = 2

第一个位置:

  • 考虑模型在第一个位置的输出。它从“”标记开始并获取每个单词的概率。现在它选择该位置的两个最佳字符。例如“A”和“C”。

第二个位置:

  • 当涉及到第二个位置时,它会重新运行模型两次,通过修复第一个位置中的可能字符来生成概率。换句话说,它将第一个位置的字符限制为“A”或“C”,并生成具有两组概率的两个分支。具有第一组概率的分支对应于位置 1 中的“A”,具有第二组概率的分支对应于位置 1 中的“C”。
  • 现在它根据前两个字符的组合概率从两组概率中挑选出总体上最好的两个字符对。因此,它不会从第一组中挑选出一个最佳字符对,也不会从第二组中挑选出一个最佳字符对。例如“AB” 和 “AE”

第三个位置:

  • 当到达第三个位置时,它会重复该过程。它会通过将前两个位置限制为“AB”或“AE”来重新运行模型两次,并再次生成两组概率。
  • 再次,它会根据两组概率中前三个字符的组合概率选择总体上最好的两个字符三元组。因此,我们现在有了前三个位置的两个最佳字符组合。例如“ABC” 和 “AED”。

重复直到结束标记:

  • 它会继续执行此操作,直到它选择一个“”标记作为某个位置的最佳字符,然后结束该序列的分支。

它最终得到两个最佳序列并预测总体概率较高的序列。

4、波束搜索的工作原理

现在,我们从概念层面理解了波束搜索。让我们更深入地了解其工作原理的细节。我们将继续使用相同的示例,并使用 2 的束宽度。

继续使用我们的序列到序列模型,编码器和解码器可能是一个由一些 LSTM 层组成的循环网络。或者,它也可以使用 Transformers 而不是循环网络来构建。

基于 LSTM 的序列到序列模型

让我们关注解码器组件和输出层。

第一个位置:

在第一个时间步中,它使用编码器的输出和 <START> 标记的输入来生成第一个位置的字符概率:

第一个位置的字符概率

现在它选择两个概率最高的字符,例如“A”和“C”。

第二个位置:

对于第二个时间步,它像以前一样使用编码器的输出运行解码器两次。除了第一个位置中的“”标记外,它还强制在第一个解码器运行中将第二个位置的输入设置为“A”。在第二个解码器运行中,它强制将第二个位置的输入设置为“C”:

第二个位置的字符概率

它为第二个位置生成字符概率。但这些是单个字符概率。它需要计算前两个位置中字符对的组合概率。假设“A”已固定在第一个位置,则“AB”对的概率是“A”出现在第一个位置的概率乘以“B”出现在第二个位置的概率。下面的示例显示了计算过程:

计算前两个位置中字符对的概率

它对两次解码器运行都执行此操作,并在两次运行中选择组合概率最高的字符对。因此,它选择了“AB”和“AE”:

该模型根据组合概率选择两个最佳字符对

第三个位置:

对于第三个时间步骤,它再次像以前一样运行解码器两次。除了第一个位置中的 <START> 标记外,它还强制在第一个解码器运行中将第二个位置和第三个位置的输入分别设置为“A”和“B”。在第二个解码器运行中,它强制将第二个位置和第三个位置的输入分别设置为“A”和“E”:

第三个位置的字符概率

它计算前三个位置中字符三元组的组合概率:

计算前三个位置中字符三元组的概率

它在两次运行中挑选出两个最佳的,因此挑选出“ABC”和“AED”:

该模型根据组合概率选择两个最佳字符三元组

重复至结束标记:

它重复此过程,直到生成两个以 <END> 标记结尾的最佳序列。

然后它选择具有最高组合概率的序列来进行最终预测。

5、结束语

本文介绍了 Beam Search 的作用、工作原理以及它为何能给我们带来更好的结果。这需要增加计算量并延长执行时间。因此,我们应该评估这种权衡是否适合我们的应用程序用例。


原文链接:NLP波束搜索图解 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#网络高级 笔记

modbus_tcp协议 modbus_rtu协议和modbus库 http协议和web服务器搭建 服务器原码分析和基于WebServer的工业数据采集项目 第H5&#xff0c;即网页制作&#xff0c;项目完善 一、modbus起源 1.起源 Modbus由Modicon公司于1979年开发&#xff0c;是一种工业现场总线协议标准 Mo…

Harmony(鸿蒙)使用之Bugly的简单使用

Bugly环境&#xff1a;Bugly Harmony 版本&#xff0c;支持Harmony OS Next平台 开发工具版本&#xff1a;DevEco Studio NEXT Developer Beta1&#xff08;以上&#xff09;&#xff0c;API 12 步骤一、创建产品&#xff0c;填写产品相关信息 1、注册完成后&#xff0c;可在…

R 语言学习教程,从入门到精通,R 绘图 中文支持(25)

1、R 绘图 中文支持 不同系统的字体库目录&#xff1a; Linux 一般在 /usr/share/fonts 下&#xff0c;我们可以使用 fc-list 命令查看&#xff1a; # fc-list /usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf: DejaVu Serif:styleBold /usr/share/fonts/truetype/de…

vue事件监听

我们可以使用 v-on 指令 (简写为 ) 来监听 DOM 事件&#xff0c;并在事件触发时执行对应的 1.回车事件&#xff08;点击回车触发&#xff09; confirm 适用uni-app keyup.enter 适用vue3 运用场景&#xff1a;通常在文本框输入的时候使用 2.点击事件&#xff08;鼠标左键…

基于ZYNQ FPGA+DSP C6678坚固型高性能数据采集与运动控制系统

基于FPGADSP的实时控制系统架构的坚固型高性能运动控制器&#xff0c;支持多通道并行同步实时高速采样&#xff0c;并直接通过底层逐点传递给DSP算法处理&#xff0c;以保证实时性&#xff0c;可以实现高速的逐点控制输出&#xff0c;确保了控制系统能够在多输入多输出高速控制…

PDF文件的读取与合并:使用PyPDF2与ReportLab

目录 一、PyPDF2库基础 1.1 PyPDF2简介 1.2 安装PyPDF2 1.3 读取PDF内容 1.4 合并PDF文件 二、ReportLab库基础 2.1 ReportLab简介 2.2 安装ReportLab 2.3 使用ReportLab生成PDF文本 2.4 ReportLab 与 PyPDF2 结合使用 三、注意事项与最佳实践 3.1 文本提取的局限性…

HW数通IA笔记2-网络参考模型

目录 零、本章主要内容 一、应用和数据 二、网络参考模型与标准协议 2.2 TCP/IP参考模型 2.3 TCP/IP常见协议 2.3.1 应用层 2.3.2 传输层 2.3.3 网络层 2.3.4 数据链路层 2.3.5 物理层 2.4 常见的协议标准化组织 三、数据的通信过程 零、本章主要内容 1、理解数据的…

高级MySQL数据库备份脚本

高级MySQL数据库备份脚本 主要功能项目构成credentials.txtsettings.confmysql-dump.sh SFTP备份配置&#xff1a;生成 SSH 密钥对将公钥复制到 SFTP 服务器测试无密码登录 邮件发送配置安装插件sendmail、mailx修改mail配置获取邮箱授权码 如何执行备份执行备份脚本计划每日的…

【数据结构-前缀异或和】力扣1371. 每个元音包含偶数次的最长子字符串

给你一个字符串 s &#xff0c;请你返回满足以下条件的最长子字符串的长度&#xff1a;每个元音字母&#xff0c;即 ‘a’&#xff0c;‘e’&#xff0c;‘i’&#xff0c;‘o’&#xff0c;‘u’ &#xff0c;在子字符串中都恰好出现了偶数次。 示例 1&#xff1a; 输入&…

PyCharm 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 设置编辑器字体3. 选择外观字体 前言 PyCharm 自定义字体大小&#xff0c;统一设置为 JetBrains Mono 具体操作 【File】>【Settings...】>【Editor】>【Font】 统一设置为字体样式 JetB…

JVM上篇:内存与垃圾回收篇-13-垃圾回收器

笔记来源&#xff1a;尚硅谷 JVM 全套教程&#xff0c;百万播放&#xff0c;全网巅峰&#xff08;宋红康详解 java 虚拟机&#xff09; 文章目录 13. 垃圾回收器13.1. GC 分类与性能指标13.1.1. 垃圾回收器概述13.1.2. 垃圾收集器分类13.1.3. 评估 GC 的性能指标吞吐量暂停时间…

X86架构(五)——栈操作与寻址操作

我们先采用 X86架构(四) 所学知识&#xff0c;在显示器上显示 123...100 ;代码清单7-1;文件名&#xff1a;c07_mbr.asm;文件说明&#xff1a;硬盘主引导扇区代码;创建日期&#xff1a;2011-4-13 18:02jmp near __startmessage db 123...100 __start:mov ax, 0x7c0 ;数据段基…

APP封装安装配置参考说明

APP封装安装配置参考说明 一, 环境准备 宝塔环境 nginx php5.6 mysql5.6 java-openjdk1.8 apktool 1,安装 nginx,php,mysql自行安装 java-openjdk1.8 安装 推荐使用命令行安装 1.1 yum install java-1.8.0-openjdk1.2 yum install -y java-1.8.0-openjdk-devel1.3 设置…

Intellij Idea + Git 完美实战!

环境准备 使用前需要安装一个远程的 Git 仓库和本地的 Git 客户端。由于IDEA中的Git插件需要依赖本地Git客户端&#xff0c;所以需要进行如下配置&#xff1a; 如果本地已有项目&#xff0c;直接通过如下操作&#xff0c;即可在远程自动创建仓库并关联 1. 克隆远程仓库代码&am…

halcon4

图像采集助手-Image Aequisition 1.配置相机IP 和巨型帧等 2.通过海康MVS软件 找到 对应halcon 版本 3. 找到对应halcon版本的 海康相机文件 4.找到Halocn文件目录 粘贴上图文件 通过halcon 助手 -Image Aequisition -自动检测 -找到MVision接口 连接相机 采集图像 实时…

一句话概括TMMi的每个PA

TMMi&#xff08;Test Maturity Model Integration&#xff0c;测试成熟度模型集成&#xff09;是一个由TMMi基金会开发的非商业化的测试成熟度模型&#xff0c;是对CMMI模型的一个补充。它可以帮助组织使测试过程从未管理的状态进化为已管理、已定义、已测量和优化的状态。 T…

网站建设完成后,视频类网站如何做seo

视频类网站的SEO优化是一个综合性的工作&#xff0c;涉及从内容优化、技术优化到外部链接建设等多个方面。由于视频类网站主要提供的是视频内容&#xff0c;其SEO优化不仅需要关注常规的网页优化技巧&#xff0c;还需要考虑视频特有的元素和用户行为模式。以下是针对视频类网站…

Xilinx高速接口之GTP

简介 开坑计划中&#xff0c;主要参考ug482 主要讲解结构以及原语 以及时钟路由和一些其他的 GTP_COMMON还好&#xff0c;需要设置的不多&#xff0c;原语也短&#xff0c; GTP_CHANNEL需要设置的东西真多&#xff0c;原语也长 还好有官方参考例程以及自动生成的原语例化 不然…

0基础学习Python路径(31)logging模块

Python logging 模块定义了为应用程序和库实现灵活的事件日志记录的函数和类。 程序开发过程中&#xff0c;很多程序都有记录日志的需求&#xff0c;并且日志包含的信息有正常的程序访问日志还可能有错误、警告等信息输出&#xff0c;Python 的 logging 模块提供了标准的日志接…

OpenCV绘图函数(4)绘制轮廓线的函数drawContours()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 函数会在图像中绘制轮廓线&#xff0c;如果 thickness ≥ 0&#xff0c;则绘制轮廓线&#xff1b;如果 thickness < 0&#xff0c;则填充由轮…