機械学習で解く問題の考え方、解き方を私なりにまとめる

みなさんは、樹海で迷ったことはあるだろうか?山梨や長野、どこでもいいが、山脈で一面が木の中、どこに行ったら出られるかわからないあの樹海である。

私には経験はないが、樹海に迷った友人を捜索したことはある。幸いにも、迷った友人を路上で見つけることができ、誰も遭難することはなかったのだが、その時、友人が言っていたことが忘れられない。

樹海の中ってさ、「あっちが正解かな?」と思って進んでも、全然景色が変わらないわけ。遠くの山は見えてるのに、全然近くならない。不安になって戻ると、自分はどこから来たのか、どこに向かっていたのか、自分の居場所と方向がわからなくなる。そしてパニックになるんだよ。

大学時代の友人が、山梨の森に遭難した時に言ったセリフ

研究開発の色が濃い、機械学習のプロジェクトも同じような毛色があると、私は考えている。適当に進むと、パニックになって終わる。そんな辛いことが起きないように備忘録を残す。

機械学習の問題設定は、実はとてもシンプル

機械学習を用いたプロダクトを開発する時、考えることはシンプルである。

ある問題Pを解くのに必要な情報Dが存在する時、問題Pの解き方Sを答えよ

という問題を考えれば良いだけだからだ。ある問題が解けるとして、その問題の解き方を(自分で探して)答えればよい、という問題を考えるのだ。

例えば、「Amazon に掲載されている、ペット用品の売上を10%伸ばすために、〇〇という推薦システムを用いる。これにより、CVRを X% 改善することができ、売上単価は Y円であるため、売上は Z円分(売上の10%改善)上昇すると見込まれる」と言った具合である。

ECの例はとてもわかりやすい。お金に換算するのは便利な方法である。問題の設定は、実はなんでもいいのだが。

問題を分解して考えると見通しが良くなる

問題に設定に立ち戻ると、この問いは2つのパートに分解できる

①ある問題Pを解くのに必要な情報Dが存在する時
②問題Pの解き方Sを答えよ

大体の機械学習の問題で、既知な条件はPのみである。時折、過去の実験や先行研究などで、Dが半分既知な場合もあるが、大抵の場合はDも未知である。Sは、そもそも未知でないと解く意味がない。

  • 未知: D, S

  • 既知: P

しかし、Pを解くためには、SもDも必要なのである。未知であるDを前提に、Sを検討し、達成すべきPを実現しないといけない。それゆえ機械学習の開発は難しいと言われる。

通常のシステム開発と同じ問題設定ではないのか?

ここでは、機械学習システムの開発と、その他のシステムの開発を明確に区別して考えることにする。広義の意味では一緒であると理解した上でだ。

一般のシステム開発の場合、未知になるのは Sのみである。システムを構築する上で必要なドメイン知識や、仕様、データベース設計などは事前に協議され、確定されている。要するに、Dが既知になるのである。PとDが既知な状態で、Sを検討すれば良いだけだから、考えることが少なくて済むのである。(だから、問題を解くのが簡単という意味ではない)

  • 未知: S 

  • 既知: D, P

Dを使って、 Pを達成するSを検討すれば良いだけであるから、山登りで言うと、麓の登山口から山頂までのルートを決定するプロセスと同じである。出発地点とゴール地点が明確であり、もちろん、さまざまな山の登り方はあるが、一緒に登るチームや気候、山の特性などによって、ルートを適宜検討して、決定すれば良いだけである。

機械学習システムではどうなるのか?

逆に、Dが未知のままである機械学習システムを山登りで例えると、樹海の中から山頂までのルートを決定するプロセスとなる。これが、冒頭私があげた例の意味である。

自分の現在地がわからないため、目的の山頂に向かって行こうとしても、ルートが十分に決定できず、コンパスや周囲の景色などを参考にボトムアップに決定せざるを得ない。また、下手なルートに迷い混んだら、元の場所に戻らないといけなくなるため、適度なマーキング(要するに、メモや実験ログを残す)ことが必要となるのだ。

これが、機械学習システムの難しさのコアになる。未知のDを前提に、未知のSを探索して、Pを解こうと動くから、手探りな状態が続き、疲弊してしまう、という構造なのである。

では、どうするのがよいのか?

冒頭、なぜ問題を二つに分解したかというと、二つの問題を交互に解くためである。連立方程式を解くのだ。

PとSの関係を考え、Pを実現するSを徹底的に探索する

まず最初に、②のSとPの関係を考える。Dは、十分な情報が存在すると仮定し、一旦固定して考える。機械学習の問題の場合は、必要なデータ数や種類が揃っており、ドメイン知識も(今得られる)十分なものがあると考えて進める。ここでウダウダ行っても前に進まない。

Pを解くSを考える過程は、数学の問題を解いているのに近い。やることは、PとSの関係性をドメイン知識やデータなどからモデリングするのだ。とりうる打ち手が少ない場合は、打ち手を増やせるようにさまざまな情報ソースを調べたり、有識者にヒアリングしたりを繰り返せば良い。考えるべきは、打ち手を増やす→打ち手の精度を上げる、それだけの話である。

選択する打ち手を決定し、打ち手によって実現される結果を予測し、実際の値との乖離を見る。これも機械学習の根本的な考え方と一緒である。ロス値を見るのと等しい。列挙した打ち手をある程度、実験し結果を取得したら評価に入る。

PとSの関係を評価する

ある程度Sを検討したら、とりうる打ち手Sで、Pが解けるかを検討しないといけない。放置していたDを検討すべきかを判断するためだ。

基本的には以下のことを検討すれば良い。Pを継続して探索するとなったら、前述の通り、ひたすら実験を繰り返せば良い。

  • 打ち手Sをまだまだ列挙できるか?

    • 打ち手の残数の確認。打ち手が少ないのに探索を継続しても徒労する

  • 打ち手Sで期待した結果と、実際の結果の乖離は大きいか

    • 予測との乖離度合い、あまりに大きいと筋が悪い可能性がある

  • 明らかに、Dを検討しないといけない事実があるか

    • たとえば、既知ではないが、暗黙的に決まっていそうなルールの存在が発覚した、とか。

PとDの関係を考え、Pを解くのに必要なDを検討する

このステップでは、問題を解くのに十分な情報がない、と判断したことを前提に、「どうしたら問題を解くのに十分な情報が揃うか」を検討する。

やることはこれもシンプルで、問題を解くのに不足していると考えられる要素を洗い出し、一つ一つ潰していくだけなのである。もちろん、当事者たちが気づいていない情報もあるかもしれないが、そんなものを考えていたら選択肢の可能性が広がりすぎて埒が明かない。

不足していると考えられる要素は主に二つである。それ以外もあるが、代表的なものは二つと考えていいと、私は考えている。(予算等、金銭問題は考慮に入れていない)

  • データの種類や鮮度、量、正確性が不足している

    • データベースの情報を綺麗にする対応を実施したり、アノテーションしてデータを増やしたり、すればよい。

  • 問題を解くのに必要なドメイン知識が不足している

    • ユーザーインタビューを行ったり、ドメインエキスパートに情報をもらったり、統計学や機械学習領域の専門家の知見をもらう

どちら、もしくはどちらも不足している場合、それぞれに対して対応を実施し、情報Dの獲得に努める。これも対処を決めたら、愚直に実施するのみである。

再度、PとSの関係に戻る

ある程度、Dが獲得できたら、PとSの関係を再度考える。新しく得た情報で、新たな打ち手が検討できるかもしれないし、既存の打ち手の質を上げることもできるかもしれない。

やることは、PとSの関係を考察し、考えられる打ち手を効率的に実施するだけだ。あらかじめ打ち手に対して設定した期待値と同じくらい、もしくは超えてくる打ち手は脈があると考えて、追加探索しても良いし、先に全ての打ち手を試して、後から追加探索しても良い。要するに、幅優先探索と、深さ優先探索のどちらも間違っていないのだ。趣味に合う方を使うと良いだろう。お金が許せば、幅優先探索を並列に一気に実行して、結果をベースに深さ優先探索を行うのが効率的と私は考えている。(枝切りはもちろんするが…)

そして、また打ち手の評価に戻るのだ。Dが不足していれば、前述のプロセスに戻ればいいし、打ち手の追加探索が必要ならもっと深く打ち手を掘っていっても良い。そこの塩梅は、問題とモデルの性能を見ながらよしなに決める。(ここで経験がものをいう)

おわりに

とまあ、機械学習の問題設定と解き方をさまざま、つらつらと書いてきたわけだが、考えてみればシンプルで、わかりやすいのである。考えることが多いというだけで、何か難しいことをしているわけではない。エッセンスをまとめる

  1. 問題を分割して、交互に解く

  2. 解く順番は、 PとS → PとD→PとS … と続く

  3. PとSの関係では、検討している打ち手でPが解けるかを評価する

  4. PとDの関係では、Pを解くのにどんな情報Dが不足しているかを検討する

もちろん、「打ち手を検討する」と言っても、前提知識として統計学や数学、英語、プログラミング言語などなど、必要なものがたくさんあるのは事実だ。しかし、さまざまな打ち手を検討して、効率的かつクールに問題を解いていくのが機械学習の面白いところでもあると思う。

もし自分がプロジェクトを進めていく上で、自分の居場所や方向がわからなくなることがあれば、ぜひ参考にしてもらえると嬉しい。

読了ありがとうございます。よければいいねも!