Git Product home page Git Product logo

aio2_dpr_baseline's Introduction

AIO

更新履歴

  • 2022/01/09: ディレクトリ構造に関する説明を記述した ./instruction_of_dirtree.md を作成しました。また各ソースコードに対してコメントを追記しました。
  • 2021/12/25: ベースラインの transformer のバージョンを 2.11.0 から 4.12.5 に更新しました。それに伴い、ベースラインのスコア、及び ./download_model.sh でダウンロードできるモデルを更新しています。

目次

以下に記した実行手順の一連の流れについては、./do_example_run.sh に記載していますので、こちらもご確認下さい。

  • 環境構築
  • データセット
    • ダウンロード
    • 学習データ
    • 文書集合(Wikipedia)
  • Dense Passage Retrieval
    • ダウンロード
    • 設定
    • Retriever
        1. BiEncoder の学習
        1. 文書集合のエンコード
        1. データセットの質問に関連する文書抽出
    • Reader
        1. Reader の学習
        1. 評価

環境構築

  • cuda バージョンに合わせて、以下より torch をインストールして下さい。
  • fp16 を使用する場合は、以下より apex をインストールして下さい。
  • その他のライブラリについては以下のコマンドを実行してインストールして下さい。
$ pip install -r requirements.txt

データセット

JAQKET: クイズを題材にした日本語QAデータセット

ダウンロード

$ bash scripts/download_data.sh <output_dir>

<output_dir>
|- wiki/
|  |- jawiki-20210503-paragraphs.tsv.gz
|- aio/
|  |- abc_01-12_retriever.json.gz      # 訓練セット
|  |- aio_01_dev_retriever.json.gz     # 開発セット
|  |- aio_01_test_retriever.json.gz    # 評価セット
|  |- aio_01_unused_retriever.json.gz

# 「質問」と「正解」からなる TSV 形式のファイル
|  |- abc_01-12_retriever.tsv      # 訓練セット
|  |- aio_01_dev_retriever.tsv     # 開発セット
|  |- aio_01_test_retriever.tsv    # 評価セット
|  |- aio_01_unused_retriever.tsv
データ ファイル名 質問数 文書数
訓練 abc_01-12_retriever 17,735 -
開発 aio_01_dev_retriever 1,992 -
評価 aio_01_test_retriever 2,000 -
未使用 aio_01_unused_retriever 608 -
文書集合 jawiki-20210503-paragraphs - 6,795,533
  • データセットの構築方法の詳細については、data/README.mdを参照して下さい。

学習データ

以下の例に示した要素からなるリスト型の JSON ファイル

  • question:質問
  • answers:答えのリスト
  • positive_ctxs:正例文書(答えを含む文書)。以下の辞書で構成されたリスト形式。
    • id:文書インデックス
    • title:Wikipedia のタイトル
    • text:Wikipedia の記事
  • negative_ctxs:負例文書(インバッチネガティブ:ミニバッチ内の他の質問に対する正例文書)。学習中に定義される。
  • hard_negative_ctxs: ハード負例文書(質問に類似するが答えを含まない文書。)。positive_ctxs と同様の形式。
{
    "question": "明治時代に西洋から伝わった「テーブル・ターニング」に起源を持つ占いの一種で、50音表などを記入した紙を置き、参加者全員の人差し指をコインに置いて行うのは何でしょう?",
    "answers": [
        "コックリさん"
    ],
    "positive_ctxs": [
        {
            "id": 278397,
            "title": "コックリさん",
            "text": "コックリさん(狐狗狸さん)とは、西洋の「テーブル・ターニング(Table-turning)」に起源を持つ占いの一種。机に乗せた人の手がひとりでに動く現象は心霊現象だと古くから信じられていた。科学的には意識に関係なく体が動くオートマティスムの一種と見られている。「コックリさん」と呼ばれるようになったものは、日本で19世紀末から流行したものだが、これは「ウィジャボード」という名前の製品が発売されたりした海外での流行と同時期で、外国船員を通して伝わったという話がある。"
        }
    ],
    "negative_ctxs": [],
    "hard_negative_ctxs": [
        {
            "id": 3943003,
            "title": "星座占い",
            "text": "喫茶店などのテーブル上には、星座占いの機械が置かれていることがある。硬貨を投入して、レバーを動かすと、占いの内容が印刷された用紙が排出される。"
        },
    ]
}

