\documentclass[japanese,other]{jnlp_3.6}
\usepackage{jnlpbbl_2.2}
\usepackage[dvipdfmx]{graphicx}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{url}
\usepackage{hangcaption_jnlp}
%%%%\usepackage{udline}
%%%%\setulminsep{1.2ex}{0.2ex}
%%%%\let\underline=\ul
\allowdisplaybreaks


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% author's definition
%%%%\usepackage[multiple]{footmisc}
%%%%\usepackage{fancyvrb}
%%%%\usepackage{listings}
%%%%\lstset{basicstyle=\ttfamily,
%%%%  showstringspaces=false,
%%%%}
%%%%\renewcommand\UrlFont{\rmfamily}
\newcommand{\footlink}[1]{\footnote{\url{#1}}}
\newcommand{\footsep}{{$^{,}$}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\Volume{30}
\Number{2}
\Month{June}
\Year{2023}
%%%%\Issuetitle{「　　　　」特集号}


\setcounter{page}{867}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\jsubject{学会記事}
\jtitle{BERTによるテキスト分類チュートリアル}
\jauthor{塚越　　駿\affiref{Author_1} \and 平子　　潤\affiref{Author_1}}

\etitle{BERT Classification Tutorial}
\eauthor{Hayato Tsukagoshi\affiref{Author_1} \and Jun Hirako\affiref{Author_1}} 

\headauthor{塚越，平子}
\headtitle{BERTによるテキスト分類チュートリアル}

\affilabel{Author_1}{名古屋大学}{Nagoya University}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\maketitle


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{はじめに}

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

BERTによるテキスト分類チュートリアル\footlink{https://github.com/hppRC/bert-classification-tutorial}は，上述の問題を解決するため，モダンで高品質な参考実装を目指し2023年1月に筆者がGitHub上で公開した実装例である．
本稿執筆時点までに150を超えるstar\footnote{TwitterなどのSNSにおける「いいね」のようなもの．}が付いており，大きな反響があった．
また，本実装については「言語処理学会第29回年次大会 併設ワークショップ JLR2023 日本語言語資源の構築と利用性の向上」\footlink{https://jedworkshop.github.io/JLR2023}でも発表\footlink{https://speakerdeck.com/hpprc/zi-yuan-tositejian-rushi-yan-puroguramu}し，
実装の工夫について多くの好意的な評価をいただいた．
本稿では，BERTによるテキスト分類チュートリアルの概要について述べ，実装にあたって意識した適切な実験管理のための方策と工夫について紹介する．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{BERTによるテキスト分類チュートリアル}

本実装は，BERTを用いたテキスト分類をテーマに，
\pagebreak
モダンで高品質な深層学習用のテンプレート実装を目指したものである．
特に，自然言語処理の初学者が参考にすることを念頭に，現代の深層学習プロジェクトで必須の要素を漏れなく含みつつ，可能な限り明快な実装となるよう心がけた．
本実装の主要な工夫点は以下の通りである．
\begin{itemize}
    \item Python 3.10，PyTorch 1.13，Transformers 4.25以上に対応したモダンな記法・実装
    \item 「データセット作成」→「訓練と評価」という単方向的な実験プロセスの実践
    \item 実験テンプレートとしてその他のタスクへの転用が容易な実装
\end{itemize}
次に，本実装の要点について述べる．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% fig. 1
\begin{figure}[t]
\begin{center}
\includegraphics{30-2ia30f1.pdf}
\end{center}
\caption{本実装によるテキスト分類の流れを示す概観図．}
\label{fig:overview}
\vspace{-1\Cvs}
\end{figure}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


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


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{環境構築とライブラリ選定}
本実装はモダンな深層学習プロジェクトのテンプレート・参考実装として利用されること目的としている．
したがって，可能な限り新しいバージョンのPythonとライブラリを採用した．
環境構築には，近年利用が広がっているPythonのパッケージマネージャPoetry\footlink{https://python-poetry.org/}と，科学計算用ライブラリ用のパッケージマネージャMiniconda\footlink{https://docs.conda.io/en/latest/miniconda.html}の二つを想定し，初学者が躓きがちなインストール手順もREADMEに記載した．
また，初学者が本実装を参考にする際に，実装の詳細を過度に隠蔽してしまうと，将来的な学習の妨げとなることが予想される．
したがって，本実装ではデータセットの前処理など，実際に自身で研究を進める場合に必ず行わなければいけないような処理については，多少冗長でも出来るだけ愚直に書き下すという実装方針をとった．
そのため，PyTorch Lightning\footlink{https://github.com/Lightning-AI/lightning}, ML Flow\footlink{https://mlflow.org/}, Hydra\footlink{https://github.com/facebookresearch/hydra}といった，実験・ハイパーパラメータ管理用のフレームワークは採用しなかった．
一方で，深層学習を用いた自然言語処理で極めて一般的に用いられているPyTorch \cite{PyTorch}やTransformers \cite{Transformers}といったライブラリは，積極的に新しいバージョンのものを採用した．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{データセット}
テキスト分類の題材に用いるデータセットとして，RONDHUIT社が公開するlivedoorニュースコーパス\footlink{https://www.rondhuit.com/download.html\#ldcc}を用いた．
本実装では，訓練・評価を実施する前に，一括でデータセットの前処理を行う．
各訓練・評価のたびにデータセットの前処理を行うような実装も考えられるが，事前に前処理を行う実装方針には主に以下の2つの利点がある．
\begin{enumerate}
    \item 各実験の前処理の重複を減らし，オーバーヘッドを削減できる．
    \item 各実験で同じデータセットが用いられることを保証しやすく，バグを防ぎやすい．
\end{enumerate}
データセットはJSON Lines (JSONL)\footlink{https://jsonlines.org/}形式で扱うように設計した．
JSONL形式とは，1行に1つのJSON\footlink{https://www.rfc-editor.org/info/rfc8259} が記述されたデータ形式である．
深層学習プロジェクトではデータをCSV形式やTSV形式で記述することもあるが，これらのデータ形式は，配列や階層構造を持つデータの自然な表現が難しい．
一方で，JSONLは各データがそれぞれ独立した柔軟なデータ構造を持つことができ，深層学習でよく用いられるPythonとの相性が良く，非常に便利である．
データセットは訓練(train)，開発(validation)，テスト(test)の3つのセット\footnote{
最近では``split''と呼称することも多い．
}に分割し，深層学習プロジェクトにおける一般的な実験手続きを体験できるようにした．
データセットの分割には，Pythonの機械学習用ライブラリであるscikit-learn\footlink{https://scikit-learn.org/stable/}のtrain\_test\_split関数を用いる場合もあるが，本実装ではあえて全ての処理を書き下した．
データセットを適切に分割するという処理は，妥当な実験を行う上で極めて重要であるが，Python初学者にとっては比較的難度が高いと思われる．
そこで，分割処理を明示的に実装し，応用の足がかりとなることを狙った．
また，データセット作成の際には，ダウンロードした生データに直接変更を加えることはせず，生データから明示的に新しいデータセットを作成するように実装した．
これは，あるデータセットの変更を繰り返すことで生じる「どうやってデータを作成したかわからない」等の問題を避けるために，単方向的な処理の流れを意識した結果である．
なお，他のデータセットを利用する際も，同様の手続きで実験用データセットを作成できるように実装した．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{訓練と評価}
いくつかの既存の深層学習プロジェクトは，訓練と評価を別々に実行するように実装されている．
具体的には，(1)モデルの訓練と保存(2)保存済みのモデルの読み込みと評価という手順で実験を行う．
これに対し，本実装では訓練と評価を連続的に行う．
これにより，モデルの保存と読み込み処理が不要となるため，(1)訓練時と評価時でモデル構造の齟齬が発生しづらい(2)評価結果のみを保存すればよく管理が簡便，といった利点が見込める．
なお，本実装では，BERTのfine-tuningという1回あたりの実験コストが比較的小さいタスクを題材として用いたため，訓練と評価を一体とする実装方針をとった．
しかし，1回あたりの実験コストが比較的大きなタスクでは，訓練と評価を分離した方がより柔軟に実験を遂行できる可能性もある．
したがって，本実装を別のプロジェクトに転用する際には，それぞれのプロジェクトに合った訓練・評価方針を用いる必要がある点に注意されたい．
また，本実装では，コマンドライン引数として使用するGPUを変更できるようにしている．
これにより，例えば，\verb|nohup|コマンド\footnote{\texttt{nohup} コマンド（no hang upの略）は，サーバ上で実験を実行しておくためによく利用するコマンドである．例えば，SSHを用いて実験サーバに接続して実験を行なっている場合，通常はSSH接続を切断すると実験も中断されてしまう．このような場合に，\texttt{nohup}コマンドを用いることで実験を中断せずに実施できるようになる．}とシェルのバックグラウンド実行機能を利用することで，
図\ref{fig:run}に示すように複数のGPUを用いた並列実験が容易に実現できる\footnote{なお，環境変数に\texttt{CUDA\_VISIBLE\_DEVICES=1} などと設定することでも異なるGPUを利用することができる．}\footsep\footnote{tmuxのようなターミナルマルチプレクサを用いることでも，並列に実験を行うことが可能である．}．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% fig. 2
\begin{figure}[t]
\begin{center}
\includegraphics{30-2ia30f2.pdf}
\end{center}
\caption{複数のGPUで並列的に実験を行う際のコマンド例．}
\label{fig:run}
\vspace{-1\Cvs}
\end{figure}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\acknowledgment

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


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\bibliographystyle{jnlpbbl_1.7}
\bibliography{30refs}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\appendix

\paragraph{大規模言語モデルの発展と深層学習モデルの訓練の必要性}
最近になって，OpenAIが発表したChatGPT\footlink{https://openai.com/blog/chatgpt}, GPT-3 \cite{GPT-3}, GPT-4\footlink{https://openai.com/research/gpt-4}や，Metaが発表したLLaMA\footlink{https://ai.facebook.com/blog/large-language-model-llama-meta-ai}，
スタンフォード大学が発表したAlpaca\footlink{https://github.com/tatsu-lab/stanford_alpaca}のような，大規模言語モデル(Large Language Models; LLMs)に爆発的な注目が集まっている．
これらのモデルは，生成文を条件付けるための入力文(prompt)を用いることで，パラメータを更新せずとも多様なタスクに適用可能であ．
これらの適用手法はin-context learningと呼ばれる．
大規模言語モデルを活用することで，従来の深層学習では不可欠であった「タスクに合わせて損失関数を設計し，誤差逆伝播法によってモデルのパラメータを更新する」という手順の必要性が幾分か低減した．
一方で，大規模言語モデルに対してAdapter \cite{Adapter}やLoRA \cite{LoRA}といった，巨大なモデルと比較してごく少数のパラメータの更新を行う手法を用いることで，モデルの微調整を行う事例が数多く見られるようになってきてもいる\footlink{https://engineering.linecorp.com/ja/blog/lora-tuning-for-japanese-model}\footsep\footlink{https://huggingface.co/docs/diffusers/training/lora}．
大規模言語モデルの発展と並行して「深層学習モデルの訓練」は独創的な研究をするために不可欠な技術であり続け，この手続きを理解することは，深層学習を用いた研究を始めるための重要な一歩であり続けるだろう．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{注目すべき資料}
\begin{itemize}
    \item Ascender\protect\footlink{https://github.com/cvpaperchallenge/Ascender}: {%
本実装と同様，Pythonを用いた研究のためのテンプレート実装である．
コードフォーマッタやDockerなどの開発環境が整備されており参考になる．}
    \item HuggingFace: {%
Transformers \cite{Transformers}のほか，Tokenizers\footlink{https://github.com/huggingface/tokenizers},
Datasets\footlink{https://github.com/huggingface/datasets},
Accelerate\footlink{https://github.com/huggingface/accelerate}
など，見通しよく効率的に実装を行うためのライブラリが数多く公開されている．
また，Transformersに実装されているモデル構造\footlink{https://github.com/huggingface/transformers/tree/main/src/transformers/models}や実装例\footlink{https://github.com/huggingface/transformers/tree/main/examples/pytorch}も参考になる．}
    \item ライブラリ: {%
巨大なモデルで訓練・推論するためのライブラリとして，DeepSpeed\footlink{https://github.com/microsoft/DeepSpeed}やFlexGen\footlink{https://github.com/FMInference/FlexGen}が注目されている．
また，PyTorch 2.0\footlink{https://pytorch.org/get-started/pytorch-2.0/}やFlax\footlink{https://github.com/google/flax}など，深層学習用フレームワークの発展も注目に値する．}

\end{itemize}

\clearpage

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{biography}

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

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




\end{document}





