Wantedlyで動いている機械学習事例
機械学習を開発するチームはまだ3~4名で、他のメンバーはインターンの学生で構成されています。そのため、統一的な環境を用意することはまだしていませんが、社内での定期的な勉強会などで情報を共有している段階です。
規模が大きくなると開発でもSparkなどの環境が必要になるかもしれませんが、現状では以下の技術要素で開発しています。
- Python
- Jupyter
- Docker
- scikit-learn
- Pandasなどの、データ分析計のライブラリ
- TensorFlow
ディープラーニングを走らせる際は、AWSのGPUインスタンス上でDockerを動かす環境を作ることもあります。
通常は、Jupyter環境を使用してデータ分析や機械学習で分類問題を解くメンバーが多いです。Jupyterは、ノートブックと呼ばれる単位でプログラムを記述し、インタラクティブに実行できる環境です。書いたコードとその実行結果はipynbファイルとして保存され、後から試行錯誤とその結果を見返したり共有したりできるメリットがあります。
事例:名刺情報からのプロフィールの構築
私たちが開発しているWantedly Peopleは名刺アプリです。複数の名刺画像をカメラから自動で認識し、文字情報からプロフィールを構築します。
ここでは、「大きく画像から名刺の領域を認識する」タスクと、「文字情報からプロフィールを構築する」タスクを解いています。
「大きく画像から名刺の領域を認識する」タスク
「文字情報からプロフィールを構築する」タスク
この「文字情報からプロフィールの構築する仕組み」は、3つの処理から成り立っています。
- 「文字情報からトークンの区切りを探す」
- 「トークンがプロフィールのどの項目か推定する」
- 「推定された項目から一人のプロフィールを組み立てる」
「トークンからプロフィールのどの項目か推定する」問題は、自然言語処理の分野におけるNER(Named Entity Recognition)の問題と思ってもらって構いません。
Wantedly Peopleでは全て自動で推定を行い、結果をユーザーに表示しています。推定するコードはPythonのクラスとして書かれ、学習されたモデルがモデルファイルとしてサーバ上にデプロイされます。サーバでは、このモデルファイルから識別器を復元し、Tornadoサーバから推定結果が返されます。
動き続けるシステムで精度を保証したい
「測れないものは改善できない」という言葉があります。サービスの開発において、私はこれは正しいと考えています。つまり、定量的な尺度に落とすことができないものは、改善サイクルを回しても実際に良くなっているかわからないため、最短距離で改善まで到達することができません。
特に機械学習のように精度が最も意味を持つサービスでは「サーバが動いている上にテストも通っているものの、なぜか結果が安定しない」といったことが起こりえます。
ここで解説するのは、運用時に実際に起こったさまざまな失敗の後に、安定稼働させて改善を進めるために取った手段のまとめです。
「今の精度がわからない」これが機械学習においては一番困ります。過去のデータや学習データに対しての精度を計算することはできますが、クリティカルな部分に関しては、正直データを取り続けるしか方法がないと思っています。
そこで、Wantedly Peopleチームでは以下の取り組みをしています。
- 毎日、サンプリングして精度を測る。
- グラフで可視化する。
愚直な方法ですが、サンプリングされたデータに対して人手によるデータの補正を行っています。また、これが学習データにもなるため、データが貯まると精度が上がる仕組みができます。
また、機械学習のモデルを変更させた場合や、再学習させたモデルをリリースする際などは、テストは通っても精度がわからないといった問題がありました。
リリース前は多少問題が起きても大丈夫だったため、速いスピードで検証できていましたが、リリース後はスピード感が落ちていました。
この問題を解消するべく、Wantedly Peopleチームでは以下の取り組みをしています。
- Github上でプルリクエストが出されると、Kubernetes上でQAサーバ(本番とは違う検証用サーバ)が自動で立ち上がる。
- QAサーバにデプロイし、過去のデータからQA上での精度を測る。
これにより、学習してモデルを変えた後にQAでの精度を測り、もし低下していなければリリースする、といった流れができました。
今後もさまざまな失敗をする可能性がありますが、問題を一つひとつ解決していけば、動き続けるシステムで精度を保証しながら改善を進めることは可能だと考えています。
企業で機械学習を導入すること
ここまで機械学習の活用について紹介してきましたが、以前からWantedlyで機械学習が活用されていたかというと、そうでもありませんでした。
例えば、Wantedlyではユーザーに対して企業の募集が表示され、そのアルゴリズムは「人手による考え抜かれたアルゴリズム」がメインで動いています。全体の人気度や、つながりのある人による応援の数、職種のマッチが考慮されてるため、機械学習によるパーソナライズを行わなくても「いい感じに」動いているのです。
機械学習を動かす上でハードルになる点はいくつかあります。
- 結果に対して保証がしづらい。
- やってみないと実際の数値が上がるかわからない。
- データが必要なため、収集からやっていると時間がかかる。
特に一番上の保証がしづらいという点は、企業で導入する観点から考えると高いハードルでしょう。エンタープライズ用途などでは使いづらいかもしれません。また、人間が考え抜いたアルゴリズムであれば「この場合こうなる」ことが保証され、早く作れる上に結果が勝手に変わることもありません。
では、どのような場合に機械学習の導入が有用なのでしょうか。大きく2つのパターンがあると思います。
- 複雑であるため、人間がアルゴリズムを作るのが難しい。
- ユーザーごとに出す答えが異なり、定量的な評価ができる指標がある。
1つ目のパターンは、例えばロボット掃除機のルンバのアルゴリズムや、ロボットの動作といったものだと思います。くまなく床を掃除するルンバのアルゴリズムを人手で書くのは、もしかしたらできるかもしれませんがちょっと難しそうです。
2つ目のパーソナライズされた情報を提供することは、今の機械学習の分野が得意としている領域です。改善すべき指標がはっきりしていれば、「この数値を上げていけばいい」といった枠組みで機械学習が導入しやすいと思います。
ただ、改善すべき指標は1つではなかったり、他の指標とトレードオフの関係があったりするので、プロダクトの視点からも「納得のいく指標」を作るのは機械学習の導入時、最初にやるべきことで、かつ難しい部分でしょう。
この「納得のいく指標」「プロダクトの目指す姿」「実現可能性」を主張することが、企業での機械学習導入における仕事になるでしょう。
おわりに
人工知能と機械学習で賢く名刺管理をするために、裏で動いている機械学習サービスについて紹介しました。
実際のプロダクト上での精度の保証の問題や、いくつかの失敗を経て、この記事で紹介したこと、つまり今の形になっています。
「どのような考えで各サービスが作られているか」について、文章が残せて良かったと思います。私たちが機械学習を導入した意図や運用方法などが、少しでも参考になればうれしい限りです。
