使用 allennlp 构建管道模型

Building a Pipline Model using allennlp

我是 allennlp 的新手,我正在努力构建一个似乎不完全适合 allennlp 中构建模型的标准方法的模型。

我想使用 NLP 构建管道模型。管道基本上由两个模型组成,我们称它们为 A 和 B。首先对 A 进行训练,并基于对完整训练 A 的预测,然后对 B 进行训练。

我看到的是人们定义了两个单独的模型,使用命令行界面 allennlp train ... 在看起来像 shell 的脚本中训练它们

# set a bunch of environment variables
...
allennlp train -s $OUTPUT_BASE_PATH_A --include-package MyModel --force $CONFIG_MODEL_A

# prepare environment variables for model b
...
allennlp train -s $OUTPUT_BASE_PATH_B --include-package MyModel --force $CONFIG_MODEL_B

我对此有两个担忧:

  1. 这段代码很难调试
  2. 不是很灵活。当我想对经过全面训练的模型进行正向传递时,我编写了另一个脚本 bash 执行此操作的脚本。

关于如何以更好的方式做到这一点有什么想法吗?

我考虑过使用 python 脚本而不是 shell 脚本并直接调用 allennlp.commands.main(..)。这样做至少你有一个联合 python 模块,你可以 运行 使用调试器。

有两种可能。

如果您真的只是将一个模型的输出插入另一个模型的输入,您可以将它们合并到一个模型中,然后 运行 这样。如果您使用 from_file 模型对两个经过训练的模型初始化组合模型,则可以使用两个已训练的模型执行此操作。在训练时间做这件事有点困难,但并非不可能。您将像现在一样训练第一个模型。对于第二步,您直接训练组合模型,冻结内部第一个模型的权重。

您可以做的另一件事是将 AllenNLP 用作库,而无需配置文件。我们有 a template up on GitHub 向您展示如何执行此操作。基本见解是,您在一个 Jsonnet 配置文件中配置的所有内容都对应 1:1 到您可以直接从 Python 使用的 Python class。不需要使用配置文件。如果您以这种方式使用 AllenNLP,则具有更大的灵活性,包括将事物链接在一起。