能動学習のコマンドラインツールのリポジトリをアーカイブしたついでに、アノテーションに関するポエムを書きました。
背景
数年前、色んなドメインの教師データをアノテーションしまくる必要が仕事でありました。最初はGoogle SpreadSheetでアノテーションしていたものの、めっちゃめんどいし(ブラウザのタブ行ったりきたり)、ランダムのアノテーションするため「この事例追加しても性能あんまり変わらんやろ。時間ないし、もっと性能上がりそうなやつを集中的にアノテーションさせてくれ!」と思って作った能動学習のためのコマンドラインツールがgo-active-learningでした。
実際に使ってみた例は以下のエントリで書いています。コマンドラインだと一人でアノテーションしないといけないので、Slackでチームメンバーもアノテーションできる拡張なども作っていました。
アーカイブの理由
ドッグフーディングする機会が減った
仕事でちょっとテキストを扱う時間が減った(Mackerelで異常検知やってたので)ので、テキストやWebページに対してアノテーションする機会が減った、というのが理由です。自分がアクティブに使わないものはメンテできない。
複数に散らばったリポジトリをモノレポにしたかった
使っていないというのはちょっと言い過ぎで、趣味プロジェクトのML-Newsではgo-active-learningをライブラリとして使っていました。ML-Newsは機械学習っぽいエントリを集めるサービスなので、機械学習かどうかを判定するための教師データが必要なため、ライブラリとして使っていました。
ただ、運用が結構面倒なことになっていました。関連するリポジトリが3つあって、ML-Newsにリリースするまで手順が増えてしまっていました。
- https://github.com/syou6162/go-active-learning
- coreの部分
- https://github.com/syou6162/go-active-learning-web
- coreを使って判定した結果をAPIで返すGoのサーバーや、フロント部分に必要なVue(Nuxt)のコードを管理
- go-active-learning-provisioning
- AWS上でML-Newsは動かしているため、CloudFormationなどのコードを管理
- プライベートリポジトリです
CI/CDの手順を改善していく中で、複数のリポジトリに分散してしまっているのが非常に面倒(パイプラインが組みにくい)ため、週末の時間を使ってモノレポにまとめました。まとめた結果、go-active-learningはライブラリとしての役割を終えたので、アーカイブしました。
脱線ポエム: アノテーションを特別なものにしないために
go-active-learningは最初は能動学習で効率的にアノテーションするために作ったわけですが、ML-Newsを数年運用していると、毎日トップページに目を通していて、ほぼ全てのものにアノテーションを付与しています。学習器が大分賢くなってきたため、負例(機械学習系のエントリではない)はほとんどアノテーションする機会がなく、正例(機械学習系のエントリ)のアノテーションの件数が毎日少しずつ増えていってます。特徴量はほぼ触っていないにも関わらず、データの追加だけで性能はじわじわよくなってきてます。
三日坊主になりがちな自分が年単位でこのチマチマした作業を続けていられるのは、機械学習やデータに関することが好きだからです。昼休みや通勤時間に暇さえあればアノテーションしている。全然興味のない分野のアノテーションを仕事でやれと言われたら、500件を2日も付けたら飽きて止めてしまう。1000件程度のアノテーションしかないデータで作られた学習器は精度もなかなか出ないでしょうし、出たとしてもすぐ精度が劣化していくでしょう。
サービスに機械学習を使った機能を運用するときにも、似たことを最近よく考えます。機能リリースの前に集中的にアノテーションしまくるのもいいですが、機能は出してからの期間がむしろ長いです。その間にデータの傾向は変わっていきますし(Concept Driftなど)、傾向の変化に追従できなければコードが腐っていくのと同じく性能も徐々に落ちます。また、逆のパターンもありますね。業務フローの中でアノテーションが日々行なわれているにも関わらず、機械学習側に反映されずにユーザーに届けられる価値が限定されてしまう、とか。
こうならないためにどうすればいいかと考えると、機能リリースの前など特別な時に限らず日々の生活や業務フローの中で呼吸するかのごとくアノテーションが組み込まれるのが理想なんだろうと思います(その場合は業務の名前は「アノテーション」ではないものだろうと思う)。一時的にアノテーションしたデータの仕様はあっという間に頭から揮発しますが、日々チームのメンバーが事例を目にして議論して洗練させていく。その中で意思決定や機械学習の精度も人知れず向上していく、そういう全体の仕組みを考えたり整えられる人間になりたいなぁと妄想しています。
あと、気合いで一時的にデータ増やすのは特定の人の気力を生贄に何とかできるけど、実プロダクトはconcept driftとかあって生贄モデルでどうにもならないので、普段の業務フローの中にいかに自然にアノテーションを組み込んでいくかみたいなところ(テクニカルサポートの人と協力とか)に興味がある
— Yasuhisa Yoshida (@syou6162) March 22, 2021
ようやく見つけた。クックパッドさんのこういう感じのイメージhttps://t.co/4CcRbanOvChttps://t.co/MMdmRH5Gjz
— Yasuhisa Yoshida (@syou6162) March 22, 2021
ポエム補足
上記のポエムは能動学習不要とかそういうことを言いたいものではないです。そもそも使われるか分からない、PoCでひとまずまとまった量のデータが欲しいといった場合は今後も能動学習は有用なものであると思います。