跳转到主要内容

Pytorch中的序列到序列框架

项目描述

nmtpytorch

License: MIT Python 3.6

点击 此处 加入我们的Slack频道提问。

nmtpytorch 允许训练各种端到端神经网络架构,包括但不限于神经机器翻译、图像标题和自动语音识别系统。最初的代码库是基于 Theano 的,并受到了著名的 dl4mt-tutorial 代码库的启发。

nmtpytorch 主要由 勒芒大学语言和语音团队 开发,但也得到了 2018年弗雷德里克·耶利内克纪念夏季研讨会Grounded Sequence-to-sequence Transduction Team 的重要贡献。

Loic Barrault, Ozan Caglayan, Amanda Duarte, Desmond Elliott, Spandana Gella, Nils Holzenberger, Chirag Lala, Jasmine (Sun Jae) Lee, Jindřich Libovický, Pranava Madhyastha, Florian Metze, Karl Mulligan, Alissa Ostapenko, Shruti Palaskar, Ramon Sanabria, Lucia Specia 和 Josiah Wang。

如果您使用 nmtpytorch,您可能想引用以下 论文

@article{nmtpy2017,
  author    = {Ozan Caglayan and
               Mercedes Garc\'{i}a-Mart\'{i}nez and
               Adrien Bardet and
               Walid Aransa and
               Fethi Bougares and
               Lo\"{i}c Barrault},
  title     = {NMTPY: A Flexible Toolkit for Advanced Neural Machine Translation Systems},
  journal   = {Prague Bull. Math. Linguistics},
  volume    = {109},
  pages     = {15--28},
  year      = {2017},
  url       = {https://ufal.mff.cuni.cz/pbml/109/art-caglayan-et-al.pdf},
  doi       = {10.1515/pralin-2017-0035},
  timestamp = {Tue, 12 Sep 2017 10:01:08 +0100}
}

安装

nmtpytorch 目前需要 python>=3.6torch>=0.4.1。我们目前不计划支持 Python 2.x。

重要: 安装 nmtpytorch 后,您需要运行 nmtpy-install-extra 以将 METEOR 相关文件下载到您的 ${HOME}/.nmtpy 文件夹中。此步骤只需执行一次。

pip

您可以使用 pip(或根据您的操作系统和环境使用 pip3)从 PyPI 安装 nmtpytorch

$ pip install nmtpytorch

这将自动获取并安装依赖项。对于 torch 依赖项,它将特别从 PyPI 安装包含 CUDA 9.0torch 1.0.0 包。

conda

我们在存储库中提供了一个 environment.yml 文件,您可以使用它来创建用于 nmtpytorch 的现成 anaconda 环境。

$ conda update --all
$ git clone https://github.com/lium-lst/nmtpytorch.git
$ conda env create -f nmtpytorch/environment.yml

开发模式

对于持续开发和测试,您只需在您的 GIT 检出根目录中运行 python setup.py develop 即可。从现在起,对源代码树的任何修改都将直接考虑,无需重新安装。

文档

我们目前仅在我们wiki 中提供一些初步文档。

发行说明

此版本支持 Pytorch >= 0.4.1,包括最近的 1.0 版本。相关的 setup.pyenvironment.yml 文件将默认安装 1.0.0

v4.0.0 (18/12/2018)

  • 关键: NumpyDataset 现在为 3D/4D 卷积特征返回形状为 HxW, N, C 的张量,为 2D 特征文件返回形状为 1, N, C 的张量。模型应进行调整以适应这种新的形状。
  • 可以从配置中提供每个分割的 order_fileord: path/to/txt file with integer per line),以灵活地反转、洗牌、平铺 numpy 张量的特征顺序。
  • 增加了更好的维度检查以确保一切正常。
  • 添加了 LabelDataset 以支持单个标签输入/输出,并关联 Vocabulary 进行整数映射。
  • 添加了 handle_oom=(True|False) 参数用于 [train] 部分,以在训练过程中从 GPU 内存不足 (OOM) 错误中恢复。默认情况下,此功能已禁用,您需要从实验配置文件中启用它。请注意,在验证困惑度计算期间仍然可能出现 OOM。如果您遇到这种情况,请减少 eval_batch_size 参数。
  • 添加了 de-hyphen 后处理过滤器,以在早期停止评估期间拼接回 Moses 的激进连字符分割。
  • 添加了可选投影层和层归一化到 TextEncoder
  • 添加了 enc_lnorm, sched_sampling 选项到 NMT,以启用编码器的层归一化并在给定概率下使用 有计划的采样
  • ConditionalDecoder 现在可以使用最大池化编码器状态或最后一个状态进行初始化。
  • 您现在可以通过更改 dec_variant 选项来为 NMT 进行不同的解码器实验。
  • 将所有注意力权重收集到解码器的 self.history 字典中。
  • 添加了带 -N 参数的 n-best 输出到 nmtpy translate
  • 更改了 -Snmtpy translate 中的工作方式。现在您需要始终使用 -s 提供分割名称,但 -S 用于覆盖配置文件中为该分割定义的输入数据源。
  • 删除了解码器初始化的多模态 NMT MNMTDecInit。相同的功能可以通过使用模型选项 dec_init=featsNMT 模型中实现。
  • 新模型 MultimodalNMT:支持编码器初始化、解码器初始化,两者都可以,嵌入与视觉特征的连接、前缀和后缀。该模型几乎覆盖了来自LIUM-CVC的WMT17多模态系统的所有模型,除了像trgmul这样的乘法交互变体。
  • 新模型 MultimodalASR:编码器-解码器初始化的ASR模型。参见论文
  • 新模型 AttentiveCaptioning:类似于show-attend-and-tell,但不是完全复制,它使用特征文件而不是原始图像。
  • 新模型 AttentiveMNMTFeaturesFA:LIUM-CVC的WMT18多模态系统,即过滤注意力
  • 新(实验性)模型 NLI:一个简单的基于LSTM的NLI基线,用于SNLI数据集
    • direction应定义为direction: pre:Text, hyp:Text -> lb:Label
    • prehyplb键指向每行一个句子的纯文本文件。即使是标签,也应该构建词汇表以适应nmtpy架构。
    • 应将acc添加到eval_metrics以计算准确率。

v3.0.0 (05/10/2018)

主要版本,支持Pytorch 0.4,并放弃支持0.3

现在支持在CPU上训练和测试,多亏了Pytorch 0.4更容易的设备语义:只需向nmtpy提供-d cpu即可切换到CPU模式。注意:在CPU上训练仅适用于调试,否则非常慢。

  • 注意:device_id不再是一个配置选项。应从旧配置中删除。
  • 不支持多GPU。始终使用CUDA_VISIBLE_DEVICES环境变量限制为单个GPU。

现在可以在推理期间覆盖用于训练模型的配置选项:例如:nmtpy translate (...) -x model.att_temp:0.9

现在nmtpy train会检测无效/旧的[train]选项,并拒绝训练模型。

新采样器: ApproximateBucketBatchSampler类似于默认的BucketBatchSampler,但更有效地处理稀疏分布的序列长度,如语音识别。它将相似长度的项分入桶。它不再保证批处理完全由相同长度的序列组成,因此需要在编码器中特别注意以支持打包/填充/掩码。 TextEncoder已经自动这样做,而语音编码器BiLSTMp则不关心。

实验性:您可以使用近似采样器解码ASR系统,尽管模型没有处理填充位置(每个批次都会打印警告)。特定数据集的损失为0.2%的WER。因此,尽管编码器中的计算变得嘈杂且不完全正确,但模型可以相当稳健地处理这种噪声。

$ nmtpy translate -s val -o hyp -x model.sampler_type:approximate best_asr.ckpt

这种批处理将ASR解码时间减少了近2-3倍。

其他更改

  • nmtpy-build-vocab生成的词汇表现在还包含频率信息。代码与旧词汇文件向后兼容。
  • 现在应显式地将Batch对象移动到分配的设备,使用.device()方法。请参阅NMT模型中的mainloop.pytest_performance()
  • 训练不再显示来自nvidia-smi输出的缓存的GPU分配,因为这最终是一种调用nvidia-smi的非常规方法。我们计划使用torch.cuda.*来估计内存消耗。
  • 注意:由于多进程数据加载有时会导致崩溃,因此目前暂时禁用,所以在本次版本中num_workers > 0没有效果。
  • 注意被分为DotAttentionMLPAttention,并在模型构建过程中提供了一个方便的函数get_attention()来选择它们。
  • 应使用get_activation_fn()来动态选择非线性函数,而不是使用getattr(nn.functional, activ)。在下一个Pytorch版本中,后者将无法用于tanhsigmoid
  • 简化:现在ASR模型是从NMT派生出来的。

v2.0.0 (26/09/2018)

  • 可以通过pip安装。
  • 高级层现在组织到子文件夹中。
  • 新增基本层:序列上的卷积、MaxMargin。
  • 新增注意力层:Co-attention、多头注意力、层次注意力。
  • 新增编码器:任意序列向量的编码器、BiLSTMp语音特征编码器。
  • 新增解码器:多源解码器、切换解码器、向量解码器。
  • 新增数据集:Kaldi数据集 (.ark/.scp 读取器)、Shelve数据集、Numpy序列数据集。
  • 添加了学习率衰减:参见config.py中的lr_decay*选项。
  • 从仓库中移除了subword-nmt和METEOR文件。我们现在依赖于PIP包中的subword-nmt。对于METEOR,安装后应运行nmtpy-install-extra
  • 更多多任务和多输入/输出的translatetraining模式。
  • 新增早期停止指标:字符和单词错误率(cer、wer)和ROUGE(rouge)。
  • BucketBatchSampler添加了课程学习选项,即长度排序的批次。
  • 新增模型
    • ASR:类似于Listen-attend-and-spell的自动语音识别
    • Multitask*:在多个输入/输出之间进行实验性多任务和调度。

v1.4.0 (09/05/2018)

  • 添加environment.yml以方便使用conda安装。您现在可以通过调用conda env create -f environment.yml来创建一个可用的conda环境。
  • 通过在批处理创建之前保持float16数组来提高NumpyDataset的内存效率。
  • Multi30kRawDataset重命名为Multi30kDataset,现在它支持存储为.npy的原始图像文件和预提取的视觉特征文件。
  • scripts/下添加CNN特征提取脚本。
  • ShowAttendAndTell和多模态NMT中添加双随机注意力。
  • 新增模型MNMTDecinit,用于使用辅助特征初始化解码器。
  • 新增模型AMNMTFeatures,这是注意力MMT,但使用特征文件而不是内存密集型的端到端特征提取。

v1.3.2 (02/05/2018)

  • 更新了ShowAttendAndTell模型。

v1.3.1 (01/05/2018)

  • 移除了旧的Multi30kDataset
  • 按源序列长度对批次进行排序,而不是按目标排序。
  • 修复了ShowAttendAndTell模型。现在它应该可以工作了。

v1.3 (30/04/2018)

  • 添加了Multi30kRawDataset,可以从原始图像作为输入进行端到端系统的训练。
  • 添加了NumpyDataset,可以读取.npy/.npz张量文件作为输入特征。
  • 现在可以在nmtpy train中使用-S来生成更短的实验文件,其中文件名中不包含所有超参数。
  • 为Google SentencePiece(SPM)处理后的文件添加了新的后处理过滤器选项de-spm
  • 由于现在它被视为早期停止指标,因此sacrebleu现在是依赖项。它仅在处理SPM处理后的文件时才有意义,因为它们在经过后处理后会进行一次去标记。
  • 为某些指标添加了依赖项sklearn
  • momentumnesterov参数添加到[train]部分以用于SGD。
  • 以许多方式改进了ImageEncoder层。请参见代码以获取更多信息。
  • 添加了对ModuleDict()支持的未合并的上游PR
  • 如果无法从文件扩展名检测到语言,METEOR将回退到英语。
  • 现在,使用nmtpy-build-vocab构建词汇表文件时,-f选项将生成一个单独的numpy文件,用于存储标记频率。
  • 添加了新的命令nmtpy test,用于非束搜索推理模式。
  • 已删除nmtpy resume命令,并添加了pretrained_file选项到[train],用于从检查点初始化模型权重。
  • 添加了freeze_layers选项到[train],可以指定要冻结的层的名称前缀列表。
  • 改进了随机数生成:现在将打印随机数以便重复结果。
  • 添加了用于注意力可视化的IPython笔记本。
    • 新增浅层SimpleGRUDecoder层。
    • TextEncoder:能够设置嵌入层的maxnormgradscale,并能够与或无需排序长度批处理一起工作。
    • ConditionalDecoder:使其能够与GRU/LSTM一起工作,允许为嵌入设置maxnorm/gradscale
    • ConditionalMMDecoder:与上述相同。
  • nmtpy translate
    • 目前移除了--avoid-double--avoid-unk
    • 添加了Google的长度惩罚归一化开关--lp-alpha
    • 添加了集成,如果您提供了超过1个模型检查点,则自动启用。
  • utils/ml_metrics.py中添加了新的机器学习指标包装器。
    • 标签排名平均精度lrap
    • 覆盖率错误
    • 平均倒数排名

v1.2 (20/02/2018)

  • 您现在可以在配置文件中使用$HOME$USER
  • 修复了一个溢出错误,该错误会导致超过255个标记的NMT失败。
  • 验证后现在正确终止METEOR工作进程。
  • 现在,许多实验运行现在使用唯一的随机字符串而不是递增整数作为后缀,以避免集群设置中的竞争条件。
  • 用一个新的替换了utils.nn.get_network_topology(),该类将以更智能的方式解析模型的direction字符串。
  • 如果设置了CUDA_VISIBLE_DEVICES,则GPUManager将始终遵守。
  • 删除了在/tmp下为GPU预留创建临时/咨询锁文件的操作。
  • 训练期间的时间测量现在结构化为批处理开销、训练和评估时间。
  • 数据集
    • 添加了用于独立读取文本文件的TextDataset
    • 添加了OneHotDataset,它是TextDataset的一个变体,其中序列不以<bos><eos>分别作为前缀和后缀。
    • 添加了实验性的MultiParallelDataset,该数据集可以将任意数量的并行数据集合并在一起。
  • nmtpy translate
    • --avoid-double--avoid-unk参数分别添加了输出文件的.nodbl.nounk后缀。
    • 现在将足够模型无关的beam_search()分离到其自己的文件nmtpytorch/search.py中。
    • max_len默认值增加到200。

v1.1 (25/01/2018)

  • 新增了实验性的Multi30kDatasetImageFolderDataset类。
  • 添加了对CNN支持的torchvision依赖。
  • nmtpy-coco-metrics现在在norm=True的情况下计算一个METEOR。
  • 主循环机制被完全重构,并对[train]部分的配置选项进行了不兼容的更改。
    • 移除了patience_delta选项。
    • 添加了eval_batch_size,用于定义训练期间GPU束搜索的批处理大小。
    • eval_freq默认值现在为3000,意味着每3000个minibatch。
    • eval_metrics现在默认为loss。与之前一样,您可以为计算所有指标并提供一个指标列表,如bleu,meteor,loss,并根据第一个指标进行早期停止。
    • 添加了eval_zero (默认: False),它告诉模型在训练开始之前在dev集上评估一次。这对于检查使用预训练权重初始化的模型非常有用。
    • 已移除 save_best_n:我们不再根据早停指标在开发集上保存最好的 N 个模型。
    • 添加了 save_best_metrics (默认: True),这将保存开发集上针对 eval_metrics 中提供的每个指标的最佳模型。这弥补了移除 save_best_n 的不足。
    • checkpoint_freq 现在默认为 5000,这意味着每 5000 个小批量。
    • 添加了 n_checkpoints (默认: 5) 来定义如果 checkpoint_freq > 0(即启用了检查点),则保留的最后几个检查点的数量。
  • 支持将 ExtendedInterpolation 添加到配置文件中。
    • 您现在可以在 .conf 文件中定义中间变量,以避免重复输入相同的路径。可以在其 部分 内使用 tensorboard_dir: ${save_path}/tb 语法引用变量。也可以进行跨部分引用:${data:root} 将替换为 [data] 部分中定义的 root 变量的值。
  • nmtpy train 中添加了 -p/--pretrained 选项,使用另一个检查点 .ckpt 初始化模型的权重。
  • 改进了 nmtpy translate 的输入/输出处理。
    • -s 现在接受逗号分隔的测试集 定义 在实验配置文件中,可以一次性翻译它们。例如:-s val,newstest2016,newstest2017
    • -s 的互斥选项是 -S,它接收一个源句子输入文件。
    • 对于这两种情况,现在都应提供输出前缀 -o。对于多个测试集,输出前缀将附加测试集名称和束宽。如果您仅使用 -S 提供单个文件,则最终输出名称将只反映束宽信息。
  • nmtpy-build-vocab 添加了两个新参数
    • -f:在最终的 json 词汇表中存储频率计数
    • -x:不将特殊标记 <eos>,<bos>,<unk>,<pad> 添加到词汇表中

层/架构

  • 添加了 Fusion() 层,用于连接、求和、乘以任意数量的输入
  • 添加了 实验性ImageEncoder() 层,可以无缝地使用 torchvision 预训练模型插入 VGG 或 ResNet CNN
  • Attention 层参数改进。您现在可以使用 att_bottleneck 选择 MLP 注意力中的瓶颈维度。点注意力仍然没有经过测试,可能存在错误。

添加了新的层/架构

NMT 中的更改

  • dec_init 默认为 mean_ctx,即解码器将使用从源编码器计算出的平均上下文初始化
  • enc_lnorm 仅为占位符,现在已删除,因为我们目前不提供层归一化
  • 束搜索已完全移动到 GPU

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

nmtpytorch-4.0.0.tar.gz (115.6 kB 查看哈希值)

上传时间 源代码

构建发行版

nmtpytorch-4.0.0-py3-none-any.whl (168.6 kB 查看哈希值)

上传时间 Python 3

支持者