こんにちは、アプリケーションエンジニアの id:syou6162です。2018年になってしまいましたが、2017年のはてなにおける機械学習の取り組みについて振り返ってみたいと思います。

機械学習サブ会とは

はてなではより専門的な内容に関するエンジニアの小集団として、サブ会という制度が昨年から開始されています。昨年までは個人的に機械学習勉強会をランチタイムに運営していましたが、社内で正式にサブ会として認定されたことにより、業務時間内に活動しやすくなりました。このエントリではサブ会発足からの約八ヶ月の活動を振り返りってみたいと思います。

簡単に背景について説明しておきます。はてなは現在のところ、研究開発専門の部門は存在せず、アプリケーションエンジニアが機械学習に関連する/しないコードを書いたり(人によって変動しますが、2:8〜3:7くらいの割合でしょうか)、最近の機械学習の動向のチェックをしています。同じようなエンジニアの方々の参考になれば幸いです。

リソース/ツール整備

「機械学習をやったことがないが、これからやっていきたい」という社内のエンジニア向けに機械学習のリソース整備を進めています。上述したように機械学習専門の研究開発部門と同等程度の「人/計算機パワー(GPUなど)/データ作成資金」は準備できませんが、ある程度工夫できると思っています。ここでいうリソース整備とは

社内でよくあるタスクに対して、さっと手を動かせるようになるための教科書の整備 Python/Scala/Perlによるお手本実装 Pythonを使うことが多いので、pyenvやおすすめライブラリの一覧など 手っ取り早く始められるようにDockerfileの整備

社内の機械学習で使っている教師データの整備 「コードはgithub enterpriseにあるが、データがない...」という状態では学習が進みません 20newsの分類から始めてもらってもよいですが、社内の実データのほうが興味が持てますし、日本語特有の前処理なども経験してもらえるので、自前で整備しておくといいことがあります



などを指します。また、社内の機械学習タスクの性質として、ラベル付き教師データを1タスクに数万個に付与して学習するタスクよりも

タスクAでは1000程度のラベル付き教師データが工数的に作成可能

タスクBでは2000程度のラベル付き教師データが工数的に作成可能

タスクCでは500程度のラベル付き教師データが工数的に作成可能

...

といったタスクが多いということがあります。こうした背景から

同じラベル数のアノテーションをするなら、なるべく精度が高くなるようにアノテーションするべくslack経由で能動学習ができるツールを作成

タスクA, B, C, ...どれでも活用できるようなpre-trainedモデル(NLPならword2vec/GloVe、画像ならVGGなど)や古典的なクラスタリング(Brown clusteringなど)特徴量の整備 整備自体は機械学習にある程度詳しい人間が一回頑張ればよい、詳しくない人でもその成果に乗れることができる仕組みを目指す 少量のラベル付きデータでなるべく高い性能を目指す 特に未知語や低頻度語に対するカバレッジを上げる



といったツールやリソースの整備を進めています。

定例会

活動の基盤は隔週の定例会です。毎回1時間の枠で、大まかに2つのトピックについて話します。

プロジェクトの近況を共有、より専門的な困り事を相談

この枠では、社内でいくつか走っている機械学習プロジェクトの近況を共有、チームで相談するには専門的すぎる困り事などを相談しています。相談事の典型的な例を挙げると

機械学習の細かい事項(どういったモデルや特徴量を使うとよいか)

教師ラベルのアノテーションの基準について

どれくらい教師データを準備すればよいか

機械学習に特有の学習データの管理の仕方

リリース後の性能の定期的なトラッキング

モデルのバージョン管理をどうやっていくか

などがあります。普段はチームには所属していないサブ会のメンバーが、一時的にコードレビューすることもあります。レビューをすることで、チーム内レビューでは得られにくい機械学習に関する専門的なレビューが得られますし、レビューする側も前処理やチューニングのテクニックの知見の共有をすることもできます。機械学習のコードはともすれば属人的なものになってしまうこともありますが、レビューを通じて属人的な要素をなるべく排除したいといった意図もあります。こうしたレビューを通した活動は社内のスマート会(スマートフォンアプリ開発エンジニアのサブ会)から真似をしました。

また、タスクによっては分類器の全体的な性能(例: F値)を上げるよりもFalse Positiveがあまり許容できない(例: 誤分類による対応でサポートコストが増加しすぎるなど)などの制約があるので、それに合わせた解き方になるように議論します。Jupyter Notebook等で簡単なデータ解析(ヒストグラムを見たりクロス表を取るなど)を行なってからサービスのディレクターに状況や方針を共有し、ルールベースでも大部分が対応できるような問題であれば機械学習を採用しないといった意思決定をすることも当然あります。研究開発専門の部門が存在しないことは弱みのようにも思えますが、サービスが普段どのように運用、メンテナンスされているかを知っているエンジニア自身が機械学習のコードも書くことは強みにもなりえると思いますし、機械学習やデータ分析においてサービスの傾向やデータに関する知見は最新の深層学習の技術に勝るとも劣らない武器だと思います*1。

社内では分類問題のような教師あり学習を扱うことが多かったですが、最近では異常検知のような教師なし学習を扱う機会が出てきました。このように社内でこれまで運用実績があまりないような手法を検討する際には、いきなりサービスにデプロイするコードを書かず、プロトタイプで様々なデータに対してシンプルではあるが頑健に動くモデルを検討する、といったやり方を採用しています。

技術共有/雑談

この枠では

最近自分がやってみた機械学習の取り組み 実装してみた(例1, 例2)、論文を読んだ(例1, 例2)

SNS等で見つけた気になるニュースの共有(例) 国際/国内会議のProceedingsやチュートリアル資料の共有



といった機械学習に関連する話題を雑談的に行なっています。この取り組みはフロントエンド会(フロントエンドが得意なエンジニアが集まるサブ会)から真似をしました。雑談ではありますが、知識の共有やそこから広がるアイディアもたくさんあるのでオススメです。自分でリストアップしていくのは大変/時間がないという方は@icoxfog417さんが毎週まとめてくださっているニュースからピックアップするとよいかもしれません。

論文読み会/専門書の輪講会

これは様々な会社でも行なわれることが多いと思います。定期的な論文読み会を行なったり、業務で必要な専門知識の共有を目的をしています。社外に出せるものはなるべくアウトプットしていくことをサブ会の目標としています。

社内で機械学習ハッカソンの開催

普段なかなか試せない機械学習のアイディアを試す場として機械学習ハッカソンも開催しました。アドベントカレンダーにエントリがあるので、詳細はそちらを参照してください。

developer.hatenastaff.com

おわりに

このエントリでははてな社内での機械学習に関する取り組みについて紹介しました。サブ会の活動を始めてからまだ一年も経っていないため手探りで運営しているところもありますが、今後も継続的に活動し機械学習を適材適所で使っていきながらサービスをよりよいものにしていきたいと思います。