# BERT によるテキスト分類チュートリアル

塚越駿†・平子 潤 $\dagger$

## 1 はじめに

深層学習の劇的な進展によって，自然言語処理は大きな変革を遂げ，深層学習モデルを用いて自然言語処理タスクを解くことはもはや一般的と呼べるまでになった．中でも近年，深層学習を用いた自然言語処理の中核を担う存在が，BERT (Devlin et al. 2019)をはじめとする事前学習済み言語モデル (Pretrained Language Models; PLMs) である。大規模な事前学習によって様々なタスクに適用可能な知識を得たこれらのモデルは, 基盤モデル (Foundation Models) 1 とも呼ばれ，極めて活発に研究が行われている。このような深層学習分野の発展に伴い, PyTorch (Paszke et al. 2019) や Transformers (Wolf et al. 2020) といった深層学習関連のライブラリも急速に整備されている。しかし, その発展の急激さ故に, 特に日本語では, 最新のライブラリや方法論に追従した高品質な参考実装がほとんど存在しない. 研究を行う上で品質の高い参考実装が存在することは，実装ミスを抑制し，研究の生産性を向上させるための資源として極めて有用である.

BERT によるテキスト分類チュートリアル゙は，上述の問題を解決するため，モダンで高品質な参考実装を目指し 2023 年 1 月に筆者が GitHub 上で公開した実装例である。本稿執筆時点までに 150 を超える $\operatorname{star}^{3}$ が付いており，大きな反響があった，また，本実装については「言語処理学会第 29 回年次大会併設ワークショップ JLR2023 日本語言語資源の構築と利用性の向上 $\rfloor^{4}$ でも発表5し，実装の工夫について多くの好意的な評価をいただいた。本稿では，BERTによるテキスト分類チュートリアルの概要について述べ，実装にあたって意識した適切な実験管理のための方策と工夫について紹介する.

## 2 BERTによるテキスト分類チュートリアル

本実装は，BERT を用いたテキスト分類をテーマに，モダンで高品質な深層学習用のテンプ


図 1 本実装によるテキスト分類の流れを示す概観図.

レート実装を目指したものである。特に，自然言語処理の初学者が参考にすることを念頭に，現代の深層学習プロジェクトで必須の要素を漏れなく含みつつ, 可能な限り明快な実装となるよう心がけた。本実装の主要な工夫点は以下の通りである.
- Python 3.10, PyTorch 1.13, Transformers 4.25 以上に対応したモダンな記法・実装

・ 実験テンプレートとしてその他のタスクへの転用が容易な実装

次に，本実装の要点について述べる.

実装の全体像本実装の概観を図 1 に示す。本実装では，まずデータのダウンロードと前処理を行い，次に訓練・評価用データセットの作成を行う。これらの処理は一連の実験の始まりにのみ行えばよい，その後，訓練と評価を独立して行う。また実装に際して, Jupyter Notebook ${ }^{6}$ などノートブック形式のプログラムは利用しなかった。これは, 研究活動において実験を複数回実施する際に，ノートブック形式のプログラムを利用すると実験の誤りや各処理の依存関係の把握が難しくなるという実体験に基づく，実験の流れを明確にするための工夫である．

環境構築とライブラリ選定本実装はモダンな深層学習プロジェクトのテンプレート・参考実装として利用されること目的としている. したがって, 可能な限り新しいバージョンの Python とライブラリを採用した。環境構築には, 近年利用が広がっている Python のパッケージマネー ジャ Poetry 7 と, 科学計算用ライブラリ用のパッケージマネージャ Miniconda ${ }^{8}$ 二つを想定し,初学者が躓きがちなインストール手順も READMEに記載した。また，初学者が本実装を参考


にする際に, 実装の詳細を過度に隠蔽してしまうと, 将来的な学習の妨げとなることが予想される。したがって，本実装ではデータセットの前処理など，実際に自身で研究を進める場合に必ず行わなければいけないような処理については，多少壳長でも出来るだけ愚直に書き下すという実装方針をとった。そのため, PyTorch Lightning ${ }^{9}$, ML Flow ${ }^{10}$, Hydra $^{11}$ といった，実験・ハイパーパラメータ管理用のフレームワークは採用しなかった。一方で，深層学習を用いた自然言語処理で極めて一般的に用いられている PyTorch (Paszke et al. 2019) や Transformers (Wolf et al. 2020) といったライブラリは，積極的に新しいバージョンのものを採用した.

データセットテキスト分類の題材に用いるデータセットとして, RONDHUIT 社が公開する livedoorニュースコーパス12を用いた，本実装では，訓練・評価を実施する前に，一括でデー夕セットの前処理を行う．各訓練・評価のたびにデータセットの前処理を行うような実装も考えられるが，事前に前処理を行う実装方針には主に以下の 2 つの利点がある.

