繁体   English   中英

如何通过一次加载上下文进行预测并针对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?

我创建了一个工作流程,要求用户发布问题以对问题做出预测。 我使用BERT神经网络模型进行预测,并使用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使用滑动窗口方法。 因此,一个问题和段落对可能会给BERT模型带来很多输入。 每个输入都由与滑动窗口(该段落的子序列)连接的查询组成。 为此输入计算一个嵌入,然后是特定于SQUAD的几层。 重要的是,这是一个BERT嵌入,用于段落的查询和子序列。 从技术上讲,这意味着一次仅计算上下文的嵌入在这里不起作用。

从概念上讲,BERT模型的注意层可以基于查询来决定要关注段落中的哪些标记,反之亦然。 这为模型提供了强大的功能,而不必在知道查询之前决定在段落中关注什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM