はてな社内で行なっている機械学習勉強会について紹介します

このエントリは、はてなエンジニアアドベントカレンダー2016の21日目の記事です。昨日は id:hakobe932さんによる次に何を勉強するかを決めるための作戦でした。

こんにちは、アプリケーションエンジニアのid:syou6162です。このエントリでは、今年の9月から社内で行なっている機械学習勉強会についての概要と、この数ヶ月でやってきた内容について紹介したいと思います。

最新の論文読み会、だけでいいのか?

私は今年の3月まで自然言語処理/機械学習の企業研究者として働いていて、転職して4月からはてなでエンジニアとして働いています。「転職してからあまり論文読めていないなぁー」と思い、秋から論文読み会をやろうと考えていました。しかし、(まだまだ期間は短かいですが)春からエンジニアとして働いてきたことを振り返ると、機械学習をサービスに展開するにあたって、論文を読むだけでは十分ではないとも思いました。例えば、少なくとも以下のような要素は考慮する必要がありました。

  • 学習データをどうやって集めるのがよいかは自明ではない
    • エンジニアはひたすら地道にアノテーションし続けるのが得意というわけでもない
  • はてなの場合、機械学習に強みを持つエンジニアはある程度いるが、多数派ではない
    • あまりに複雑すぎるものを採用すると技術的負債になる可能性が高い
    • 達人による謎のチューニングテクニックがないと精度が出ないようなものは困る
    • サポート担当から「ユーザーからこういう指摘があった」という報告を受けた際、精度はよいが挙動が掴みにくいものだと具体的にどう改善していいか分からず困る...
  • 機械学習を使った機能は機械学習を使わない機能よりもディレクターやプロデューサーが工数の見積りづらい
  • 大量のユーザーに機械学習を使った推薦や異常検知を行なうにはどういったインフラ/ミドルウェアが適しているのか

こうして列挙してみると、アプリケーションエンジニアだけでなく、インフラエンジニア、サポート、ディレクター、プロデューサーなど様々な職種の人と一緒に考えていくとよいのではないかと考え、社内で参加者を募りました。今日までに機械学習勉強会を7回開催しましたが、アプリケーションエンジニア、インフラエンジニア、ディレクターが定期的に参加してくれています。他業種が集まって機械学習を使ったサービスについてディスカッションしていくと自分にはなかった観点の発見がありました。

他社から学ぶ

勉強会の最初の時期はサービスに機械学習をうまく使っている事例を見ることによって知見を集めました。何社かの事例を見ましたが、サイバーエージェントさんの以下のテックレポートが特に参考になりました。

私としては、特に特徴量や精度の時系列変化をきちんと計測するという取り組みが特に参考になりました。Webシステムではユーザーのフィードバックを受けて教師データが追加/編集されることがありますし、あるデプロイのタイミングから特定の特徴量の抽出が失敗して精度が悪化している(しかし、分類器としては何かしらのラベルを返しているため、発見が遅れてしまう!)こともあります。spammerの傾向も変わります。

まずは身近なところから始めてみようということで、自分で運用しているエントリ推薦botの予測精度や教師データのラベルの割合をトラッキングするところから始めていますMackerelでグラフにすることでどの時期のデプロイから精度が落ちたかや、精度が閾値を下回ったらSlackに通知させることができるようになりました。

f:id:syou6162:20161217224857p:plain

機械学習の学習データをどうやって効率的に作るか

機械学習を使ったサービスを作るにあたって、学習データの作成は欠かせない工程です。しかし、淡々とデータを作っていくのはなかなか大変ですし、同じ精度を出せるならなるべく少量のデータで実現できるとハッピーです。これを実現する手法として能動学習が有名ですが、私自身試した経験がなく社内であまり試されていませんでした。いい機会だったので実際のタスクで実験し、結果を勉強会で共有しました。

結論としては、割と効果があり闇雲にアノテーションを頑張るより能動学習を積極的に使っていくとよさそうだという知見が得られました。論文で似たような事例を紹介してもよかったのかもしれませんが、はてなの実際のタスクを元に実験をしてどれくらいの作業時間が減らせそうかが(一例ですが)分かったということもあって、データ作成を含めた機械学習のプロセスをまだやったことがないエンジニアやディレクターの参考になっていると嬉しいです。

サービスへの事例や技術選定の基準をキーワードにまとめていく

はてなでは機械学習専門のチームはまだ存在しないため、社内で適用された機械学習に関する情報が各チームばらばらに存在している状態でした。情報がばらばらになっていると、例えば以下のようなときに困ります。

  • あるサービスで使われている機械学習の学習データがどこにあるか分からないため、改善しようと思っても気軽にはアイディアを試せない
  • 新しいサービスに機械学習を使おうとしているが、どの学習器を使うと安定して運用、メンテナンスしていけるのか指針が立てられない

こうした状況はあまり好ましくないため、技術グループ(はてなの技術グループに関してはid:motemenさんがまとめています)のはてなグループのキーワードに学習データのリソースの場所、使っている学習器、開発当時の担当者のログ(日報)などをまとめていきました。

また、はてなのサービスはリリースされると長く運用されることもあり、パフォーマンス要件を満たしつつ継続的にメンテナンスしやすい技術を選んでいく必要があります。プログラミング言語やミドルウェアに関しては技術グループで基準がありましたが、機械学習についての基準は特にありませんでした。機械学習勉強会をきっかけに機械学習をプロダクトに入れる際に考える採用基準について考え、一箇所にまとめる活動をしました。

ときには最近の機械学習技術の話題にもキャッチアップ

機械学習や自然言語処理界隈は皆さんご存知の通り、急速な勢いで発展していることもあるため、最近の研究開発の話題もときどき勉強会で取り扱っています。最初はランチタイムにGitHub Enterpirseのissueに書き込んだネタを共有していたのですが、社外に公開したほうがより情報も集まってくるだろうということで、定期的にまとめたものを公開しています。

これらの回では1つのネタは軽く紹介するものでしたが、そうでない回もあります。先月はGoogle翻訳が深層学習を使ってかなり大きな改善をしたというイベントがあったため

  • 深層学習以前はどのようなものが困難であったか
  • どのような技術を用いてそれらを解決したのか
  • 深層学習を用いたことによる新たな問題点にはどのようなものがあるか

を中心に説明しました。最先端の細かい技術は数年するとディファクトが変わっている可能性も大きいため、今後も(直接ではないにしろ)残っていくと思われるAttention付きのEncoder-Decoderについて説明しました。

また、機械学習の新たな応用先の1つと考えられているクラウドソーシングやhuman computationについて学んだ回もありました。

まとめ

社内で行なっている機械学習勉強会、その勉強会がきっかけになって行なっている活動についてまとめました。このような機械学習の様々な分野への適応事例、最新の手法の紹介などに興味があり、現在機械学習に取り組まれているエンジニアの方(現在は京都オフィスのみで勉強会をやっておりますので、京都でお会いできる方)は是非ランチタイムに遊びにきてください。ご連絡は @syou6162 までどうぞ!

hatenacorp.jp

明日のアドベントカレンダーはid:takuya-aさんです!