0

我创建了一个工作流,要求用户发布问题以对问题进行预测。我使用BERT 神经网络模型进行预测,并使用SQUAD 2.0使用 TPU 进行训练。当我在以下 JSON 结构的上下文中加载一两个段落时:

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

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

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

是否可以加载一次上下文并动态预测问题的答案?我使用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
4

1 回答 1

1

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

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

于 2019-07-11T07:35:35.477 回答