10. 现代循环神经网络navigate_next 10.8. 束搜索
快速搜索
代码
显示源代码
预览版本 PyTorch MXNet Notebooks 课程 GitHub 中文版
Dive into Deep Learning
目录
  • 前言
  • 安装
  • 符号
  • 1. 引言
  • 2. 预备知识
    • 2.1. 数据操作
    • 2.2. 数据预处理
    • 2.3. 线性代数
    • 2.4. 微积分
    • 2.5. 自动微分
    • 2.6. 概率与统计
    • 2.7. 文档
  • 3. 用于回归的线性神经网络
    • 3.1. 线性回归
    • 3.2. 面向对象的实现设计
    • 3.3. 合成回归数据
    • 3.4. 从零开始实现线性回归
    • 3.5. 线性回归的简洁实现
    • 3.6. 泛化
    • 3.7. 权重衰减
  • 4. 用于分类的线性神经网络
    • 4.1. Softmax 回归
    • 4.2. 图像分类数据集
    • 4.3. 基础分类模型
    • 4.4. 从零开始实现 Softmax 回归
    • 4.5. Softmax 回归的简洁实现
    • 4.6. 分类中的泛化
    • 4.7. 环境和分布偏移
  • 5. 多层感知机
    • 5.1. 多层感知机
    • 5.2. 多层感知机的实现
    • 5.3. 前向传播、反向传播和计算图
    • 5.4. 数值稳定性和初始化
    • 5.5. 深度学习中的泛化
    • 5.6. 暂退法 (Dropout)
    • 5.7. 在 Kaggle 上预测房价
  • 6. 构造指南
    • 6.1. 层和模块
    • 6.2. 参数管理
    • 6.3. 参数初始化
    • 6.4. 惰性初始化
    • 6.5. 自定义层
    • 6.6. 文件 I/O
    • 6.7. GPU
  • 7. 卷积神经网络
    • 7.1. 从全连接层到卷积
    • 7.2. 图像卷积
    • 7.3. 填充和步幅
    • 7.4. 多输入多输出通道
    • 7.5. 池化层
    • 7.6. 卷积神经网络 (LeNet)
  • 8. 现代卷积神经网络
    • 8.1. 深度卷积神经网络 (AlexNet)
    • 8.2. 使用块的网络 (VGG)
    • 8.3. 网络中的网络 (NiN)
    • 8.4. 多分支网络 (GoogLeNet)
    • 8.5. 批量归一化
    • 8.6. 残差网络 (ResNet) 和 ResNeXt
    • 8.7. 稠密连接网络 (DenseNet)
    • 8.8. 设计卷积网络架构
  • 9. 循环神经网络
    • 9.1. 处理序列
    • 9.2. 将原始文本转换为序列数据
    • 9.3. 语言模型
    • 9.4. 循环神经网络
    • 9.5. 从零开始实现循环神经网络
    • 9.6. 循环神经网络的简洁实现
    • 9.7. 时间反向传播
  • 10. 现代循环神经网络
    • 10.1. 长短期记忆网络 (LSTM)
    • 10.2. 门控循环单元 (GRU)
    • 10.3. 深度循环神经网络
    • 10.4. 双向循环神经网络
    • 10.5. 机器翻译和数据集
    • 10.6. 编码器-解码器架构
    • 10.7. 用于机器翻译的序列到序列学习
    • 10.8. 束搜索
  • 11. 注意力机制和 Transformer
    • 11.1. 查询、键和值
    • 11.2. 基于相似度的注意力池化
    • 11.3. 注意力评分函数
    • 11.4. 巴达诺注意力机制
    • 11.5. 多头注意力
    • 11.6. 自注意力和位置编码
    • 11.7. Transformer 架构
    • 11.8. 用于视觉的 Transformer
    • 11.9. 使用 Transformer 进行大规模预训练
  • 12. 优化算法
    • 12.1. 优化与深度学习
    • 12.2. 凸性
    • 12.3. 梯度下降
    • 12.4. 随机梯度下降
    • 12.5. 小批量随机梯度下降
    • 12.6. 动量法
    • 12.7. Adagrad
    • 12.8. RMSProp
    • 12.9. Adadelta
    • 12.10. Adam
    • 12.11. 学习率调度
  • 13. 计算性能
    • 13.1. 编译器和解释器
    • 13.2. 异步计算
    • 13.3. 自动并行
    • 13.4. 硬件
    • 13.5. 在多个 GPU 上训练
    • 13.6. 多个 GPU 的简洁实现
    • 13.7. 参数服务器
  • 14. 计算机视觉
    • 14.1. 图像增广
    • 14.2. 微调
    • 14.3. 目标检测和边界框
    • 14.4. 锚框
    • 14.5. 多尺度目标检测
    • 14.6. 目标检测数据集
    • 14.7. 单发多框检测 (SSD)
    • 14.8. 区域卷积神经网络 (R-CNNs)
    • 14.9. 语义分割和数据集
    • 14.10. 转置卷积
    • 14.11. 全卷积网络
    • 14.12. 神经风格迁移
    • 14.13. Kaggle 上的图像分类 (CIFAR-10)
    • 14.14. Kaggle 上的狗品种识别 (ImageNet Dogs)
  • 15. 自然语言处理:预训练
    • 15.1. 词嵌入 (word2vec)
    • 15.2. 近似训练
    • 15.3. 用于预训练词嵌入的数据集
    • 15.4. 预训练 word2vec
    • 15.5. 全局向量词嵌入 (GloVe)
    • 15.6. 子词嵌入
    • 15.7. 词相似性和类比
    • 15.8. 来自 Transformer 的双向编码器表示 (BERT)
    • 15.9. 用于预训练 BERT 的数据集
    • 15.10. 预训练 BERT
  • 16. 自然语言处理:应用
    • 16.1. 情感分析和数据集
    • 16.2. 情感分析:使用循环神经网络
    • 16.3. 情感分析:使用卷积神经网络
    • 16.4. 自然语言推断和数据集
    • 16.5. 自然语言推断:使用注意力机制
    • 16.6. 为序列级和词元级应用微调 BERT
    • 16.7. 自然语言推断:微调 BERT
  • 17. 强化学习
    • 17.1. 马尔可夫决策过程 (MDP)
    • 17.2. 值迭代
    • 17.3. Q-学习
  • 18. 高斯过程
    • 18.1. 高斯过程简介
    • 18.2. 高斯过程先验
    • 18.3. 高斯过程推断
  • 19. 超参数优化
    • 19.1. 什么是超参数优化?
    • 19.2. 超参数优化 API
    • 19.3. 异步随机搜索
    • 19.4. 多保真度超参数优化
    • 19.5. 异步逐次减半
  • 20. 生成对抗网络
    • 20.1. 生成对抗网络
    • 20.2. 深度卷积生成对抗网络
  • 21. 推荐系统
    • 21.1. 推荐系统概述
    • 21.2. MovieLens 数据集
    • 21.3. 矩阵分解
    • 21.4. AutoRec:使用自编码器进行评分预测
    • 21.5. 推荐系统的个性化排序
    • 21.6. 用于个性化排序的神经协同过滤
    • 21.7. 序列感知推荐系统
    • 21.8. 特征丰富的推荐系统
    • 21.9. 分解机
    • 21.10. 深度分解机
  • 22. 附录:深度学习的数学
    • 22.1. 几何与线性代数运算
    • 22.2. 特征分解
    • 22.3. 单变量微积分
    • 22.4. 多变量微积分
    • 22.5. 积分学
    • 22.6. 随机变量
    • 22.7. 最大似然
    • 22.8. 分布
    • 22.9. 朴素贝叶斯
    • 22.10. 统计学
    • 22.11. 信息论
  • 23. 附录:深度学习工具
    • 23.1. 使用 Jupyter Notebooks
    • 23.2. 使用 Amazon SageMaker
    • 23.3. 使用 AWS EC2 实例
    • 23.4. 使用 Google Colab
    • 23.5. 选择服务器和 GPU
    • 23.6. 为本书做贡献
    • 23.7. 实用函数和类
    • 23.8. d2l API 文档
  • 参考文献
