【深度学习】序列生成模型(二):束搜索

文章目录

    • 序列生成
    • 束搜索
      • 理论基础
      • 算法步骤
      • python实现

序列生成

  在进行最大似然估计训练后的模型 p θ ( x ∣ x 1 : ( t − 1 ) ) p_\theta(x | \mathbf{x}_{1:(t-1)}) pθ(xx1:(t1)),我们可以使用该模型进行序列生成。生成的过程是按照时间顺序逐步生成序列样本。假设在第 t t t 步,我们已经生成了前 t − 1 t-1 t1 步的序列前缀 x 1 : ( t − 1 ) = x 1 , … , x t − 1 \mathbf{x}_{1:(t-1)} = x_1, \ldots, x_{t-1} x1:(t1)=x1,,xt1,我们希望在当前步生成下一个词 x t x_t xt。生成的过程可以用以下概率分布表示:

x t ∼ p θ ( x ∣ x 1 : ( t − 1 ) ) x_t \sim p_\theta(x | \mathbf{x}_{1:(t-1)}) xtpθ(xx1:(t1))

其中, x 1 : ( t − 1 ) \mathbf{x}_{1:(t-1)} x1:(t1) 是已经生成的前缀序列, x t x_t xt 是在给定前缀序列的条件下,由模型生成的当前时刻的词。

  这个过程可以迭代进行,直到生成完整的序列样本。在每一步,模型根据已经生成的前缀序列生成当前时刻的词,然后将当前时刻的词添加到前缀序列中,用于生成下一个时刻的词。

生成的序列样本可以用如下方式表示:

x ^ = x ^ 1 , x ^ 2 , … , x ^ T \mathbf{\hat{x}} = \hat{x}_1, \hat{x}_2, \ldots, \hat{x}_T x^=x^1,x^2,,x^T

其中, x ^ t \hat{x}_t x^t 是在第 t t t 步生成的词, x ^ \mathbf{\hat{x}} x^ 是完整的生成序列。这个过程是根据训练得到的模型对数据分布进行采样,从而生成新的符合训练数据分布的序列。

  自回归的方式可以生成一个无限长度的序列.为了避免这种情况,通常会设置一个特殊的符号⟨𝐸𝑂𝑆⟩(End-of-Sequence)来表示序列的结束.在训练时,每个序列样本的结尾都会加上结束符号 ⟨ EOS ⟩ \langle \text{EOS} \rangle EOS。训练模型时,这有助于模型学习何时停止生成。在测试时,一旦生成了结束符号 ⟨ EOS ⟩ \langle \text{EOS} \rangle EOS,模型就会中止生成过程。

束搜索

理论基础

  在每个时间步,自回归模型贪婪搜索选择当前条件概率分布中具有最高概率的词作为生成的词。具体而言,对于每个时间步 t t t,生成的词 x ^ t \hat{x}_t x^t是:

x ^ t = arg ⁡ max ⁡ x ∈ V p θ ( x ∣ x 1 : ( t − 1 ) ) \hat{x}_t = \arg\max_{x \in \mathcal{V}} p_\theta(x | \mathbf{x}_{1:(t-1)}) x^t=argxVmaxpθ(xx1:(t1))

其中, V \mathcal{V} V 是词表, x 1 : ( t − 1 ) = x ^ 1 , … , x ^ t − 1 \mathbf{x}_{1:(t-1)} = \hat{x}_1, \ldots, \hat{x}_{t-1} x1:(t1)=x^1,,x^t1 是前 t − 1 t-1 t1 步中已经生成的前缀序列。

  这种贪婪搜索策略是一种简单且直观的方法,但它有一个主要的缺点,即可能导致生成的序列不是全局最优的。由于在每个时间步都选择了局部最大概率的词,生成的序列并不保证是整个序列的全局最大概率。这种策略可能导致生成的序列缺乏一致性或流畅性。
  为了改善这种情况,束搜索(Beam Search)是一种常用的启发式方法,特别在序列生成任务中应用广泛。在束搜索中,每个时间步生成多个备选序列,而不仅仅是一个。这样可以在每个时间步维持一个集合,称为束(beam),其中包含多个备选序列。束的大小由超参数 K K K 决定,通常被称为束大小。
在这里插入图片描述
  在每个时间步,算法选择概率最高的 K K K 个序列作为备选,并将它们作为下一个时间步的输入。这样,算法在整个生成过程中维持了 K K K 条备选序列,允许更全面地探索可能的序列空间。
  束搜索有助于减少搜索空间,提高搜索的效率。然而,束大小 K K K 的选择是一个权衡,较小的 K K K 可能导致搜索空间不够广泛,而较大的 K K K 则会增加计算开销。因此,束大小的选择通常需要根据具体任务和性能需求进行调整。

算法步骤

  1. 初始化: 设置束大小 K K K,初始化一个束(beam)用于存储备选序列。初始时,束中包含一个空序列。

  2. 逐步生成: 对于每个时间步 t t t,执行以下步骤:

    a. 对于束中的每个备选序列,生成下一个词的备选集合。计算条件概率 p θ ( x t ∣ context ) p_\theta(x_t | \text{context}) pθ(xtcontext)

    b. 对于所有的备选序列和它们的备选词,计算在当前时间步的累积概率。

    c. 从所有的备选序列中选择累积概率最高的 K K K个序列作为新的束。

    d. 如果生成了结束符号或达到了最大生成长度,则停止生成。

  3. 输出: 选择束中最终累积概率最高的序列作为最终的生成结果。

