メインコンテンツへスキップ
見出し画像

Huggingface Transformers 入門 (14) - 日本語の質問応答の学習

    「Huggingface Transformers」による日本語の質問応答の学習手順をまとめました。

    ・Huggingface Transformers 4.1.1
    ・Huggingface Datasets 1.2

    前回

    1. データセットの準備

    「SQuAD」と同じ書式である日本語の質問応答データセット「運転ドメインQAデータセット」を使います。

    ・DDQA-1.0_RC-QA_train.json
    ・DDQA-1.0_RC-QA_dev.json

    2. 日本語の質問応答の学習

    (1) Googleドライブのフォルダの準備
    「Google Colab」のディスクサイズ(68.40GB)では足りないので、Googleドライブ 100GB(¥250/月)で学習します。

    # Googleドライブのフォルダの準備
    from google.colab import drive 
    drive.mount('/content/drive')
    !mkdir -p /content/drive/'My Drive'/bert/
    %cd /content/drive/'My Drive'/bert/

    (2) Huggingface Transformersのインストール。

    # Huggingface Transformersのインストール
    !git clone https://github.com/huggingface/transformers
    %cd transformers
    !pip install .

    (3) 日本語対応パッケージのインストール。

    # 日本語対応パッケージのインストール
    !pip install fugashi[unidic-lite]
    !pip install ipadic

    (4) 「Huggingface Datasets」のインストール。

    # Huggingface Datasetsのインストール
    !pip install datasets

    (5) 「DDQA-1.0_RC-QA_train.json」と「DDQA-1.0_RC-QA_dev.json」をbert/transformersに配置。
    (6) run_squad.pyで学習を実行。
    「run_qa.py」は、「Tokenizer check: this script requires a fast tokenizer.」で引っかかったので、旧版である「run_squad.py」を使います。「output」フォルダにモデルが出力されます。

    %%time
    
    # 質問応答の学習
    !python ./examples/legacy/question-answering/run_squad.py \
        --model_type=bert \
        --model_name_or_path=cl-tohoku/bert-base-japanese-whole-word-masking \
        --do_train \
        --do_eval \
        --train_file=DDQA-1.0_RC-QA_train.json \
        --predict_file=DDQA-1.0_RC-QA_dev.json \
        --per_gpu_train_batch_size 12 \
        --learning_rate 3e-5 \
        --num_train_epochs 10 \
        --max_seq_length 384 \
        --doc_stride 128 \
        --overwrite_output_dir \
        --output_dir output/
    ***** Running evaluation  *****
      Num examples = 1057
      Batch size = 8
      Evaluation done in total 30.879026 secs (0.029214 sec per example)
      Results: {'exact': 22.854387656702023, 'f1': 22.854387656702023, 'total': 1037, 'HasAns_exact': 22.854387656702023, 'HasAns_f1': 22.854387656702023, 'HasAns_total': 1037, 'best_exact': 22.854387656702023, 'best_exact_thresh': 0.0, 'best_f1': 22.854387656702023, 'best_f1_thresh': 0.0}
    CPU times: user 38.7 s, sys: 6.52 s, total: 45.3 s
    Wall time: 4h 3min 44s

    ​3. 日本語の質問応答の実行

    from transformers import BertJapaneseTokenizer, AutoModelForQuestionAnswering
    import torch
    
    # 入力テキスト
    context = "本日お昼頃、高崎方面へ自転車で出かけました。"
    question="どこへ出かけた?"
    
    # モデルとトークナイザーの準備
    model = AutoModelForQuestionAnswering.from_pretrained('output/')  
    tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') 
    
    # 推論の実行
    inputs = tokenizer.encode_plus(question, context, add_special_tokens=True, return_tensors="pt")
    input_ids = inputs["input_ids"].tolist()[0]
    output = model(**inputs)
    answer_start = torch.argmax(output.start_logits)  
    answer_end = torch.argmax(output.end_logits) + 1 
    answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input_ids[answer_start:answer_end]))
    
    # 結果出力
    print("質問: "+question)
    print("応答: "+answer)
    質問: どこへ出かけた?
    応答: 高崎 方面

    次回



     
     

    npaka

     
     
    プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン / カラオケ / ギター / 猫 twitter : @npaka123

    あなたへのおすすめ