Dive into Deep Learning
目录
  • 前言
  • 安装
  • 符号
  • 1. 引言
  • 2. 预备知识
    • 2.1. 数据操作
    • 2.2. 数据预处理
    • 2.3. 线性代数
    • 2.4. 微积分
    • 2.5. 自动微分
    • 2.6. 概率与统计
    • 2.7. 文档
  • 3. 用于回归的线性神经网络
    • 3.1. 线性回归
    • 3.2. 面向对象的实现设计
    • 3.3. 合成回归数据
    • 3.4. 从零开始实现线性回归
    • 3.5. 线性回归的简洁实现
    • 3.6. 泛化
    • 3.7. 权重衰减
  • 4. 用于分类的线性神经网络
    • 4.1. Softmax 回归
    • 4.2. 图像分类数据集
    • 4.3. 基础分类模型
    • 4.4. 从零开始实现 Softmax 回归
    • 4.5. Softmax 回归的简洁实现
    • 4.6. 分类中的泛化
    • 4.7. 环境和分布偏移
  • 5. 多层感知机
    • 5.1. 多层感知机
    • 5.2. 多层感知机的实现
    • 5.3. 前向传播、反向传播和计算图
    • 5.4. 数值稳定性和初始化
    • 5.5. 深度学习中的泛化
    • 5.6. 暂退法 (Dropout)
    • 5.7. 在 Kaggle 上预测房价
  • 6. 构造指南
    • 6.1. 层和模块
    • 6.2. 参数管理
    • 6.3. 参数初始化
    • 6.4. 惰性初始化
    • 6.5. 自定义层
    • 6.6. 文件 I/O
    • 6.7. GPU
  • 7. 卷积神经网络
    • 7.1. 从全连接层到卷积
    • 7.2. 图像卷积
    • 7.3. 填充和步幅
    • 7.4. 多输入多输出通道
    • 7.5. 池化层
    • 7.6. 卷积神经网络 (LeNet)
  • 8. 现代卷积神经网络
    • 8.1. 深度卷积神经网络 (AlexNet)
    • 8.2. 使用块的网络 (VGG)
    • 8.3. 网络中的网络 (NiN)
    • 8.4. 多分支网络 (GoogLeNet)
    • 8.5. 批量归一化
    • 8.6. 残差网络 (ResNet) 和 ResNeXt
    • 8.7. 稠密连接网络 (DenseNet)
    • 8.8. 设计卷积网络架构
  • 9. 循环神经网络
    • 9.1. 处理序列
    • 9.2. 将原始文本转换为序列数据
    • 9.3. 语言模型
    • 9.4. 循环神经网络
    • 9.5. 从零开始实现循环神经网络
    • 9.6. 循环神经网络的简洁实现
    • 9.7. 时间反向传播
  • 10. 现代循环神经网络
    • 10.1. 长短期记忆网络 (LSTM)
    • 10.2. 门控循环单元 (GRU)
    • 10.3. 深度循环神经网络
    • 10.4. 双向循环神经网络
    • 10.5. 机器翻译和数据集
    • 10.6. 编码器-解码器架构
    • 10.7. 用于机器翻译的序列到序列学习
    • 10.8. 束搜索
  • 11. 注意力机制和 Transformer
    • 11.1. 查询、键和值
    • 11.2. 基于相似度的注意力池化
    • 11.3. 注意力评分函数
    • 11.4. 巴达诺注意力机制
    • 11.5. 多头注意力
    • 11.6. 自注意力和位置编码
    • 11.7. Transformer 架构
    • 11.8. 用于视觉的 Transformer
    • 11.9. 使用 Transformer 进行大规模预训练
  • 12. 优化算法
    • 12.1. 优化与深度学习
    • 12.2. 凸性
    • 12.3. 梯度下降
    • 12.4. 随机梯度下降
    • 12.5. 小批量随机梯度下降
    • 12.6. 动量法
    • 12.7. Adagrad
    • 12.8. RMSProp
    • 12.9. Adadelta
    • 12.10. Adam
    • 12.11. 学习率调度
  • 13. 计算性能
    • 13.1. 编译器和解释器
    • 13.2. 异步计算
    • 13.3. 自动并行
    • 13.4. 硬件
    • 13.5. 在多个 GPU 上训练
    • 13.6. 多个 GPU 的简洁实现
    • 13.7. 参数服务器
  • 14. 计算机视觉
    • 14.1. 图像增广
    • 14.2. 微调
    • 14.3. 目标检测和边界框
    • 14.4. 锚框
    • 14.5. 多尺度目标检测
    • 14.6. 目标检测数据集
    • 14.7. 单发多框检测 (SSD)
    • 14.8. 区域卷积神经网络 (R-CNNs)
    • 14.9. 语义分割和数据集
    • 14.10. 转置卷积
    • 14.11. 全卷积网络
    • 14.12. 神经风格迁移
    • 14.13. Kaggle 上的图像分类 (CIFAR-10)
    • 14.14. Kaggle 上的狗品种识别 (ImageNet Dogs)
  • 15. 自然语言处理:预训练
    • 15.1. 词嵌入 (word2vec)
    • 15.2. 近似训练
    • 15.3. 用于预训练词嵌入的数据集
    • 15.4. 预训练 word2vec
    • 15.5. 全局向量词嵌入 (GloVe)
    • 15.6. 子词嵌入
    • 15.7. 词相似性和类比
    • 15.8. 来自 Transformer 的双向编码器表示 (BERT)
    • 15.9. 用于预训练 BERT 的数据集
    • 15.10. 预训练 BERT
  • 16. 自然语言处理:应用
    • 16.1. 情感分析和数据集
    • 16.2. 情感分析:使用循环神经网络
    • 16.3. 情感分析:使用卷积神经网络
    • 16.4. 自然语言推断和数据集
    • 16.5. 自然语言推断:使用注意力机制
    • 16.6. 为序列级和词元级应用微调 BERT
    • 16.7. 自然语言推断:微调 BERT
  • 17. 强化学习
    • 17.1. 马尔可夫决策过程 (MDP)
    • 17.2. 值迭代
    • 17.3. Q-学习
  • 18. 高斯过程
    • 18.1. 高斯过程简介
    • 18.2. 高斯过程先验
    • 18.3. 高斯过程推断
  • 19. 超参数优化
    • 19.1. 什么是超参数优化?
    • 19.2. 超参数优化 API
    • 19.3. 异步随机搜索
    • 19.4. 多保真度超参数优化
    • 19.5. 异步逐次减半
  • 20. 生成对抗网络
    • 20.1. 生成对抗网络
    • 20.2. 深度卷积生成对抗网络
  • 21. 推荐系统
    • 21.1. 推荐系统概述
    • 21.2. MovieLens 数据集
    • 21.3. 矩阵分解
    • 21.4. AutoRec:使用自编码器进行评分预测
    • 21.5. 推荐系统的个性化排序
    • 21.6. 用于个性化排序的神经协同过滤
    • 21.7. 序列感知推荐系统
    • 21.8. 特征丰富的推荐系统
    • 21.9. 分解机
    • 21.10. 深度分解机
  • 22. 附录:深度学习的数学
    • 22.1. 几何与线性代数运算
    • 22.2. 特征分解
    • 22.3. 单变量微积分
    • 22.4. 多变量微积分
    • 22.5. 积分学
    • 22.6. 随机变量
    • 22.7. 最大似然
    • 22.8. 分布
    • 22.9. 朴素贝叶斯
    • 22.10. 统计学
    • 22.11. 信息论
  • 23. 附录:深度学习工具
    • 23.1. 使用 Jupyter Notebooks
    • 23.2. 使用 Amazon SageMaker
    • 23.3. 使用 AWS EC2 实例
    • 23.4. 使用 Google Colab
    • 23.5. 选择服务器和 GPU
    • 23.6. 为本书做贡献
    • 23.7. 实用函数和类
    • 23.8. d2l API 文档
  • 参考文献

