皆さん、TechFeed 開発チームの白石です。
先日のリリースで、タイムラインアルゴリズムの調整や、コメントのシェア機能などを実装しました。今日はクリスマスイブということもありますし、 今回のリリースノートではタイムラインアルゴリズムについて詳しくご説明してみたい と思います。
ちなみに、この記事はTechFeedに日々集まる大量データをどう扱うか…ということを主眼にした記事ですが、TechFeedでは現在、データサイエンティストを募集しています。
また、本記事のアルゴリズムは現在すべてTypeScriptで書かれています。TechFeedは、フロントエンドからバックエンドまですべてTypeScriptでできてます。フロントエンドのスキルがあれば、TechFeedのすべてをコーディングできます。ということで、JavaScript / TypeScriptのエンジニアも募集中です!
タイムラインとは
この記事で解説するタイムラインというのは、TechFeedの「ホーム」画面のニュース一覧のことです。
TechFeedは、現時点でも180もの専門チャンネルがあり、ユーザーの皆様はそれらをフォローすることができますが、個々のチャンネルを巡回するのも面倒ですし、モバイルだとその問題は更に顕著です。
そのため、 フォローしているチャンネルの情報をまとめた画面 を表示する必要がありますが、それをこの記事では「タイムライン」と呼んでいます。
ただ、「チャンネルのニュースをまとめる」と一言で言っても、非常に難しい。大量のニュースが日々発生するチャンネルもあれば(web技術など)、MySQLのように成熟していて、それほどニュースは多くない(が、たまに大きなニュースがある)ようなチャンネルもあります。
また、人気の技術については発生する情報の量も多いものの、初心者のために書かれた記事なども多く、人によっては不要な情報も多くなります。
こうした 「情報の量と質」のバランスを取りながら、いかに読みたい情報を一覧で表示していくか …が、タイムラインに課せられた大きな課題です(そして、今まだ解決の途上です)。
タイムラインに求められる4要件
TechFeedのタイムラインに求められる要件はたくさんあり、それらのバランスを取りながらの調整が非常に難しい分野です。タイムラインに求められる要件は、現在判明している中で4つあります。
- 時系列の尊重。 どれだけ優れた情報であっても、古い情報が表示されることを、ユーザーの皆様は望んでいない。
- ノイズレス。 ノイズが少なければ少ないほうが良い。 ただし、どんな情報がノイズであるかは人によって大きく異なる
- パーソナライズ。 「どんな情報がノイズであるかは人によって大きく異なる」という事実を元にすると、結局、強くパーソナライズしていく必要があります。
- チューニングのしやすさ。 データに基づき、アルゴリズムを細かく見直し&チューニングしていけるような作りにする必要があります。
こうした要件がある、ということも、リリースして運用し、自分たちで使ったりユーザーの皆様からのフィードバックを頂いたりしながら、ようやく掴めてきたという感じです。
試行錯誤の歴史
これらの要件をすべて満たすアルゴリズムは一朝一夕で実現できるものではなく、何度も試行錯誤を繰り返してきました。ざっと挙げるだけでも、今年1月のクローズドβリリース以降、3回は大きな改変を行っています。まだまだタイムラインの品質には満足しておらず、今後もどんどん変更していくものと思われます。
- v1: 全チャンネルの新着情報を、チャンネルごとにまとめて見られる
- v2: 時系列ベースで記事を読み込みつつ、ユーザーにとってノイズと感じられやすい情報をふるい落とす
- v3 (今回): パーソナライズされたランキングをベース。
v1: 全新着
v1は、一切のパーソナライズなどを考慮することなく、ただ単にフォローしているチャンネルの新着情報をまとめて見れる…というものでした。が、これだとフォローしているチャンネル数に比例して、情報量が多くなりすぎ、毎日見ても追いつかなくなる…という問題を抱えていました。
Slackの「全未読」メニューにヒントを得た実装でしたが、結局破棄することになりました(が、そこで開発したコードは現在のストーリーズなどに活かされています)。
v2: タイムライン+フィルタリング
v2は、前述した要件が見えてきた中で、「時系列の尊重」と「ノイズレス」を組み合わせた実装でした。発想は簡単で、情報を新しい順に読み込み、「これはノイズだ」と考えられる情報をふるい落とすだけです。
ですが、この方法の一番の問題点は、 時系列に強く依存する ということです。そのため、 アクセスする時間によっては興味の薄い情報が上の方に並んでいる ことがよくあり、そのまま離脱に繋がってしまいます。
更に、「どんな情報がノイズかは人によって異なる」という部分を無視して、機械的に情報を切り捨てていたため、人によっては価値ある情報を捨ててしまったり、人によっては面白くない情報が残ってしまったり…という感じで、全体的に「まあまあ(よりちょい下)」くらいの品質になってしまいます。
そして、これが一番の問題点ですが、 チューニングできる部分が非常に少なかった ということです。このアルゴリズムで変えられるのは主に「どの情報をふるい落とすか」のしきい値だけです。しかも、そのしきい値を変更したらタイムラインにどう影響が出るかも、結果としてユーザーの皆さまのUXをどれくらい改善できるかも見積もれません。
v3: パーソナライズ+ランキング
これらの問題を踏まえて、今回実装したのがパーソナライズとランキングの組み合わせです。端的に言えば、「 情報を48時間で区切ってランキングを作成し、それを並べて表示している 」というのが、現在のTechFeedのタイムラインです。
v3の実装のポイントは2つあります。
- パーソナライズされたランキングの生成 …ユーザーの皆様の関心や情報自体の品質、難易度など、様々なパラメータを元にランキングを行っています(詳しくは後述)。ただし、ランク付け(つまり並び替え)を行うには、情報の数が有限であることが必要で、それを実現したのが次のポイントです。
- 時系列については、シビアである必要はない …TechFeedのタイムラインに求められることは、「ゆるい時系列」であり、シビアに時間順に並んでいる必要は全くない…ということを、運営している中でようやく気づくことができました。そこで、 情報を48時間ごとに区切ってランキングを行う (そしてそれを並べて表示する)という設計に踏み出すことができました。
こうした実装を行うことで、「時系列の尊重」「ノイズを少なく」「パーソナライズ」という要件を満たすことができました。そして、タイムラインのトップが常に「ランキング上位」の記事となることから、 ユーザーの皆さまが関心を持ちそうな記事をファーストビューに集めることができるようになりました。
それだけではありません。ランキングを作成するにあたって、徹底的にデータを活用するようにしたことで、 タイムラインのUXを数値化すること、そしてチューニングのしやすさ も実現することができました。タイムラインのUXを数値化するというのは、つまりは 表示する情報の全てを数値化できるようになった ということで、それは ランキング作成時にどのようなパラメータを使用しているか が深く関わってきます。
ランキングのパラメータ
ランキングを作成するにあたっては、「ユーザーの関心」「おすすめ度」「難易度」という、3つの要素を加味しています。
- ユーザーの関心…ユーザーの皆さまが、どのチャンネルをどういうモード(トレンド/エキスパート)でフォローしているか、そしてこれまでのアクティビティ(読む、ブックマーク、コメント…)などを元に、ユーザーの皆様のチャンネルごとの関心度を数値化します。
- おすすめ度…TechFeed上でのブックマーク数や既読数などはもちろんのこと、Facebookのいいね!やツイート数、Pocketやはてなブックマークの数など、様々なスコアを加味して、情報のおすすめ度を算出しています。
- 難易度…情報の難易度の算出は非常に難しいのですが、現在は、「上級者(エキスパート)がおすすめしている」ことを手がかりに、難易度を推定しています。また、英語の記事は日本のエンジニアにとって歯ごたえがあることから、難易度にプラスされます。
こうしたパラメータを元にランキングを作成するようにしたことで、タイムラインのUXを数値化すること、多くのパラメータをチューニングできるようになったこと、そしてチューニング後の変化を予測しやすくなりました。
例えば、先日プレスリリースでお知らせしたとおり、TechFeedは誰でもリンクとコメントを投稿できるオンラインコミュニティへと進化しましたが、 「エキスパートやフォロワーがシェア/コメントした記事」という特徴に対して多くの重みを与える ことで、「人がおすすめしている記事の比重を上げる」などの変更を容易に行うことができました(ちなみに、「他のユーザーがおすすめした記事」については1.6倍のクリック率があることが事前に判明していました)。
今後の展望
などなど、今回のアルゴリズム変更についてかなりの字数を割いてお話してきましたが、現在のアルゴリズムが完璧かというと、全くそんな事はありません。実際のデータを見ながら細かくチューニングしていく必要もありますし、精度をより向上するためにも、パラメータもまだまだ増やしていく必要があります。
また、アルゴリズム自体試行錯誤の連続でしたので、 ユーザーの皆様への説明がまだまだ不足していると感じています 。この記事は、そうした説明の皮切りとなるものですが、アプリのUI上でも、並び順についての説明や、使用しているパラメータの可視化(特にユーザーの皆様の関心度など)が全く足りていません。また、「単なる時系列」や「パーソナライズしていない、純粋なランキング」などの並び順にもニーズがあるかもしれず、 タイムラインの並び順を選べるようにしてもいいのかも 知れません。
まだまだやることは山積みですが、タスクの優先順位付け、そして開発のモチベーションに強く影響するのは、ユーザーの皆様からのフィードバックです。公式Twitterアカウントをフォローして、メンションしていただくだけでも構いません!お気軽にフィードバックいただければ幸いです。
ちなみに、今回の記事を読んでTechFeedのアルゴリズム改善などに興味を持った方がいらっしゃいましたら、気軽にご連絡ください。データサイエンティスト募集中です:-)
また、上のアルゴリズムはすべてTypeScriptで書かれています。TechFeedは、フロントエンドからバックエンドまですべてTypeScriptでできてます。フロントエンドのスキルがあれば、TechFeedのすべてをコーディングできます。ということで、JavaScript / TypeScriptのエンジニアも募集中です!
では皆様、どうぞ良き年末年始をお迎えください!メリークリスマス🎅
リリースノートなのに、なぜかアルゴリズムの解説という謎記事ですw
タイムラインのアルゴリズム面白い