python实现

def beam_search(model, initial_context, beam_size, max_length):# 初始化束,初始时包含一个空序列beam = [([], 1.0)]  # 初始序列和初始概率# 逐步生成for t in range(max_length):new_beam = []# 对于束中的每个备选序列for sequence, score in beam:# 生成备选词candidates = generate_candidates(model, sequence, initial_context)# 计算累积概率for candidate in candidates:new_sequence = sequence + [candidate]new_score = score * calculate_probability(model, new_sequence, initial_context)new_beam.append((new_sequence, new_score))# 选择累积概率最高的 K 个序列作为新的束beam = sorted(new_beam, key=lambda x: x[1], reverse=True)[:beam_size]# 判断是否生成了结束符号或达到最大生成长度if is_finished(beam):break# 选择最终累积概率最高的序列作为结果best_sequence = max(beam, key=lambda x: x[1])[0]return best_sequence

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌动智能浅谈云网络流量分析的主要过程

在云计算时代,网络流量分析成为确保网络安全和性能的重要环节。随着企业和组织将应用和服务迁移到云平台,对云网络流量进行深入的分析变得至关重要。本文将介绍云网络流量分析的主要过程,以帮助读者更好地理解如何有效地监控和管理云环境中的…

C++笔记之system()用于在Qt中执行系统命令的习惯

C笔记之system()用于在Qt中执行系统命令的习惯 参考博文:qt-C笔记之std::tostring()、.toStdString()、.toLocal8Bit().constData()的使用场景 code review! 文章目录 C笔记之system()用于在Qt中执行系统命令的习惯一.一般我用的int system( const char *command…

Mybatis的插件运⾏原理,如何编写⼀个插件?

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

优化问题笔记(2)

目录 3. 约束优化问题的全局解3.1 凸优化问题3.2 二次优化问题3.3 无约束二次优化问题3.4 一个典型的二次等式约束二次优化问题 Reference 3. 约束优化问题的全局解 3.1 凸优化问题 局部解成为全局解的一类重要的优化问题是所谓凸优化问题. 我们称优化问题 ( f , D ) (f,\ma…

Apache Flume(4):日志文件监控

1 案例说明 企业中应用程序部署后会将日志写入到文件中,可以使用Flume从各个日志文件将日志收集到日志中心以便于查找和分析。 2 使用Exec Soucre Exec Source Exec Source通过指定命令监控文件的变化,加粗属性为必须设置的。 属性名默认值说明chan…

模型部署之模型转换

一、模型转换的意义 模型部署是为了模型能在不同框架间流转。 在实际应用时,模型转换几户都用于工业部署,负责模型从训练框架到部署侧推理框架的连接,这是因为随着深度学习随着深度学习应用和技术的演进,训练框架和推理框架的职…

02什么是CPU上下文切换

上⼀节, 讲了要怎么理解平均负载( Load Average) , 并⽤三个案例展示了不同场景下平均负载升⾼的分析⽅法。 这其中, 多个进程竞争 CPU 就是⼀个经常被我们忽视的问题。 1、CPU上下文切换的概念 我想你⼀定很好奇&am…

LabVIEW在燃气轮机发电机组励磁控制系统测试中的应用

LabVIEW在燃气轮机发电机组励磁控制系统测试中的应用 燃气轮机发电机组作为一种高效可靠的常备应急电源,在保障发电品质稳定性和可靠性方面发挥着关键作用。其中,励磁控制系统是保证供电质量的重要环节,对发电机组的稳定运行至关重要。为了有…

docker在线安装nginx

1、查看所有镜像 1、不带容器卷常规启动nginx,命令如下 docker run --name nginx-test -p 8089:80 -d a6bd71f48f68 2、在宿主机创建/usr/local/data/nginxdocker/目录,在此目录下创建html和logs文件夹,然后将容器内的 nginx.conf 和 html 下…

【最新版】WSL安装Google Chrome、Microsoft Edge 浏览器

文章目录 一、 安装WSL1. 全新安装2. 现有 WSL 安装 二、运行 Linux GUI 应用1. 安装适用于 Linux 的 Google Chrome步骤 1: 进入 temp 文件夹步骤 2: 使用 wget 下载 Google Chrome 安装包步骤 3: 安装 Google Chrome步骤 4: 修复依赖关系问题步骤 5: 再次配置 Google Chrome步…

计算机组成原理——数制与编码

1.在以下编码中,零的表示唯一的是(C) A.反码 B.原码 C.补码 D.原码和移码 2.假设某数的真值为-100 1010B,在计算机内部表示为1011 0110B,该数采用的编码为(D) A.移码 B.原码 C.反码 D.补码 3.…

Unix进程间通信之简介-总体概述和引子

目录标题 0. 前言1. 概述2. 进程、线程与信息共享3. IPC对象的持续性4. 名字空间5. fork、exec和exit对IPC对象的影响6. 出错处理: 包裹函数7. Unix标准8. 小结 0. 前言 进程间通信这块是学习linux-c编程的关键, 这篇为后续进程间通信技术的引子篇&#…