文書集合(Wikipedia)

  • 以下のアイテムで構成される TSV 形式のデータ(2021.05.03 時点のものを使用)
    • id:文書インデックス
    • text:Wikipedia の記事
    • title:Wikipedia のタイトル
id      text    title
1       "モルガナイト(morganite)はピンク色ないし淡赤紫色の緑柱石(ベリル)である。呈色はマンガン(Mn)に由来する。" モルガナイト

Dense Passage Retrieval

本実装では、オープンドメイン質問応答に取り組むための二つのモジュールを学習する

  1. 与えられた質問に対して、文書集合から関連する文書を検索するモジュール(Retriever)
  2. 検索した関連文書の中から質問の答えとなる箇所を特定するモジュール(Reader)

より詳細な解説は、以下を参照して下さい。

Karpukhin, Vladimir and Oguz, Barlas and Min, Sewon and Lewis, Patrick and Wu, Ledell and Edunov, Sergey and Chen, Danqi and Yih, Wen-tau. Dense Passage Retrieval for Open-Domain Question Answering (EMNLP2020) [paper] [github]

ダウンロード

本節以降では Retriever と Reader の学習手順、および Retriever による文書エンベッディングの作成と関連文書検索方法について紹介します。 本節は以降の手順で作成された、Retriever、Reader、文書エンベッディングのダウンロード方法について説明します。 必要に応じてダウンロードして下さい。

2021/12/25 更新:transformerのバージョンが2.11.0から4.12.5のものに訓練済みモデルを置き換えました。少なくとも第2回のベースラインとしてはこのバージョンで固定します。

$ save_dir="model"
$ targets="retriever,reader,embeddings"  # {retriever, reader, embeddings} からダウンロード対象を「スペースなしの ',' 区切り」で指定して下さい

