はじめに
七尾百合子さん、お誕生日 81日目 おめでとうございます! nikkieです。
気になっているModernBERTで、先人の記事に沿って多クラス分類のファインチューニングをしていきます!
ModernBERTの自分用リンク集がこちら
目次
- はじめに
- 目次
- 「Fine-tune ModernBERT for text classification using synthetic data」
- 合成データの内訳
- 写経したコード
- 写経メモ
- 終わりに
「Fine-tune ModernBERT for text classification using synthetic data」
合成データ argilla/synthetic-domain-text-classification を使って、ModernBERTを多クラス分類するようにファインチューンします。
このリポジトリ argilla-io/synthetic-data-generator は、合成データセット生成ツールのリポジトリです2。
合成データの内訳
合成データは全1000件。
テキストとクラスラベル1つからなり、含まれるクラスは263。
(labelではクラスは数字で表されます)
{'text': "In recent years, the manufacturing sector has seen a significant shift towards automation and digitalization. (略)",
'label': 0}
Counter({17: 82, 12: 55, 13: 54, 4: 51, 22: 50, 24: 49, 0: 47, 20: 46, 14: 46, 8: 45, 10: 45, 1: 42, 21: 42, 9: 41, 5: 39, 23: 35, 19: 34, 7: 34, 2: 33, 16: 32, 3: 31, 6: 21, 18: 20, 11: 10, 15: 8, 25: 8})
またテキストは
- min: 208文字
- max: 1539文字
- 平均: 545.167文字
でした。
写経したコード
ColabのT4 GPUを使いました
訓練中のリソース使用状況です(バッチサイズを調整できるかも)

num_train_epochs 5 -> 3 の変更は、精度を上げ切るよりも短時間で終わるのを優先してです
写経メモ
tokenizerの__call__()のpadding=Trueはlongestと同じ
ref: https://huggingface.co/docs/transformers/en/main_classes/tokenizer#transformers.PreTrainedTokenizer.__call__.padding
scikit-learnのf1_score
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html
labels引数には、訓練データセットに含まれるラベルを渡している- binary(二値分類)以外では
pos_label引数は無視されるとのことだったので、指定を省略
終わりに
気になっていたModernBERTをファインチューニングする例を1例動かせました!
decoderモデルの知見を適用したBERTと聞いてどんなソースコードになるのか戦々恐々としていましたが、蓋を開けてみればtransformersの使い方の範疇で、これまでの知識も活かせました。
今回のような合成データを用意すれば、分類問題を精度よく解けるのではないかと期待に胸躍らせています。
日本語の多クラス分類でも手を動かしてみたいところです
- 古いコミットのバージョンのページも存在します nbsanity.com↩
- 余談ですが、PEP 723で貢献しました ↩
- nvidia/domain-classifierの分類クラス数のようです↩