見出し画像

あなたのタイムラインのツイートはどのように決まっているのか【Twitterレコメンドの仕組み】

アルゴリズムの突然の公開

先日、Twitter社がこれまで非公開だったレコメンドアルゴリズムのソースコードを公開しました。ソースコードはGitHubで公開されており、これは主に「ツイッターの"For you"の画面に表示するツイートをどのように選ぶか」というレコメンドの仕組みについてのコードになっています。
この投稿では、"For You"のタイムラインで表示されるツイートがどのような仕組みで決まっているのかを説明します。基本的にはTwitter社がソースコードと同時に公開したこちらのブログ記事をもとにした内容になります。また、私の興味がAI分野なので機械学習関連の内容は多めに、それ以外のトピックは薄めになると思います。
また、今回の投稿する内容はレコメンドアルゴリズムの概観となりますので「〇〇の内容をツイートすればインプレッションが△△倍になる。」というようなハウツーの内容は含まれません。(今後ソースコードを読み進めてわかったことがあればアップデートするかもしれません。)

レコメンドの仕組み

まとめ

まずは全体のまとめです。"For you"のタイムラインに表示されるツイートは以下の順序で決められています。

  1. 以下の3つの方法で合計最大1500のツイートを候補としてリストアップする

    1. フォローしているアカウントの中から、ユーザーが反応する可能性が高いと(ロジスティクス回帰で)予測されたツイートを上から順に抽出

    2. 直接フォローはしていないが、「自分がフォローしている人が反応したツイート」や「自分と同じツイートにいいねした人が他にいいねしたツイート」を抽出

    3. ユーザーの興味やツイートの内容を数値化することで、ユーザーの興味に近いツイートを身近なフォロー/フォロワー関係の範囲を超えて抽出

  2. リストアップしたツイートの特徴を数値化し、ポジティブな反応が見込めるかどうかを10個の観点から(ニューラルネットワークで)予測し点数化する。それぞれの観点を総合的に加味して最終的なツイートのランキングを作る

  3. ミュートしているアカウントをフィルタリングして除外する

1.1 ネットワーク内のツイート抽出

フォローしているアカウントのツイートをネットワーク内のツイートと呼び、フォローしていないアカウントをネットワーク外と呼びます。まずはネットワーク内から候補を選びます。その基準はユーザー同士の相性を特徴量としてユーザーがツイートに反応する確率をロジスティクス回帰を用いてスコア化しています。
タイムライン上全体ではこの方法で抽出されるツイートが最も多いです。つまり、ネットワーク内から抽出されるツイートがタイムライン上の最も多い割合を占めます。

1.2: ネットワーク外のツイート抽出: ソーシャルグラフ

次にネットワーク外からツイートを抽出してくる方法です。大きく2つのアプローチがあり、1つ目のアプローチは"ソーシャルグラフ"と呼んでいるものです。これは「直接はフォローしていないがユーザーの周辺に近いツイート」を抽出するためのものです。具体的には「自分がフォローしている人が反応したツイート」や「自分と同じツイートにいいねした人が他にいいねしたツイート」を抽出してきます。これらの条件に当てはまるツイートをリアルタイムで探すためにTwitter社は独自の計算エンジンを開発しています。
この1つ目のアプローチで抽出するツイート量はタイムラインの約15%です。

1.3: ネットワーク外のツイート抽出: 埋め込み空間

2つ目のアプローチは1つ目のソーシャルグラフより遠くの関係にあるツイートを引っ張ってくるための仕組みです。これは"埋め込み空間"と呼ばれており、ユーザーやツイートの特徴を数字の並びとして表現することで特徴の類似性を計算する方法です。
埋め込み空間についてもう少し掘り下げて説明します。まずツイートの文章を数字の羅列(専門的には埋め込み表現と呼ぶので以後はそう呼びます。)に変換します。このとき似た内容のツイートであればその埋め込み表現も似るように変換します。そうすると当然ですが、似た埋め込み表現のツイートを集めれば、それはすなわち似た内容のツイートを集めることになります。なぜこんなことをするかというと、文章データ同士の類似性を比較するより、埋め込み表現のような数値データの類似性の計算のほうが処理が簡単だからです。
この埋め込み空間というアプローチを用いることでネットワークの垣根を超えて自分と似ているユーザーやツイートを機械的に見つけてくることができます。

