はじめに
はじめまして、エムスリー AI・機械学習チームの河合(@vaaaaanquish)です。 最近、以下機械学習コンペティションにて 182人中 2位 になりました。
Nishikaサービスローンチコンペ AIは芥川龍之介を見分けられるのか?
本記事は、コンペティションの解法の紹介をしつつ、3月7より開催されている技術書典 応援祭にて販売される、私も執筆に参加したエムスリーテックブック2を宣伝するものです。
- はじめに
- コンペティション概要
- 利用したfeatureとmodel
- コンペティション開催中の行動
- 機械学習パイプラインの選定としてgokartはどうだったか
- おわりに
- We are hiring !!
コンペティション概要
青空文庫に登録されている10作家の作品、計4732作品の中から芥川龍之介の作品を機械学習で見つけるものです。 答えとなるデータは青空文庫で公開されている訳ですが、こちらを利用するのはもちろんルール上で禁止されています。
データ内には以下のような文章データと著者が芥川龍之介であるか否かの情報が含まれている、シンプルな2値分類の問題です。
writing_id,body,author 3,"[#3字下げ]一[#「一」は中見出し]島々《しま/\》と云ふ町の宿屋へ着いたのは...",1
上記のデータサンプルは芥川龍之介 槍ヶ嶽紀行のデータの省略形です。 このような青空文庫内のほぼ生のデータが、trainとtestに分けられて提供されており、testデータ内のF値が高いモデルを作成する事を目的としています。
利用したfeatureとmodel
以下は機械学習コンペティションでよく見られる、少し分かった気になる図です。
図の通り、ルールベースの特徴に加えて、NLPにおいて一般的なBERTやTF-IDFといった特徴を使っていました。 分類もまたLightGBMやNeural Networkといった一般的なモデルをOptunaで最適化する形です。
今回のコンペティションでは、上述のパイプラインをgokart、redshellsを用いて作成しています。これらはエムスリー AI・機械学習チームが作成しているOSSです*1。
- gokart: GitHub - m3dev/gokart: A wrapper of the data pipeline library "luigi"
- redshells: GitHub - m3dev/redshells: Machine learning tasks which are used with data pipeline library "luigi" and its wrapper "gokart".
gokartによって全てのパラメータと乱数シード値、CVの値の組み合わせを全て自動で保存、rerunを簡易に行えるようになっています。 また、redshellsがパイプライン内のTF-IDF、トピックモデル、FastText、SCDV、LightGBM、CatBoost、XGBoostとOptunaによる最適化のタスクをサポートしているため、そちらを呼び出すコードだけ実装されています。
全てのコードはGitHub上で公開していますので、これらのツールを利用する時のExampleになると思います。
コンペティション開催中の行動
ルールベースで最終的に200個くらいの特徴量を生成しました。精度向上に関して効果が大きかった物は以下のような特徴量でした。
- 芥川龍之介、芥川、その他有名な文豪名、地名を利用した特徴量
- 手記のような文章で見られる芥川の名前や「(文豪) と旅行に行った」「夏目先生」といった表現
- 県名から銀座等の地名
- 龍之介、江戸などの旧表記
- 芥川龍之介の東大英文科での研究内容を想定し「法蘭西」や「西洋」といった単語を抽出
- 最終行に存在する「平成一九年二月」等の表記を利用した特徴量
- 芥川龍之介の文章の多くに日付情報が存在した(手記が多いため)
- 書いてあった場合、芥川龍之介の生年月日と執筆歴から1910年1月1日から1927年7月24日しかあり得ない事も利用した
文豪ストレイドッグスの知識として、芥川龍之介が僕(やつがれ)を利用するイメージから、一人称の情報等も追加しましたが、あまり効果がなく残念でした。
コンペティション概要を見た時、CVとして青空文庫をクロールして正解が作れるじゃないかと思いましたが、今回は行いませんでした(入賞者が変更になった事から不正も多かったのかなと類推しています)。 私は手元では、手記と小説のデータ、日付データの有無でそれぞれCVデータを切り分けK-Foldによる検証のみ行いました。K-Fold CVはredshells内にutilsとしてコードがあり簡易に実装できたためです。
以下はpublic scoreの遷移です。 redshellsで基本的なモデルをいくつか作成した後、少しコードを整理し、BERTを追加した時点で大きくCVスコアの向上が見られました。 また、文字の切り方、歴史的仮名遣いの扱いによっても出力が大きく変化したため、辞書やストップワードの内容それぞれパラメータとしたパイプラインとし、それぞれモデルを作成、ensembleによりスコアを上げました。
機械学習パイプラインの選定としてgokartはどうだったか
今回gokartとredshellsが機械学習モデリングのツールとして有用である事を示す目的から、年末年始休暇の5日間程を使い参加、無事入賞する事ができました*2。 当コンペティションの中で開発した「各random seedの自動保存」や「CatBoost+Optunaサポート」が実際にgokartやredshellsにmergeされており、OSSとしても押し進める事ができました。
一方で、gokartが機械学習コンペティション向けのライブラリであるかどうかについても考える良い機会になりました。
2月にfringe81社様と開催したMLOps勉強会においても以下のスライドで一部その内容について触れています。
上記を踏まえつつ、今回の感想も含めて、gokartで参加した簡易にまとめると以下のようになります。
- 簡易なモデルや構成は多くサポートされているため初動が早い
- 再現に必要な全ての値が自動で保存されているため楽
- gokartは基本的にテーブルデータやNLPを想定しているため更に大きなファイル(音声や画像など)のコンペティションに参加しづらそう
- コンペティションでは特に細かな修正が連続するため設計、開発の粒度が難しい
やはり、初動の早さと再現の簡易さはgokartのメリットであると強く感じました。 機械学習コンペティションの初動を早くするための独自ライブラリは、大量にPyPIに登録されていますが、パイプラインとしての機能を含んだ上で利用できるライブラリの中では、最も扱いやすいと思います。
一方、大きいネックとして大規模データを利用するコンペティションにスケールしない点があり、多くの種類のコンペティションに参加する人向けのパイプラインライブラリが必要とするものは少し違ってくるのかなという所感を持ちました。
AI・機械学習チームメンバーでKaggleに挑戦している者もおり、今後どういった機能が追加されていくのかも楽しみな所です。
こういった中で、「どういうパイプラインライブラリが機械学習プロジェクトには良いのかな?」「他にどういったライブラリがあるのかな?」という疑問から、現在開催されている技術書典 応援祭にて、「エムスリー テックブック2」の執筆に参加しています。
エムスリー テックブック2の私の担当章では、以下のような項目について触れています。
様々なパイプライン、ワークフローライブラリを触った上での分類や選定の際の重要な点について触れています。 コンペティションでのワークフロー選定のお供となればと思います。
手前味噌になりますが、是非お手に取って頂けると幸いです。
参考: www.m3tech.blog
おわりに
本記事では、Nishika様主催の機械学習コンペティションの2位解法とエムスリーテックブック2の宣伝を行いました。
今回気軽な気持ちでコンペティションに参加、gokartで素早い初動から短い期間で成果を出し、再現性などの担保を行える事を示せました(スコア的には同率1位で、参加が遅かったため負けているので、行動の初動が遅かった訳ですが)。
コンペティションの結果と共に、エムスリーテックブック2の執筆に参加できた事、素晴らしいOSS開発者各位に感謝を示し、本記事を締めたいと思います。
ご精読頂き、ありがとうございました。
We are hiring !!
エムスリーでは、積極的にOSS開発や実力、結果に自信のあるエンジニアを募集しています。 是非カジュアル面談からでもお話できればと思います。宜しくおねがいします。