能動学習のツールgo-active-learningのリポジトリをアーカイブしました & アノテーションに関するポエム

能動学習のコマンドラインツールのリポジトリをアーカイブしたついでに、アノテーションに関するポエムを書きました。

背景

数年前、色んなドメインの教師データをアノテーションしまくる必要が仕事でありました。最初はGoogle SpreadSheetでアノテーションしていたものの、めっちゃめんどいし(ブラウザのタブ行ったりきたり)、ランダムのアノテーションするため「この事例追加しても性能あんまり変わらんやろ。時間ないし、もっと性能上がりそうなやつを集中的にアノテーションさせてくれ!」と思って作った能動学習のためのコマンドラインツールがgo-active-learningでした。

実際に使ってみた例は以下のエントリで書いています。コマンドラインだと一人でアノテーションしないといけないので、Slackでチームメンバーもアノテーションできる拡張なども作っていました。

アーカイブの理由

ドッグフーディングする機会が減った

仕事でちょっとテキストを扱う時間が減った(Mackerelで異常検知やってたので)ので、テキストやWebページに対してアノテーションする機会が減った、というのが理由です。自分がアクティブに使わないものはメンテできない。

複数に散らばったリポジトリをモノレポにしたかった

使っていないというのはちょっと言い過ぎで、趣味プロジェクトのML-Newsではgo-active-learningをライブラリとして使っていました。ML-Newsは機械学習っぽいエントリを集めるサービスなので、機械学習かどうかを判定するための教師データが必要なため、ライブラリとして使っていました。

ただ、運用が結構面倒なことになっていました。関連するリポジトリが3つあって、ML-Newsにリリースするまで手順が増えてしまっていました。

CI/CDの手順を改善していく中で、複数のリポジトリに分散してしまっているのが非常に面倒(パイプラインが組みにくい)ため、週末の時間を使ってモノレポにまとめました。まとめた結果、go-active-learningはライブラリとしての役割を終えたので、アーカイブしました。

脱線ポエム: アノテーションを特別なものにしないために

go-active-learningは最初は能動学習で効率的にアノテーションするために作ったわけですが、ML-Newsを数年運用していると、毎日トップページに目を通していて、ほぼ全てのものにアノテーションを付与しています。学習器が大分賢くなってきたため、負例(機械学習系のエントリではない)はほとんどアノテーションする機会がなく、正例(機械学習系のエントリ)のアノテーションの件数が毎日少しずつ増えていってます。特徴量はほぼ触っていないにも関わらず、データの追加だけで性能はじわじわよくなってきてます。

f:id:syou6162:20210404214605p:plainf:id:syou6162:20210404214611p:plain
正例(左)と負例(右)のアーノテーション数の推移。アノテーションの絶対数は負例が正例より多いが、増え方はサチってきてる。一方、正例は順調にまだまだ増えている

三日坊主になりがちな自分が年単位でこのチマチマした作業を続けていられるのは、機械学習やデータに関することが好きだからです。昼休みや通勤時間に暇さえあればアノテーションしている。全然興味のない分野のアノテーションを仕事でやれと言われたら、500件を2日も付けたら飽きて止めてしまう。1000件程度のアノテーションしかないデータで作られた学習器は精度もなかなか出ないでしょうし、出たとしてもすぐ精度が劣化していくでしょう。

サービスに機械学習を使った機能を運用するときにも、似たことを最近よく考えます。機能リリースの前に集中的にアノテーションしまくるのもいいですが、機能は出してからの期間がむしろ長いです。その間にデータの傾向は変わっていきますし(Concept Driftなど)、傾向の変化に追従できなければコードが腐っていくのと同じく性能も徐々に落ちます。また、逆のパターンもありますね。業務フローの中でアノテーションが日々行なわれているにも関わらず、機械学習側に反映されずにユーザーに届けられる価値が限定されてしまう、とか。

こうならないためにどうすればいいかと考えると、機能リリースの前など特別な時に限らず日々の生活や業務フローの中で呼吸するかのごとくアノテーションが組み込まれるのが理想なんだろうと思います(その場合は業務の名前は「アノテーション」ではないものだろうと思う)。一時的にアノテーションしたデータの仕様はあっという間に頭から揮発しますが、日々チームのメンバーが事例を目にして議論して洗練させていく。その中で意思決定や機械学習の精度も人知れず向上していく、そういう全体の仕組みを考えたり整えられる人間になりたいなぁと妄想しています。

ポエム補足

上記のポエムは能動学習不要とかそういうことを言いたいものではないです。そもそも使われるか分からない、PoCでひとまずまとまった量のデータが欲しいといった場合は今後も能動学習は有用なものであると思います。