如何通过一次加载上下文进行预测并动态预测 BERT 神经网络模型中问题的答案?

How to make the predictions by loading the context once and predict the answer dynamically with regards to question in BERT neural network model?

我创建了一个工作流程,从询问用户 post 一个问题到对该问题做出预测。 我正在使用 BERT neural network model for prediction and used SQUAD 2.0 使用 TPU 进行训练。 当我在以下 JSON 结构的上下文中加载一两个段落时:

{
  "data": [
    {
      "paragraphs": [
        {
          "qas": [
            {
              "question": "question",
              "id": "65432sd54654dadaad"
            }
          ],
          "context": "paragraph"
        }
      ]
    }
  ]
}

然后发送这个来预测答案,每个问题需要一分钟时间。 以下是我注意到的事情: 上下文和问题转换为 1 0 或 True False 然后预测开始。预测大约需要 20 秒或更短时间。

如果我尝试将 5MB 的文本添加到上下文中,需要整整两个小时才能转换为 1 0 或 true-false 然后预测答案。

是否可以加载一次上下文并根据问题动态预测答案?我使用 run_squad.py。 这些是我使用的标志:

python run_squad.py \
  --vocab_file=$BERT_LARGE_DIR/vocab.txt \
  --bert_config_file=$BERT_LARGE_DIR/bert_config.json \
  --init_checkpoint=$BERT_LARGE_DIR/model.ckpt \
  --do_train=False \
  --train_file=$SQUAD_DIR/train-v2.0.json \
  --do_predict=True \
  --predict_file=$SQUAD_DIR/dev-v2.0.json \
  --train_batch_size=24 \
  --learning_rate=3e-5 \
  --num_train_epochs=2.0 \
  --max_seq_length=384 \
  --doc_stride=128 \
  --output_dir=gs://some_bucket/squad_large/ \
  --use_tpu=True \
  --tpu_name=$TPU_NAME \
  --version_2_with_negative=True

据我了解,这是不可能的。当段落太长无法放入单个输入序列时,BERT 使用滑动 window 方法。因此,一个问题和一个段落对可能会给 BERT 模型带来许多输入。每个输入都包含与滑动 window(该段落的子序列)连接的查询。为该输入计算嵌入,然后是特定于 SQUAD 的几个层。 重要的是,这是一个针对段落的查询和子序列的 BERT 嵌入。这意味着,从技术上讲,仅计算一次上下文的嵌入在这里是行不通的。

从概念上讲,BERT 模型的注意力层可以根据查询决定关注段落中的哪些标记,反之亦然。这为模型提供了相当大的权力,而不必在知道查询之前决定在段落中关注哪里。