Как сделать прогнозы, загрузив контекст один раз и динамически предсказать ответ относительно вопроса в модели нейронной сети BERT? - PullRequest
0 голосов
/ 08 июля 2019

Я создал рабочий процесс, когда просил пользователя опубликовать вопрос, чтобы сделать прогноз для этого вопроса.Я использую модель нейронной сети BERT для прогнозирования и использую SQUAD 2.0 для обучения с использованием TPU.Когда я загружаю параграф или два в контексте в следующей структуре JSON:

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

и отправляю это, чтобы предсказать ответ, это занимает минуту для каждого отдельного вопроса.Следующее - это то, что я заметил: Контекст и вопрос преобразуются в 1 0 или True False. Затем начинается предсказание.Прогнозирование занимает около 20 секунд или меньше.

Если я попытаюсь добавить 5 МБ текста в контекст, для преобразования в 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

1 Ответ

1 голос
/ 11 июля 2019

Насколько я понимаю, это невозможно.Когда абзац слишком длинный, чтобы поместиться в одну последовательность ввода, BERT использует метод скользящего окна.Поэтому одна пара вопросов и параграфов может дать много входных данных для модели BERT.Каждый из входных данных состоит из запроса, объединенного со скользящим окном (которое является подпоследовательностью абзаца).Для этого ввода вычисляется вложение, за которым следуют несколько слоев, специфичных для SQUAD.Важно отметить, что это одно вложение BERT для запроса и подпоследовательности параграфа.Это означает, что, технически, вычисление внедрения контекста один раз здесь не работает.

Концептуально, уровни внимания модели BERT могут решать, какие токены в абзаце следует использовать на основе запроса, и наоборот.Это дает значительную силу модели, вместо того, чтобы решать, куда обратиться в параграфе, прежде чем узнавать запрос.

...