[英]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.