【问题标题】:Building a Pipline Model using allennlp使用 allennlp 构建管道模型
【发布时间】:2021-04-20 10:45:50
【问题描述】:

我对 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. 它不是很灵活。当我想对经过全面训练的模型进行前向传递时,我编写了另一个脚本来执行此操作。

关于如何以更好的方式做到这一点的任何想法?

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

【问题讨论】:

    标签: allennlp


    【解决方案1】:

    有两种可能。

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

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

    【讨论】:

    • 感谢您指出这两种可能性。是否有可能做一种两者的混合方法?分别从 jsonet 文件加载模型,然后将它们链接在一起?我只是在问,因为我的项目基于一个现有的实现,其中模型和不同的配置都已经存在。
    • 您绝对可以将这两种方法结合起来,但在我看来,您可以只使用方法#1。您只需要编写一个自定义模型类来接收您的两个“子”模型。
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多