Slide 1

Slide 1 text

lambdaの連鎖で作る Recommend Engine

Slide 2

Slide 2 text

Masahiro Higuchi / 樋口雅拓 ● グリーグループのリミア株式会社で、LIMIA という住まい領域のメディアを 作っています。ゲーム会社ですが、最近はメディアに力を入れています。 ● 機械学習のエンジニアですが、iOS, Android,JSなどもやっている何でも屋 です。4歳の娘のパパ。twitter: @mahiguch1 ● https://limia.jp/ ● https://arine.jp/ ● https://aumo.jp/ ● https://www.mine-3m.com/mine/

Slide 3

Slide 3 text

LIMIAとは? ● メディアサービス ● 記事一覧を表示し、タップすると記事 詳細を閲覧できる。 ● AWS:90%、GCP:10%。 ● PHP/EC2 → Go/ECS移行中 ユーザに最適なコンテンツを推薦する事 で、回遊性を向上させたい! → Recommend Engine(推薦システム)を 作ろう。

Slide 4

Slide 4 text

どうやってRecommendするのか ● ユーザを10個ぐらいのセグメントに分類 ● セグメント毎にCTRを計算 ● 記事の投稿日時で補正したCTRが高い順にリストに掲載 → せっかく今から作るんだから、インスタンスを立てずに行こう!

Slide 5

Slide 5 text

ユーザモデル作成 ユーザが記事を閲覧すると、その情報が Kinesis に流れます。Lambdaで受け取り、直近10件の閲 覧履歴をDynamoDBに保存します。その変更を DynamoDB Streamに流し、Lambdaで受け取っ て記事のベクトルの平均をユーザベクトルとして DynamoDBに書き込みます。

Slide 6

Slide 6 text

ユーザ分類 ユーザの閲覧履歴は、 Kinesis経由でS3にも保 存されます。EMRでそれを読み込み、 k-means++で10セグメントに分割し、分割結果を BigQueryに書き込みます。BigQueryでセグメン ト毎の直近2時間のCTRを計算し、S3に書き戻し ます。それをDynamoDBに書きます。EMRでの 計算で出来るセグメントの中心ベクトルとアイデ アのベクトルも同様に Dynamoに書き出します。 アイデアベクトル生成は 1日1回だと遅いので、 改善したい。

Slide 7

Slide 7 text

配信 ユーザが記事一覧を表示しようとすると、 Recommend Engineに問い合わせます。 Recommend Engineはユーザの直近10件の記事閲 覧履歴から所属するセグメントを選び、そのセグメント のユーザの直近2時間のCTRが高いものを表示しま す。ただし、古い記事ほど減点し、ユーザの前回ログ イン以降に投稿された記事は加点します。 Recommend Engineはgolangで書いて、 ECS/Fargateで動かしています。

Slide 8

Slide 8 text

システム構成図 パラメータ一覧 ● ユーザベクトル生成は、即時。 ● アイデアベクトル生成は、毎日。 ● 辞書は2年前のwikipediaベース。 ● CTRの計算は直近2時間。 ● 推薦対象は、全記事。 ● セグメントは10個。 これらについて、A/Bテストを行い、最適値を 探す。1Round 1週間として、6月末までに5回 行う。

Slide 9

Slide 9 text

まとめ ● Recommend Engineは簡単に作れる。 ● 今の所は既存編成ロジックより良い結果が出ている。 ● システム的にはアイデアベクトル生成をリアルタイムで行いたい。しかし、 S3にある5GBの辞書 を読み込む必要があるため、 Lambdaで実行時に読み込むとコスト的にやばい。何か良いアイ デアがあれば教えて欲しい。 ありがとうございました。懇親会でぜひ声をかけてください!