🐡

lm-evaluation-harnessの評価指標まとめ

2023/11/26に公開

概要

lm-evaluation-harness評価指標(タスク)について、重要と思われる部分のまとめです。
https://github.com/Stability-AI/lm-evaluation-harness

タスクがどの様に動作するかは、こちらのドキュメントが参考になります。

JSQuAD

データセット
https://huggingface.co/datasets/shunk031/JGLUE/viewer/JSQuAD

評価コード
https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/tasks/ja/jsquad.py#L174-L182

  • 評価のメイン部分はここ

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/jasquad/evaluate.py#L75-L97

  • f1-scoreを出すときはMeCabのラッパーであるfugashiを使って回答と答えの文字列を分割して算出している。

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/jasquad/evaluate.py#L46-L52

JCommonsenseQA

データセット
https://huggingface.co/datasets/shunk031/JGLUE/viewer/JCommonsenseQA

評価コード
https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L779-L783

  • ここで質問と選択肢をエンコード
    context: 質問文
    continuation: 各選択肢
    context_enc: トークン化された質問文
    continuation_enc: トークン化された各選択肢

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L176-L193

  • ここでmodelに渡すinputsを生成している
    context_enc + continuation_enc
    がinputsとなる。
    N個の選択肢であればN個のinputsが作成される。

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L265-L276

  • 推論実行

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L302-L304

  • 推論結果の内、各選択肢に当たる位置のlogitsを抽出

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L311-L314

  • 選択肢の完全一致を判定
    選択肢が来るはずのトークン位置のlogitsの内、最も重みの大きいトークンのみ抽出。
    それが選択肢と全く同じであれば、その選択肢を答えとしたことになる。

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L316-L320

  • 選択肢の可能性を判定
    選択肢が来るはずのトークン位置のlogitsの内、正解のトークンIDの重みを抜き出し合計している。
    その選択肢の可能性をどの程度多く見積もったかを表す。
    float(logits.sum())はトークン数分の合計値となる。

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L322-L329

  • 正解との比較
    上記で算出した選択肢の可能性と正解を比較している。
    acc_normの方はトークン数で割っている。
    こちらの方が文字数の長さに影響されないため、より妥当な評価な気がする。
    accだとめちゃくちゃ長い文字列が選択肢に入っていた場合、正解と判断してしまいそう。

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L758-L771

JNLI

データセット
https://huggingface.co/datasets/shunk031/JGLUE/viewer/JNLI

評価コード
https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L831-L838

  • 基本的にはJCommonsenseQAと同じ様に動作する

  • データセットの正解ラベルは数値で記載されているので文字列に変換している

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/tasks/ja/jnli.py#L83-L84

  • balanced_acc、mcc、macro_f1が追加されている

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L835-L837

  • balanced_acc、mcc、macro_f1を計算するため値を準備
    acc: 正解したか
    gold: 正解ラベル
    pred: 予測ラベル

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L812-L814

  • balanced_mean
    正解ラベルごとの正答率の平均を取ってから、更にそれらの平均を取る

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/metrics.py#L33-L46

  • matthews_corrcoef
    MCCによる評価

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/metrics.py#L49-L53

  • f1_score
    f1-scoreによる評価

https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/metrics.py#L56-L62

MARC-ja

データセット
https://huggingface.co/datasets/shunk031/JGLUE/viewer/MARC-ja

評価コード
https://github.com/Stability-AI/lm-evaluation-harness/blob/jp-stable/lm_eval/base.py#L831-L838

  • 基本的にはJNLIと同じ様に動作する

Discussion