2019-10-07

データ分析系3daysインターンシッププログラムで伝えたかったこと

担当した3daysインターンシッププログラムが無事に終ったので、自分が何を考えていたかをまとめます。いわゆる「機械学習エンジニア」向けのインターンです。

https://voyagegroup.com/internship/adventure/

背景

期間3日でやりたいと打診を受けた時に真っ先に思いついたのはコンペ形式のプログラムでした。しかしKaggleを筆頭に実際のビジネスで発生したデータを使ったEDAおよび機械学習予測モデルの開発ができる機会は今やいくらでもあるため、Kaggleそのままの形式では目新しさに欠ける。さらに実際の開発業務では求めた予測値を使って意思決定を自動化する所までが求められるため、予測器を作って精度を見て終りというのは片手落ちとなってしまう。よって、求めた予測値を利用して意思決定を行なうアプリケーションを実装してビジネス指標が出力として得られる部分までを範囲としました。

内容

ハンズオンチュートリアル形式でアドネットワークの広告配信ロジックの開発およびデータ分析を行ないました。配信ロジックは「広告リクエストに対してどの広告を返すか」と「広告のクリック単価をいくらにするか」を広告リクエストを受けた時に決める処理です。

開発は運営が用意したPython環境で起動しているJupyter Notebook上で行ない、これは参加者それぞれ専用のサーバーで動作しています。用意したPython環境にはアドネットワークシミュレーターがインストールされており、参加者は実装した配信ロジックを即座に実行して結果を確認する事ができます。結果には広告キャンペーン毎の獲得コンバージョン数やメディア毎の収益額が含まれており、任意の加工を行ない可視化する事で動作確認が可能です。

個々のトピックとして次の物を取り上げました
  • 両面市場(Two Sided Market)における値付け
  • 多腕バンディット方策による累積報酬最大化
  • 広告配信ログの分析
  • 機械学習によるCVR予測
  • 推論処理のアプリケーション組み込み
  • フィードバック制御によるリカバリ
収益予測と広告選択ロジックが実装する範囲

出題の意図

講義ノートの所々に仕込んだ練習問題や、全体の流れの意図のネタばらしです。

顧客の問題を解決しよう

アドネットワークというビジネスには広告主とパブリッシャーという2つの顧客グループが存在し、それぞれが何を求めているかという点から配信ロジックに求められる要件を解説しました。この考え方が出来ると「予測できて何が嬉しいのか、ビジネスにどんな貢献をするのか」という視点に常に立ち戻れます。機械学習が好きな人は「予測ができる事」に目が行きがちですが、時間をかけていらない物を作ってしまうリスクを減らす為にも重要な考え方だと感じています。

検証方法を考えよう

実装したロジックが意図通りに動いているか、どの様に確認すべきでしょうか? 実務では自分で考える他ないので同様に体験してもらいました。特に確率的なふるまいをするロジックのリリース後の動作確認は難しく、どのデータを取りどの様な可視化を行なうと自信を持ってバグが無いと言いきれるのか、頭を悩ます点でもあります。

予測誤差を意識しよう

広告キャンペーン毎のコンバージョン率を誤差範囲と共にプロットする課題を用意しました。それぞれサンプルサイズが異なる事から誤差範囲もバラバラ、よって平均値の比較だけでは何も言えません。意思決定には予測誤差を考慮する必要がある点は多腕バンディット方策の活用と探索の話に繋がります。また確率pがゼロに近いため二項分布の正規近似で上手くいかない点もミソです。

予測が外れる事を前提として自動リカバリ手段を用意しよう

予測精度100%というのはまずありえないので、予測を誤った時にどうするかが重要となります。自動リカバリの手法としてフィードバック制御を紹介して、みなさんに実装してもらいました。

コールドスタート問題をなんとかしよう

コンバージョン率予測モデルで新規の広告キャンペーンに対しては未学習となっている状態を見せました。コールドスタート方策の一つとしてパラメータのThompson Sampling (ロジスティック回帰ならベイジアンロジスティック回帰) があり、これはパラメータ推定値の誤差の大きさを行動に反映できます。

単一の指標で評価しない

Kaggleの様に何らかの評価指標に絞ってロジックの性能を評価するのはやめました。プラットフォームを運営するのであれば買い手を優遇したい時期、売り手を優遇したい時期、またプラットフォーマーの粗利額を優先したい時期どれもあります。プラットフォーマーの短期的な利益を削ってプラットフォームの成長を促したり、売り手間の公平性を考慮したりと様々な実装が出て来た方が面白いと考えました。

高速に動作するプログラムを書こう

広告配信ロジックにおける処理は広告リクエスト に対して配信可能な広告 a A それぞれについてのクリック率 P(click = 1 | X, a)・コンバージョン率 P(cv = 1 | X, a, click=1)を求める必要があります。ここからアドサーバーにおける推論速度の要件を解説しました。10ミリ秒以内に100回の前処理と推論をしたいという事も普通にあるので、遅いコードはそもそもリリースできません。
しかしこれは説明するまでもなく、遅いコードを書くとシミュレーターの動作がどんどん遅くなっていくため気づけたかと思います。事前に配信候補の数を絞る方策も有効ですが3日間という期間を考慮して省きました。

まとめ

インターンシッププログラムの内容を考えて講義資料を作り、専用システムを開発するのは初めてだったのですが学ぶ所が多くありました。また実務のエッセンスをどう伝えるかはまだまだ改良の余地があるので、次回があれば良くしていきます。

このエントリーをはてなブックマークに追加