(1) 各実験の前処理の重複を減らし，オーバーヘッドを削減できる。

（2）各実験で同じデータセットが用いられることを保証しやすく，バグを防ぎやすい.

データセットは JSON Lines (JSONL) ${ }^{13}$ 形式で扱うように設計した. JSONL 形式とは, 1 行に 1 つの $\mathrm{JSON}^{14}$ が記述されたデータ形式である。深層学習プロジェクトではデータを CSV 形式やTSV 形式で記述することもあるが，これらのデータ形式は，配列や階層構造を持つデータの自然な表現が難しい。一方で，JSONL は各データがそれぞれ独立した柔軟なデータ構造を持つことができ，深層学習でよく用いられる Python との相性が良く, 非常に便利である. デー夕セットは訓練 (train), 開発 (validation), テスト (test)の 3 つのセット ${ }^{15}$ に分割し, 深層学習プロジェクトにおける一般的な実験手続きを体験できるようにした。データセットの分割には, Python の機械学習用ライブラリである scikit-learn ${ }^{16}$ の train_test_split 関数を用いる場合もあるが，本実装ではあえて全ての処理を書き下した。データセットを適切に分割するという処理は，妥当な実験を行う上で極めて重要であるが, Python 初学者にとっては比較的難度が高いと思われる，そこで，分割処理を明示的に実装し，応用の足がかりとなることを狙った。また，デー タセット作成の際には，夕゙ウンロードした生データに直接変更を加えることはせず，生データから明示的に新しいデータセットを作成するように実装した。 これは，あるデータセットの変更を繰り返すことで生じる「どうやってデータを作成したかわからない」等の問題を避けるために，単方向的な処理の流れを意識した結果である。なお，他のデータセットを利用する際も，
^{9}$ https://github.com/Lightning-AI/lightning

10 https://mlflow.org/

${ }^{11}$ https://github.com/facebookresearch/hydra

12 https://www.rondhuit.com/download.html \\#ldcc

13 https://jsonlines.org/

14 https://www.rfc-editor.org/info/rfc8259

15 最近では “split”と呼称することも多い.

16 https://scikit-learn.org/stable/
}
nohup poetry run python src/train.py --device "cuda:0" --model_name cl-tohoku/bert-base-japanese-v2 \& nohup poetry run python src/train.py --device "cuda:1" --model_name cl-tohoku/bert-base-japanese-char-v2 \& nohup poetry run python src/train.py --device "cuda:2" --model_name studio-ousia/luke-japanese-base-lite \& nohup poetry run python src/train.py --device "cuda:3" --model_name xlm-roberta-base \&

図 2 複数の GPU で並列的に実験を行う際のコマンド例.

同様の手続きで実験用データセットを作成できるように実装した.

訓練と評価いくつかの既存の深層学習プロジェクトは，訓練と評価を別々に実行するように実装されている。具体的には，(1) モデルの訓練と保存 (2) 保存済みのモデルの読み込みと評価という手順で実験を行う。これに対し，本実装では訓練と評価を連続的に行う。これにより，モデルの保存と読み込み処理が不要となるため, (1) 訓練時と評価時でモデル構造の齯䶣が発生しづらい (2) 評価結果のみを保存すればよく管理が簡便，といった利点が見达める。なお，本実装では，BERT の fine-tuning という 1 回あたりの実験コストが比較的小さいタスクを題材として用いたため，訓練と評価を一体とする実装方針をとった。しかし， 1 回あたりの実験コストが比較的大きなタスクでは，訓練と評価を分離した方がより柔軟に実験を遂行できる可能性もある。したがって，本実装を別のプロジェクトに転用する際には，それぞれのプロジェクトに合った訓練・評価方針を用いる必要がある点に注意されたい，また，本実装では，コマンドライン引数として使用する GPU を変更できるようにしている。これにより，例えば，nohup コマンド 17 とシェルのバックグラウンド実行機能を利用することで, 図 2 に示すように複数の GPU を用いた並列実験が容易に実現できる ${ }^{18,19}$

## 謝 辞

BERT によるテキスト分類チュートリアルは, 名古屋大学武田・笹野研究室の新規配属学生向けに実装したプログラムを，一般公開用にブラッシュアップしたものである。まずは，本実装を作成するきっかけとなった研究室の全てのメンバーに大きな感謝を伝えたい．また，本実装について発表の機会を提供していただいたJLR2023 運営の皆様, そして, GitHub や各種 SNS を通じて，本実装にコメントとフィードバックを提供していただいたすべての方々に感謝を申し上げたい，益々の隆盛を迎える深層学習と自然言語処理の時代において，本実装が楽しく研究を行うための一助になれば幸いである 20.


## 参考文献