10.8. 束搜索¶
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 SageMaker Studio Lab 中打开 Notebook

在 第 10.7 节中,我们介绍了编码器—解码器架构,以及端到端训练它们的标准技术。然而,在测试时预测方面,我们只提到了*贪心*策略,即在每个时间步,我们选择具有最高预测概率的词元作为下一个词元,直到在某个时间步,我们预测出特殊的序列结束“<eos>”词元。在本节中,我们将首先形式化这种*贪心搜索*(greedy search)策略,并指出从业者倾向于遇到的一些问题。随后,我们将此策略与两种替代方案进行比较:*穷举搜索*(exhaustive search)(说明性但并不实用)和*束搜索*(beam search)(实践中的标准方法)。

让我们首先建立我们的数学符号,借鉴 第 10.7 节的约定。在任何时间步 \(t'\),解码器输出预测,表示词汇表中每个词元在序列中下一个出现的概率(\(y_{t'+1}\)的可能值),该概率以先前的词元 \(y_1, \ldots, y_{t'}\)和由编码器生成的代表输入序列的上下文变量 \(\mathbf{c}\)为条件。为了量化计算成本,用 \(\mathcal{Y}\)表示输出词汇表(包括特殊的序列结束词元“<eos>”)。我们还将输出序列的最大词元数指定为 \(T'\)。我们的目标是从所有 \(\mathcal{O}(\left|\mathcal{Y}\right|^{T'})\)个可能的输出序列中搜索一个理想的输出。请注意,这个数字略微高估了不同输出的数量,因为一旦出现“<eos>”词元,就不会有后续的词元了。然而,就我们的目的而言,这个数字大致反映了搜索空间的大小。

10.8.1. 贪心搜索¶

考虑 第 10.7 节中简单的*贪心搜索*策略。在这里,在任何时间步 \(t'\),我们都从 \(\mathcal{Y}\)中简单地选择具有最高条件概率的词元,即

(10.8.1)¶\[y_{t'} = \operatorname*{argmax}_{y \in \mathcal{Y}} P(y \mid y_1, \ldots, y_{t'-1}, \mathbf{c}).\]

一旦我们的模型输出“<eos>”(或者我们达到最大长度 \(T'\)),输出序列就完成了。

这个策略看起来可能很合理,实际上也不算太差!考虑到它的计算要求不高,你很难用更少的代价获得更多的回报。然而,如果我们暂时不考虑效率,搜索*最可能的序列*,而不是(贪心选择的)*最可能的词元*序列,可能看起来更合理。事实证明,这两者可能大相径庭。最可能的序列是最大化表达式 \(\prod_{t'=1}^{T'} P(y_{t'} \mid y_1, \ldots, y_{t'-1}, \mathbf{c})\)的序列。在我们的机器翻译示例中,如果解码器真正恢复了底层生成过程的概率,那么这将为我们提供最可能的翻译。不幸的是,不能保证贪心搜索会给我们这个序列。

让我们用一个例子来说明。假设输出词典中有四个词元“A”、“B”、“C”和“<eos>”。在 图 10.8.1中,每个时间步下的四个数字分别表示在该时间步生成“A”、“B”、“C”和“<eos>”的条件概率。

../_images/s2s-prob1.svg

图 10.8.1 在每个时间步,贪心搜索选择具有最高条件概率的词元。¶

在每个时间步,贪心搜索选择具有最高条件概率的词元。因此,输出序列“A”、“B”、“C”和“<eos>”将被预测(图 10.8.1)。此输出序列的条件概率是 \(0.5\times0.4\times0.4\times0.6 = 0.048\)。

接下来,让我们看 图 10.8.2中的另一个例子。与 图 10.8.1不同,在时间步 2,我们选择了词元“C”,它具有*第二*高的条件概率。

../_images/s2s-prob2.svg

图 10.8.2 每个时间步下的四个数字表示在该时间步生成“A”、“B”、“C”和“<eos>”的条件概率。在时间步 2,选择了具有第二高条件概率的词元“C”。¶

由于时间步 3 所基于的时间步 1 和 2 的输出子序列已经从 图 10.8.1中的“A”和“B”变为 图 10.8.2中的“A”和“C”,因此时间步 3 每个词元的条件概率在 图 10.8.2中也发生了变化。假设我们在时间步 3 选择词元“B”。现在时间步 4 的条件是前三个时间步的输出子序列“A”、“C”和“B”,这与 图 10.8.1中的“A”、“B”和“C”不同。因此,在 图 10.8.2中时间步 4 生成每个词元的条件概率也与 图 10.8.1中的不同。结果,在 图 10.8.2中输出序列“A”、“C”、“B”和“<eos>”的条件概率是 \(0.5\times0.3 \times0.6\times0.6=0.054\),这比 图 10.8.1中贪心搜索的概率要大。在这个例子中,通过贪心搜索获得的输出序列“A”、“B”、“C”和“<eos>”并非最优。

10.8.2. 穷举搜索¶

如果目标是获得最可能的序列,我们可以考虑使用*穷举搜索*:枚举所有可能的输出序列及其条件概率,然后输出预测概率最高的那个。

虽然这肯定能得到我们想要的结果,但它会带来高得令人望而却步的计算成本 \(\mathcal{O}(\left|\mathcal{Y}\right|^{T'})\),该成本在序列长度上是指数级的,并且基数巨大,由词汇表大小决定。例如,当 \(|\mathcal{Y}|=10000\) 和 \(T'=10\)时(与实际应用中的数字相比,这两个数字都很小),我们将需要评估 \(10000^{10} = 10^{40}\)个序列,这已经超出了任何可预见的计算机的能力。另一方面,贪心搜索的计算成本是 \(\mathcal{O}(\left|\mathcal{Y}\right|T')\):惊人地便宜但远非最优。例如,当 \(|\mathcal{Y}|=10000\) 和 \(T'=10\)时,我们只需要评估 \(10000\times10=10^5\)个序列。

10.8.3. 束搜索¶

你可以将序列解码策略看作一个谱系,*束搜索*在贪心搜索的效率和穷举搜索的最优性之间取得了折中。束搜索最直接的版本由一个超参数来表征,即*束宽*(beam size) \(k\)。让我们来解释一下这个术语。在时间步 1,我们选择具有最高预测概率的 \(k\)个词元。它们中的每一个将分别成为 \(k\)个候选输出序列的第一个词元。在每个后续的时间步,基于前一个时间步的 \(k\)个候选输出序列,我们继续从 \(k\left|\mathcal{Y}\right|\)个可能的选择中选出 \(k\)个具有最高预测概率的候选输出序列。

../_images/beam-search.svg

图 10.8.3 束搜索的过程(束宽 \(=2\);输出序列的最大长度 \(=3\))。候选输出序列是 \(\mathit{A}\)、\(\mathit{C}\)、\(\mathit{AB}\)、\(\mathit{CE}\)、\(\mathit{ABD}\) 和 \(\mathit{CED}\)。¶

图 10.8.3用一个例子演示了束搜索的过程。假设输出词汇表只包含五个元素:\(\mathcal{Y} = \{A, B, C, D, E\}\),其中一个是“<eos>”。设束宽为 2,输出序列的最大长度为 3。在时间步 1,假设具有最高条件概率 \(P(y_1 \mid \mathbf{c})\)的词元是 \(A\)和 \(C\)。在时间步 2,对于所有 \(y_2 \in \mathcal{Y},\)我们计算

(10.8.2)¶\[\begin{split}\begin{aligned}P(A, y_2 \mid \mathbf{c}) = P(A \mid \mathbf{c})P(y_2 \mid A, \mathbf{c}),\\ P(C, y_2 \mid \mathbf{c}) = P(C \mid \mathbf{c})P(y_2 \mid C, \mathbf{c}),\end{aligned}\end{split}\]

并从这十个值中选出最大的两个,比如说 \(P(A, B \mid \mathbf{c})\) 和 \(P(C, E \mid \mathbf{c})\)。然后在时间步 3,对于所有 \(y_3 \in \mathcal{Y}\),我们计算

(10.8.3)¶\[\begin{split}\begin{aligned}P(A, B, y_3 \mid \mathbf{c}) = P(A, B \mid \mathbf{c})P(y_3 \mid A, B, \mathbf{c}),\\P(C, E, y_3 \mid \mathbf{c}) = P(C, E \mid \mathbf{c})P(y_3 \mid C, E, \mathbf{c}),\end{aligned}\end{split}\]

并从这十个值中选出最大的两个,比如说 \(P(A, B, D \mid \mathbf{c})\) 和 \(P(C, E, D \mid \mathbf{c})\)。结果,我们得到六个候选输出序列:(i) \(A\);(ii) \(C\);(iii) \(A\), \(B\);(iv) \(C\), \(E\);(v) \(A\), \(B\), \(D\);和 (vi) \(C\), \(E\), \(D\)。

最后,我们基于这六个序列获得最终候选输出序列的集合(例如,丢弃包括“<eos>”及其之后的部分)。然后我们选择使以下分数最大化的输出序列

(10.8.4)¶\[\frac{1}{L^\alpha} \log P(y_1, \ldots, y_{L}\mid \mathbf{c}) = \frac{1}{L^\alpha} \sum_{t'=1}^L \log P(y_{t'} \mid y_1, \ldots, y_{t'-1}, \mathbf{c});\]

这里 \(L\)是最终候选序列的长度,而 \(\alpha\)通常设为 0.75。由于较长的序列在 (10.8.4)的求和中有更多的对数项,分母中的项 \(L^\alpha\)会对长序列进行惩罚。

束搜索的计算成本为 \(\mathcal{O}(k\left|\mathcal{Y}\right|T')\)。这个结果介于贪心搜索和穷举搜索之间。贪心搜索可以被看作是束宽设置为 1 时的束搜索特例。

10.8.4. 小结¶

序列搜索策略包括贪心搜索、穷举搜索和束搜索。束搜索通过灵活选择束宽,在准确性和计算成本之间进行权衡。

10.8.5. 练习¶

  1. 我们可以将穷举搜索视为一种特殊类型的束搜索吗?为什么可以或为什么不可以?

  2. 在 第 10.7 节的机器翻译问题中应用束搜索。束宽如何影响翻译结果和预测速度?

  3. 在 第 9.5 节中,我们使用语言模型来生成用户提供的前缀之后的文本。它使用了哪种搜索策略?你能改进它吗?

讨论

目录

  • 10.8. 束搜索
    • 10.8.1. 贪心搜索
    • 10.8.2. 穷举搜索
    • 10.8.3. 束搜索
    • 10.8.4. 小结
    • 10.8.5. 练习
上一页
10.7. 用于机器翻译的序列到序列学习
下一页
11. 注意力机制和 Transformer