$ bash scripts/download_model.sh $targets $save_dir
$ du -h ${save_dir}/*
  2.2G    biencoder.pt.gz
  1.1G    reader.pt.gz
  18.0G   embedding.pickle.gz

設定

$ vim scripts/configs/config.pth
  • 実装を始める前に以下の項目を設定して下さい。
    • WIKI_FILE:Wikipedia の文書ファイル
    • TRAIN_FILE:訓練セット
    • DEV_FILE:開発セット
    • TEST_FILE:評価セット
    • DIR_DPR:モデルやエンベッディングの保存先

Retriever

retriever

1. BiEncoder の学習

質問と文書の類似度を計算するため、質問エンコーダおよび文書エンコーダで構成される BiEncoder を学習します。デフォルトのパラメータでは、4GPU (Tesla V100-SXM2-16GB) を用いて6時間程度の学習時間を要しました。

# 実行例

$ exp_name="baseline"
$ config_file="scripts/configs/retriever_base.json"

$ bash scripts/retriever/train_retriever.sh \
    -n $exp_name \
    -c $config_file

# 実行結果

$ ls $DIR_DPR/$exp_name/retriever
    dpr_biencoder.*.*.pt            # モデルファイル
    hps.json                        # パラメータ
    score_train_retriever_*.jsonl   # 訓練時スコアログ
    logs/
      run_*.sh                      # 実行時シェルスクリプト
      train_*.log                   # 実行時ログ
    tensorboard/                    # tensorboard ログディレクトリ (if `--tensorboard_logdir`)

2. 文書集合のエンコード

質問と文書の類似度を計算する前に、文書集合(Wikipedia)を文書エンコーダでエンコードします。エンコードには、4GPU (Tesla V100-SXM2-16GB) を用いて3時間程度の実行時間を要しました。

# 実行例

$ exp_name="baseline"
$ model_file="path/to/model"

$ bash scripts/retriever/encode_ctxs.sh \
    -n $exp_name \
    -m $model

# 実行結果

$ ls $DIR_DPR/$exp_name/embeddings
    emb_${model}.pickle             # 文書エンベッディング
    logs/
      embs_*.log                    # 実行時ログ

3. データセットの質問に関連する文書抽出

データセットの質問に関連する文書を抽出します。質問エンコーダから取得した質問エンベッディングと前項でエンコードした文書エンベッディングに対して Faiss を用いて類似度を計算します。

# 実行例

$ exp_name="baseline"
$ model="path/to/model"
$ embed="path/to/embeddings"

$ bash scripts/retriever/retrieve_passage.sh \
    -n $exp_name \
    -m $model \
    -e $embed

# 実行結果
$ ls $DIR_DPR/$exp_name/retrieved
    train_*.*.json   dev_*.*.json   test_*.*.json   # 予測結果(reader 学習データ)
    train_*.*.tsv    dev_*.*.tsv    test_*.*.tsv    # 予測スコア(Acc@k を含む)
    logs/
      predict_*_*.log                               # 実行時ログ

Acc@k

  • 抽出した上位 k 件までの文書に解答が含まれている質問数の割合
データ Acc@1 Acc@5 Acc@10 Acc@50 Acc@100
訓練セット 43.41 68.63 75.39 85.67 87.87
開発セット 35.94 60.14 69.33 84.84 89.66
評価セット 36 62.45 71.55 85.45 89.6

Reader

4. Reader の学習

関連文書を用いて QA の読解モデルを学習します。学習には、4GPU (Tesla V100-SXM2-16GB) を用いて1時間程度の実行時間を要しました。

# 実行例

$ exp_name="baseline"
$ config_file="scripts/configs/reader_base.json"
$ train_file="path/to/retrieved/train/file"
$ dev_file="path/to/retrieved/dev/file"

$ bash scripts/reader/train_reader.sh \
    -n $exp_name \
    -c $config_file \
    -t $train_file \
    -d $dev_file

# 実行結果

$ ls $DIR_DPR/$exp_name/reader
    dpr_reader.*.*.pt               # モデルファイル
    hps.json                        # パラメータ
    logs/
      run_*.sh                      # 実行時シェルスクリプト
      train_*.log                   # 実行時ログ
    results/                        # dev セットの評価結果の出力ディレクトリ
    tensorboard/                    # tensorboard ログディレクトリ (if `--tensorboard_logdir`)

5. 評価

学習した読解モデルを評価します。

# 実行例

$ exp_name="baseline"
$ test_file="path/to/retrieved/test/file"
$ model_file="path/to/reader/file"

$ bash scripts/reader/eval_reader.sh \
    -n $exp_name \
    -e $test_file \
    -m $model_file

$ ls $DIR_DPR/$exp_name/reader/results/
    test_prediction_resuls.json         # test セットの評価結果の出力ディレクトリ
    eval_accuracy.txt                   # 正解率 (Exact Match) の出力ファイル

Accuracy

  • 上位 100 件の文書を用いた時の正解率 (Exact Match)
データ Acc
開発セット 57.33
評価セット 58.65

5. 評価 で出力された eval_accuracy.txt を参照して下さい:

# 出力例
$ cat $DIR_DPR/$exp_name/reader/results/eval_accuracy.txt

### AIO2_DPR_baseline/outputs/baseline/retrieved/dev_jaqket_59.230.json
2021-10-12 11:28:17 #239 INFO __main__ :::  n=100       EM 56.93

謝辞・ライセンス

  • 学習データに含まれるクイズ問題の著作権は abc/EQIDEN 実行委員会 に帰属します。東北大学において研究目的での再配布許諾を得ています。
  • 開発データは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。
  • 開発/評価用クイズ問題は 株式会社キュービック および クイズ法人カプリティオ へ依頼して作成されたものを使用しております。

aio2_dpr_baseline's People

Contributors

jnszk avatar katotakuma0501 avatar singletongue avatar smiyawaki0820 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.