Brown, T. B., Mann, B., Ryder, N., Subbiah, M., Kaplan, J., Dhariwal, P., Neelakantan, A., Shyam, P., Sastry, G., Askell, A., Agarwal, S., Herbert-Voss, A., Krueger, G., Henighan, T. J., Child, R., Ramesh, A., Ziegler, D. M., Wu, J., Winter, C., Hesse, C., Chen, M., Sigler, E., Litwin, M., Gray, S., Chess, B., Clark, J., Berner, C., McCandlish, S., Radford, A., Sutskever, I., and Amodei, D. (2020). "Language Models are Few-Shot Learners." arXiv:2005.14165.

Devlin, J., Chang, M.-W., Lee, K., and Toutanova, K. (2019). "BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding." In Proceedings of NAACL 2019, pp. 4171-4186.

Houlsby, N., Giurgiu, A., Jastrzebski, S., Morrone, B., de Laroussilhe, Q., Gesmundo, A., Attariyan, M., and Gelly, S. (2019). "Parameter-Efficient Transfer Learning for NLP." arXiv:1902.00751.

Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., Wang, L., and Chen, W. (2021). "LoRA: Low-Rank Adaptation of Large Language Models." arXiv:2106.09685.

Paszke, A., Gross, S., Massa, F., Lerer, A., Bradbury, J., Chanan, G., Killeen, T., Lin, Z., Gimelshein, N., Antiga, L., Desmaison, A., Kopf, A., Yang, E., DeVito, Z., Raison, M., Tejani, A., Chilamkurthy, S., Steiner, B., Fang, L., Bai, J., and Chintala, S. (2019). "PyTorch: An Imperative Style, High-Performance Deep Learning Library." In Proceedings of NeurIPS, pp. 8024-8035.

Wolf, T., Debut, L., Sanh, V., Chaumond, J., Delangue, C., Moi, A., Cistac, P., Rault, T., Louf, R., Funtowicz, M., Davison, J., Shleifer, S., von Platen, P., Ma, C., Jernite, Y., Plu, J., Xu, C., Scao, T. L., Gugger, S., Drame, M., Lhoest, Q., and Rush, A. M. (2020). "Transformers: State-of-the-Art Natural Language Processing." In Proceedings EMNLP 2020: System Demonstrations, pp. 38-45.

## 付録

大規模言語モデルの発展と深層学習モデルの訓練の必要性最近になって, OpenAIが発表した ChatGPT $^{21}$, GPT-3 (Brown et al. 2020), GPT-4 ${ }^{22}$ や, Meta が発表した LLaMA ${ }^{23}$, スタンフォー


発的な注目が集まっている。これらのモデルは, 生成文を条件付けるための入力文 (prompt)を用いることで，パラメータを更新せずとも多様なタスクに適用可能であ.これらの適用手法は in-context learning と呼ばれる. 大規模言語モデルを活用することで, 従来の深層学習では不可欠であった「タスクに合わせて損失関数を設計し, 誤差逆伝播法によってモデルのパラメータを更新する」という手順の必要性が幾分か低減した。一方で，大規模言語モデルに対して Adapter (Houlsby et al. 2019) や LoRA (Hu et al. 2021) といった, 巨大なモデルと比較してごく少数のパラメータの更新を行う手法を用いることで, モデルの微調整を行う事例が数多く見られるようになってきてもいる 25,26 . 大規模言語モデルの発展と並行して「深層学習モデルの訓練」は独創的な研究をするために不可欠な技術であり続け, この手続きを理解することは, 深層学習を用いた研究を始めるための重要な一歩であり続けるだろう.

## 注目すべき資料
- Ascender ${ }^{27}$ : 本実装と同様, Python を用いた研究のためのテンプレート実装である. コー ドフォーマッタや Docker などの開発環境が整備されており参考になる.
- HuggingFace: Transformers (Wolf et al. 2020)のほか, Tokenizers ${ }^{28}$, Datasets ${ }^{29}$, Acceler$\mathrm{ate}^{30}$ など，見通しよく効率的に実装を行うためのライブラリが数多く公開されている. また，Transformersに実装されているモデル構造 31 や実装例 32 も参考になる.

・ ライブラリ: 巨大なモデルで訓練・推論するためのライブラリとして, DeepSpeed ${ }^{33}$ や FlexGen 34 が注目されている. また, PyTorch $2.0^{35}$ や Flax36など, 深層学習用フレームワークの発展も注目に値する.


## 略歴

塚越駿：2021 年名古屋大学情報学部卒業. 2023 年名古屋大学大学院情報学研究科知能システム学専攻博士前期課程修了. 修士 (情報学). 同年同専攻博士後期課程に進学. 2023 年度日本学術振興会特別研究員 (DC1) 採用.

平子潤 : 2021 年名古屋大学情報学部卒業. 2023 年名古屋大学大学院情報学研究科知能システム学専攻博士前期課程修了. 修士（情報学）。2023 年 4 月よりヤフー株式会社所属. 言語処理学会第 29 回年次大会若手奨励賞受賞.