Blogは株式会社Gunosyのエンジニアが知見を共有する技術ブログです。@mathetakeです。いつもはデータ分析ブログにいるのでテックブログは初めてです。Twitterとかやったことないですね。最近は仕事でニュースパスというプロダクトの記事配信ロジックの改善を行っており、その一環としてパーソナライズロジックの開発プロジェクトに従事しています。パーソナライズとはユーザーひとりひとりに対して別々の記事配信を行う事です。下記の記事でパーソナライズプロジェクト発足に至るまでの背景が語られているので、興味のある方はぜひご覧ください。記事スコア*1計算モデルの概要パーソナライズされた記事リストを返すAPIサーバーの処理について書きます。ある記事配信ロジックの改善のサイクルが回しづらいカジュアルにロジックのABテストが行えない複雑に入り組んだコードになっているため新しいメンバーのキャッチアップが大変こんな感じです。既存の記事生成の仕組みを使わずゼロから作り直すを設定しました。アーキテクチャまずパーソナライズシステム全体のアーキテクチャについて簡単に説明します。大人の事情により勝手にマル秘と表示されている箇所があります。lambdaこんな感じです。lambdaについては後日別記事で解説します。EMRクラスタを用いてマル秘機械学習を行っている部分はScalaパーソナライズド記事リスト返す記事APIはgolangその他タスクは基本的にpythonと言った感じです。介し、ABテストのために複数存在する記事APIのうち、どのエンドポイントを叩くかを制御しています。これにより無駄なifを書くことなく、つまりソースコードを汚すことなくABテストを行うことが可能となっています。以降の§では、記事APIがどのような計算モデルによって記事をスコアリングし、リストを生成するかについて述べていきます。スコア計算モデルという言葉の定義をはっきりさせておきます。スコアとは記事を出すべきかを表す数値のことです。候補となる記事全てに対してスコアを計算し、それを元にソートしてからユーザーに表示するというのが基本的なアルゴリズムになります。引数にしてスコアを算出する時間によって変化する関数のことです。構築する事ですが、その制約条件としてリアルタイムに数千からなる候補記事全てに対するスコア計算を行うがあります。そこで今回ver.1として、少しふわっとしてますが記事APIが行う計算部分は行列演算のみで済む線形モデル線形モデルの各項に非線形な効果が入るように非同期なタスクを裏側で走らせておくこのようなスコア計算モデルを設計しました。これにより、記事APIが行う処理は行列演算のみなので現実的な時間内にレスポンスすることが可能になり、かつ非線形な効果も入るのでそこそこ良いモデルになっています。記事APIは、ユーザーがリクエストしたタイミングのそのユーザーのファインマンベクトルと、2.で生成されたn個のマル秘ベクトルとの距離(みたいなもの)を計算と言った感じです。次に線形モデルに入力される記事の特徴量についてです。)で測る事が出来ます。生成することができます。このモデルは全てベクトルの内積と和の操作で完結するため、非常に高速に計算することが出来ます。function)と呼ばれるユーザーからのリクエスト時間とニュース記事の情報を引数とした関数で、「基本的には時間が経つほど値が小さくなる関数」となっています。最終的なスコアにどの程度寄与させるかの重みです。このハイパーパラメータを上手く調整することで全く気色の異なった記事リストをレスポンスしたりすることが出来ます。各種教師あり学習アルゴリズムを用いて最適化することも出来ますが、問題設定上限られた目的関数しか設定できないため最善とは言えません。Optimizationによるハイパーパラメータ最適化システムのハイパーパラメータを柔軟なKPIに関して最適化したい場合どうすれば良いのでしょうか。ユーザーの滞在時間に関して最適化したい場合、パラメータと滞在時間の関係が明示的に与えることが不可能なため勾配法などを使って最適化することができません。このように入力と出力の関係が不明なまま最適化を行う問題をBlackBox関数の最適化問題と呼びます。出力が確率的に揺らぐ場合の2つに分類することができます。確率的に揺らがないとは、入力に関して出力が一意的に決まるという意味です。Optimizationと呼ばれる分野で今なお盛んに研究されています。Optimizationに属する問題設定でした。記事APIの実装とハイパーパラメータの分離を行うことでSimulationOptimizationのとあるアルゴリズムとその結果をスムーズに反映することが可能となりました。最後になりますが、ちょっとしたコード付きで記事APIの処理フローについてざっくり解説します。候補記事をスコアでソートし、上位数件をレスポンスするといった処理フローになっています。Score2)最後にタイムディケイを掛けてスケーリングする部分は省略しましたが、このように全て行列演算のみでスコアリングを行えるように設計されています。おわりにこの記事では、ニュースパスで実装されているパーソナライズシステムとその内部についてさらっと紹介しました。大人の事情でところどころでマル秘とぼかしたり、ふわっと言葉を濁したりしました。詳細が少しでも気になるという方、高速なAPIと機械学習アルゴリズムを設計実装する機械学習エンジニア並びにそれを支えるサーバーサイドエンジニアを絶賛募集中です!ご応募ください!hrmos.cohrmos.co*1:記事とユーザーを与えた時、ユーザーに表示すべきかどうかを表す数値*2:知識共有を目的とした社内勉強会です。2019、22日目の記事です。Chromeでのコンテンツ画像生成こんにちは、グノシー開発部の山本です。今回は、CloudFrontの...2019-12-05【再入門】UICollectionViewとUITableViewのセルを選択したときに見た目を変え...こんにちは。iOSアプリを開発している吉岡(rikusouda)です。こ...2019-06-14WWDC19に参加してきましたこんにちは。(@rikusouda)です。【グノスポ連載第三回】こんにちは、グノシー事業部でデザインを担当している森です。Blogは株式会社Gunosyのエンジニアが知見を共有する技術ブログです。Blogはたらくを知り、Gunosyを知る。ブロックチェーンブログはてなブログをはじめよう!gunosy_dataさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。