Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

リクルートライフスタイルにおける深層学習の活用とGCPでの実現方法

2,011 views

Published on

2018年9月19、20日開催『Google Cloud Next in Tokyo ‘18』での発表資料。
https://cloud.withgoogle.com/next18/tokyo

Published in: Engineering
  • Be the first to comment

リクルートライフスタイルにおける深層学習の活用とGCPでの実現方法

  1. 1. D2-2-S02 リクルートライフスタイルにおける 深層学習の活用と GCP での実現方法 堀澤健太 グループマネージャー 株式会社リクルートライフスタイル 2018 年 9 月 20 日
  2. 2. 堀澤健太 @horiken4 株式会社リクルートライフスタイル グループマネージャー 2011 年 大学院卒業後 大手スマホゲーム開発会社に新卒入社 2016 年 現職 マネジメントをしつつデータエンジニア, 機械学習エンジ ニアとして開発業務に従事 Photo Speaker
  3. 3. 堀澤健太 @horiken4 株式会社リクルートライフスタイル グループマネージャー 情報処理学会 ビッグデータ研究グループ 運営委員 https://sites.google.com/view/ipsj-bpd/ Photo Speaker
  4. 4. Agenda ● 弊社について ● CET の紹介 ● 深層学習の活用 ● Wrap-up
  5. 5. 1 弊社について リボンモデル
  6. 6. リクルートのビジネスモデル
  7. 7. リクルートライフスタイルのサービス
  8. 8. 2 CET の紹介 Capture EveryThing
  9. 9. CETとは Capture EveryThing の略 様々なログを収集するための基盤の開発チームとして立ち上げ 弊社の様々なサービスで利用されているデータプロダクト
  10. 10. CET チームのミッション 直接的な収益インパクトと, Insight や技術資産 など間接的な価値を創出する Process Outcome
  11. 11. データプロダクト×リーン データプロダクトのライフサイクルを想定し専門チームが推進 リーンアプローチ, リーンアナリティクス クラウド活用を前提とした開発基盤とプロセス整備
  12. 12. ミッションを推進する CET 基盤システム CET API ML バッチ処理基盤 ストリームデータ処理基盤
  13. 13. CET API リクエストパスに応じて Bigtable の行を返す API データローダで TSV の内容を Bigtable へ書き込み 他グループにも開放 非エンジニアでも簡単に API を作成できる
  14. 14. CET API User GET request TSV ML Batch, Data scientist, Engineer, etc TSV upload Web server
  15. 15. ML バッチ処理基盤 GitHub Flowと Drone による CI/CD デプロイフローの属人化、コードの属人化を排除 非エンジニアでも品質を保ちながら本番反映可能
  16. 16. ML バッチ処理基盤 Deploy DAG Launch Training data Push DAG, Batch source Prediction result Developer Zipped source Web hook Docker image
  17. 17. ストリームデータ処理基盤 弊社サービスの Web サーバログを収集 じゃらん net ホットペッパーグルメ ホットペッパービューティー など LTV 予測, UU 集計, 推薦などに利用
  18. 18. ストリームデータ処理基盤 Access log Web server
  19. 19. 3 深層学習の活用
  20. 20. 深層学習の活用事例 宿レコメンデーション リアルタイム宿レコメンデーション 宿泊プランレコメンデーション
  21. 21. 宿レコメンデーション
  22. 22. 目的 検索画面に戻り再検索しなければならず離脱が増加 宿の詳細ページにおすすめの宿を表出 迷っているユーザが簡単に最適な宿を探せるように
  23. 23. Recommendation
  24. 24. アーキテクチャ PV log Feature vector Training data Feature vector K nearest neighbors (recommendation) GET https://api.example/yad_recom/yad_id PV User
  25. 25. Collaborative Denoising Auto-Encoders [1] 宿の特徴抽出に利用 DAE にユーザベクトルを追加した レコメンデーションモデル 入力はアイテムに対するユーザの 好みを表現する疎行列 ( Preference ) 0 :好まない, 1 :好む
  26. 26. CDAE の学習 重み行列全体ではなく特定の 行を更新 更新する行は Preference で決定 Optimizer.minimize() では実現不可
  27. 27. 重み行列の部分行列の更新方法 Item Index Preference Fixed Row Index Updated Row Index tf.gather tf.dynamic_stitch Loss tf.gradients tf.scatter_update W updated W
  28. 28. 重み行列の部分行列の更新方法 preference = … w = tf.get_variable(...) ... i_updated, i_fixed = build_item_indices(prefernece, ...) w_updated = tf.gather(w, i_updated) w_fixed = tf.gather(w, i_fixed) w = tf.dynamic_stitch([i_updated, i_fixed], [w_updated, w_fixed]) … ... loss = build_loss(w) grad = tf.gradients(loss, w_updated) w_updated = build_update(w_updated, grad) train_op = tf.scatter_update(w, i_updated, w_updated) … with tf.Session() as sess: while …: sess.run(train_op, ...)
  29. 29. 推薦の方法 CDAE により宿ごとの特徴ベクトルを計算 BigQuery で最近傍探索 ある宿に対する類似宿リスト作成 類似宿リストを Bigtable へ書き込みサービング リクエストされた宿に対する類似宿リストを返す
  30. 30. 学習データの準備 BigQuery から宿ページの閲覧ログを抽出 ユーザを素性とみなし宿×ユーザ疎行列 ( Preference ) を作成 PV 数上位ユーザを素性とみなす あるユーザに閲覧されたら 1, 閲覧されてなければ 0 Implicit feedback
  31. 31. 学習と特徴抽出 ML Engine で CDAE を学習 学習完了後, 同じジョブで全 Preference に対する中間層出力を計算 特徴ベクトルが得られる 特徴ベクトルを GCS へ保存
  32. 32. BigQuery による最近傍探索 特徴ベクトルを GCS から BigQuery へインポート 距離計算用の UDF を定義, CROSS JOIN により全宿間の距離計算 全宿に関して距離の昇順で宿をソート, 上位数件を類似宿とする
  33. 33. BigQuery による最近傍探索 CREATE TEMPORARY FUNCTION calc_distance(x ARRAY<FLOAT64>, y ARRAY<FLOAT64>) RETURNS FLOAT64 LANGUAGE js AS """ // Calculate distance // e.g. Euclidean, Cosine, Hamming distance = … return distance; """; … WITH all_dist AS ( SELECT a.item_id AS a_id, b.item_id AS b_id, calc_distance(a.vector, b.vector) AS dist FROM feature AS a CROSS JOIN feature AS b), ranking AS (# Assign rank to item using window), knns AS (# Extract and aggregate kNNs), ...
  34. 34. CDAE による推薦モデルの強さ ドメインエキスパートの作成したモデルと CDAE で AB テスト ドメインエキスパートのモデルとほぼ同等の効果が得られた CVR を大きく改善 必要なデータはページの閲覧ログだけ BigQuery のクエリが書ければ誰でも, どのサービスでも利用可能
  35. 35. リアルタイム 宿レコメンデーション
  36. 36. 目的 ディスプレイ広告から特定宿の詳細ページへ流入 好みではないので直帰, また流入, 直帰, …を繰り返す 流入したときに最適な宿を推薦して CVR を向上させたい 在庫の存在する宿だけ推薦
  37. 37. アーキテクチャ PV log Training data Feature vector Training data Feature vector K nearest neighbors GET https://api.example/rt_yad_recom/user_id PV User K nearest neighbors Recommendation Stock Stock PV log
  38. 38. 効率的なレコメンデーション CDAE の通常の推薦方法だとネットワークの順伝播が必要 パイプラインが詰まる可能性が高まる 宿特徴ベクトルを利用したアイテムベースレコメンド 推薦に必要なのは類似宿 LUT のみ 事前に BigQuery で最近傍探索して求める
  39. 39. パイプライン GCS から類似宿リストを 副入力として読込 セッションウィンドウで 直近 n 件の閲覧宿を保持 類似宿をルックアップ 在庫が存在する宿でフィルタ
  40. 40. 推薦処理 PCollection <KV<String, Iterable<Log>>> X, Y, Z X A, U 0.4, 0.1 Y W, P 0.5, 0.2 Z T 0.3 PCollectionView<LUT> ParDo Lookup X, Y, Z A, U, W, P, T Sort by distance ASC U, P, T, A, W
  41. 41. 宿泊プラン レコメンデーション
  42. 42. 目的 リスティング広告流入したユーザにユーザが流入した宿の 宿泊プランを推薦 直帰率低下, CVR 向上
  43. 43. アーキテクチャ Exported model GET https://recom.example/user_id/yad_id PV log Plan feature extraction User feature extraction Deploy
  44. 44. CV 予測モデル 全結合の NN CV するか否かの 2 値分類 入力はユーザ特徴, プラン特徴ベクトル CDAE の中間層出力 User feature Plan feature CV ReLU Dropout L2 regularization Softmax
  45. 45. 推薦モデル CV 確率降順にプラン ID をソート 入力はユーザ ID と宿 ID GET リクエストパスで受け取る ユーザ ID と宿 ID を特徴ベクトルへ マッピング User ID Plan IDs CV model Plan IDs User feature Plan feature Yad ID
  46. 46. ユーザと宿泊プランの特徴抽出 ユーザ×宿, 宿泊プラン × ユーザの Preference 行列から CDAE を学習 中間層出力を特徴とする 中間層は 128 個 ユーザ, 宿泊プランごとに 128 次元の特徴が得られる PV の多いユーザに限定 少ない学習時間で効果の高い推薦をするため
  47. 47. CV 予測モデルの学習データ 対象のユーザと宿泊プランの PV, CV イベントを抽出 ラベルは PV だけなら 0, CV したら 1 ユーザと宿泊プランの特徴ベクトルと PV, CV ログを JOIN
  48. 48. 推薦モデルの利点 1 コールドスタート問題の解決 アイテムベースだと宿泊プランページを閲覧したユーザにしか 推薦できない 宿ページを閲覧しただけのユーザにも推薦可能 宿閲覧ログを利用し CDAE でユーザ特徴を抽出
  49. 49. 推薦モデルの利点 2 特徴ベクトルが自由に選択できる 例)フォトギャラリーの写真の推薦 Convolutional DAE で画像特徴ベクトルを抽出 ユーザ特徴, 画像特徴ベクトルを CV 予測モデルの入力とする コールドスタート問題も解決 フォトギャラリーを閲覧しなくても好みの写真を推薦可能
  50. 50. 推薦モデルの擬似コード u_id = tf.place_holder(tf.string, (None, )) # From request prameter y_id = tf.place_holder(tf.string, (None, )) # From request prameter ... pid_str = p_lut.lookup(yid) # Lookup plan IDs pid = tf.string_split(pid_str, delimiter=‘-’) pf = pf_lut.lookup(pid) # Lookup plan features uf = uf_lut.lookup(uid) # Lookup user features ... score = build_cv_prediction(uf, pf) … top_k_score, top_k_index = tf.nn.top_k(score, k=tf.minimum(10, tf.shape(score)[0])) ...
  51. 51. モデルを小さくする工夫 TensorFlow モデルは外部データストアを利用できない 宿, 宿泊プランの特徴ベクトルはメモリに保持 使用メモリを小さくしたい 中間層の出力をしきい値処理し binary vector にする [2] 活性化関数は Sigmoid なので, 0.5をしきい値にして二値化 特徴ベクトルを 1/32 に圧縮
  52. 52. Serving TensorFlow Serving を GKE にデプロイ モデル更新はモデルパスを変更して kubectl apply containers: - name: tf-serving image: tf-serving:v1.0.0 env: - name: MODEL_NAME value: ${model_name:?} - name: MODEL_PATH value: ${model_path:?} CMD ["/bin/bash", "-c", "gsutil cp -r ${MODEL_PATH}/* /model && tensorflow_model_server --rest_api_port=8501 --model_name=${MODEL_NAME} --model_base_path=/model"] Dockerfile deployment.yml
  53. 53. Serving nginx をリバースプロキシとして配置 GET でリクエストを受けれるように location ~ "^/(?<model_name>([-a-zA-Z0-9]+))/(?<user_id>([a-zA-Z0-9]+))/(?<yad_id>([0-9]+))$" { proxy_method POST; proxy_set_header Content-Type 'application/json'; proxy_set_body '{"instances": [{"user_id": "$user_id", "yad_id":"$yad_id"}]}'; proxy_pass 'http://127.0.0.1:8501/v1/models/$model_name:predict'; }
  54. 54. なぜリクエスト時に推薦処理を行うのか CET API は利用できない 組合せが膨大で事前に推薦しておくことが難しいため 全ユーザ × 全宿 = 約 3 TB を Bigtable へ書き込む必要がある Bigtable の Tablet 最適化で CET API のパフォーマンスが劣化
  55. 55. なぜリクエスト時に推薦処理を行うのか 宿と宿泊プランの対応関係を利用し効率的に CV 確率を予測可能 宿に紐づく宿泊プランに絞って CV 確率を予測 宿に含まれる推薦対象の宿泊プランは数十個程度 小さい順伝播ですむ
  56. 56. 4 Wrap-up
  57. 57. まとめ CET チームと GCP を活用した基盤システム データとエンジニアリングで利益創出 深層学習と GCP を活用した利益貢献施策 GCP で本来の作業に集中できる GCP で深層学習を活用するためのノウハウ
  58. 58. 参考文献 [1] “Collaborative Denoising Auto-Encoders for Top-N Recommender Systems” http://alicezheng.org/papers/wsdm16-cdae.pdf [2] “Deep Learning of Binary Hash Codes for Fast Image Retrieval” https://www.iis.sinica.edu.tw/~kevinlin311.tw/cvprw15.pdf
  59. 59. Thank you.

×