2: ツイートの順序付け

1.1, 1.2, 1.3のそれぞれの仕組みで抽出されてきたツイート数を合計するとだいたい1500のツイートになります。ここからは、抽出してきたツイートを画面に表示する優先順位を決めます。また、このステップでは1.1~1.3でのそれぞれ抽出の過程において用いられたスコアは一旦捨てて、抽出されたすべてのツイートに対してゼロベースで優先順位を付け直します。
順位をつけるためにはニューラルネットワークのアルゴリズムが用いられています。数千種類の特徴量を入力するとニューラルネットワークは10種類の確率値を出力します。この確率とは例えばユーザーが「リツイートする確率」、「プロフィールをクリックする確率」、「リプライしたらツイート主が反応してくれる確率」などです。(詳しい説明はGitHubのこちらにあります。)

3: フィルタリング

これまでのステップでツイート候補の抽出とその優先順位付けが終わりました。このステップでは最後の仕上げが行われます。
ブロックやミュートしているツイートを除外したり、1人のツイートばかりにならないようにツイート主に多様性をもたせたりなどの処理が施されます。
そして最後に広告ツイートを挿入して"For You"のタイムラインの完成です。

注意点

  • これまでに説明した抽出や順位付けの仕組みはTwitter社により継続的にアップデートされてます。内部で利用されているパラメータの重みや全体的な構成されも変わる可能性があります。

  • この投稿はハウツー的な内容ではありません。解説の通り、個々のアルゴリズムは比較的シンプルですが、それらが階層的で複雑なっていたり、アルゴリズムのパラメータが非公開だったりするので、こうすればタイムラインに乗りやすいツイートになるとは簡単には言えません。

(余談)データサイエンティストにとって貴重な教材

余談になりますが、なぜ今回ツイッターのレコメンドアルゴリズムについて私が興味を持ったかについてお話します。私が職業としているデータ分析(データサイエンティスト)の業務の中でも、レコメンドというのはデータ分析の仕事でも最も需要の高いテーマの1つです。世の中にはレコメンドアルゴリズムの手法が数多ありまして、それぞれ長所短所があります。データ分析者に求められるのはもちろん最も精度(精度の定義も様々ありますがここでは割愛)が高いアルゴリズムを実装することでもありますが、同時に業務要件を満たすアルゴリズムである必要があります。
業務要件とは、例えばツイッターの場合は計算処理コストが重要な要件の一つとなるでしょう。ちょっとした軽い処理でも世界で数億人のユーザーを抱えているので全体としては膨大なコストになってしまうことがあります。一般的に精度の高いアルゴリズムほど複雑な構造をしているので処理の負荷が高くなる傾向にあります。いかに処理負荷を下げつつ高い精度のレコメンドができるアルゴリズムを実装するか、それがデータサイエンティストの腕の見せ所となります。
世界有数のテック企業であるTwitter社のレコメンドアルゴリズムの中身を見られるというのは、データサイエンティストにとっては思いがけない学びのチャンスだと考えています。通常、企業のソースコードは非公開であり、当然レコメンドアルゴリズムも例外ではありません。それが今回は実際に使われているアルゴリズムの実装が詳細まで公開されているので、これはデータ分析を生業としている人にとって最高の教材になると考えています。
ソースコードの細かい部分はまだあまり読めていないので、今後コードを読み進めていってわかったことを忘備録を兼ねて投稿していきたいと思っています。

この記事が気に入ったらサポートをしてみませんか?