「夫子憮然曰、鳥獣不可與同羣。吾非斯人之徒與、而誰與。
「論語」微子、第十八、六

2013/02/21

いかに記事を推薦するか、その2(億万長者の夢とコールドスタート)

昨日は、 "Mynd Daily" の推薦アルゴリズムと、 それが私の "Life hacker reader" については完璧に動作したことをお話しした。 しかしそれは、「問題が簡単だから」であって、一般的な推薦システムを作るのは全く別問題なのである。 何よりもまず、開発者とユーザが同じ自分一人だけだということが、問題を無限に易しくする。 この教訓は一般的に成立するが、推薦システムについてはなおさらである。

この真理に思い至らず、 手元で素敵なアプリを作って悦に入り、 これを公開して一つ百円で売れば何億円儲かることか、 いや失敬、どんなに世界を良い場所にできることか、 と白昼夢にひたっている日曜プログラマは世界中に 50 万人くらいいると思うが、 勘違いもはなはだしい。 昨年リストラ部屋で同じような夢を堪能していた過去の私にも、目を覚ませ、世界の声を聞け、と言いたい。

それはさておき、今朝、 "Mynd Daily" から最初の記事が配信された方は、 自分とまるで無関係な記事ばかりだっただろうか、 それとも、興味を持ちそうな記事が含まれていただろうか。 つまらない記事ばかりなら、あなたはもう退会してしまうかも知れない。 しかし、よく考えてみると、 初めての配信で、そのユーザのことを何も知らないのに、 どうやって推薦ができるのか。 これは記事推薦に限らず、あらゆる推薦システムの大きな課題で、 「コールドスタート」問題と呼ばれている。 つまり、初めてのお客で何の手がかりもないのに、 何かまともなおすすめをしないとお客が帰ってしまう。 一人で自分用に開発していると気付かないが、 見かけ以上に深い問題である。 そもそも、サーヴィスにとって、 ユーザになってくれるかどうかの問題以上に深い問題などない。 夢見がちな億万長者候補は、このことをよく噛み締める必要がある。

"Mynd Daily" では基本的に、配信した記事(のタイトル)を読者がクリックして記事の本体を読みに行ったかどうかをチェックし、 その情報をユーザの特徴量に反映させて、推薦情報にしている。 だから、当たり前のことながら、最初の配信では推薦の手がかりがない。 この問題を解決する方法は、基本的に二通りしかない。 他の方法でユーザの情報を得るか、情報ゼロでも何とかするか。

前者としては、ユーザの情報を入会時に教えてもらう(例えば、年齢や性別)、 他のところにある情報を入手させてもらう(例えば、SNS アカウントと連携してもらう)、 などが考えられる。実際、我々は今のところ、コールドスタート問題を解決するためだけに、 SNS アカウントからの情報を使っている。よって、もしユーザが SNS 連携をしてくれないと、 情報ゼロでスタートする。 我々は "usaggr" という iPhone アプリも提供しているので、 そこから情報をとるという手もなくはなくて、 実際、usaggr にも推薦エンジンが組込まれているし、 ユーザの嗜好情報を全てのサーヴィスの中心におくのは弊社のヴィジョンである。 とは言え、ユーザの利便性がはっきりしない限り、 ユーザのものである情報を使うことには慎重でありたいので、 今のところ実現する予定はない。

後者の方法としては、人気商品をおすすめするのが普通だろう。 初めてのお客で、どんな好みか分からないのだから、とりあえずは「この商品が良く出てますね」 なんて感じで接客する。 しかし、記事配信は毎日新しく流れてくるニュースが対象なので、人気を調べている時間がない。 では、どうするか。 過去のデータから、ある程度人気があると分かっているニュース源を使う、とか、 全ての候補記事の質を上げる(「どの商品もおすすめです」作戦)、とか、 いくつかアイデアはあるが、どれも言うに易く行うのは難しい。

また、前者と後者の中間的な方法で、実際に "Mynd Daily" で採用しているのは、ユーザが自分で RSS を登録する機能。 RSS のことをちゃんと知っているユーザは少ないのと、 誰でも使えるようなレベルで実装するのが面倒なのが理由で、 ギーク向けの「隠し機能」気味にしているのだが、コールドスタート対策でもある。 自分で RSS を登録してくれれば、 推薦の手がかりがない状態でも、 その RSS から、つまり、ユーザの興味の範囲から選ぶことができるからだ。