俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

日報 #20 - 選別アルゴリズムについて

あぁ…書くことないなぁ…

あぁーー、書くことないなぁ…どうしよっかなぁ…

はい今日のテーマは「写真の選別アルゴリズムについて」

ウチには、ユーザ様方が投稿してくださった珠玉のお部屋写真が沢山あります。
とてもありがたいことです。全て何にも代えがたい宝物です。
もちろんどんなお部屋写真も活目に値する価値を有しているのですが、
とはいえお忙しい皆々様におかれましては「全て見る」というのはとても困難なわけです。
なので、色々なシーンにおいて、それに沿った写真を選定してお出しするという機会が多々ございます。
「選定する」なんてあまりにも畏れ多く、社員がやろうとすると「マジで甲乙なんてつけられまへん」状態に陥るわけです。
ということで、満を持して冷酷無比なパソコンの登場です。
アルゴリズムとかいう、いかにも心ない名前のシステムを導入するわけですね。
これが本日のテーマです。
アルゴリズムでもってどうやって、とある目的の写真を選定するのか。

さて、人間の手法こそ全て、という発想に立って簡単に考えますと、
シンプルな解答は「画像で評価」であります。
つまり画像解析です。
これは一気に難しくなります。
(実はRoomClipは大学の研究室及び、株式会社Ikkyo Technologyさんと一緒にこの挑戦的な課題にひたむきに挑んではおります)
株式会社Ikkyo Technology : http://www.ikkyotech.com/ja/

画像解析、これは今の僕らだけではちょっとムリな話です。
本当はとてつもなく刺激的で挑戦的な課題なんですけどね。
未だかつて「実際の皆の部屋からインテリアテイストを分類する」なんて誰も達成してないんじゃないでしょうか。
今日も今日とて、あたらしいインテリア、こだわり、ブームが生まれている、実はとっても活発な領域なのにも関わらず。

さておき、出来なくったってやらなくちゃすすめません。
幸いにも僕らは画像そのものの情報以外にも、色々なメタ情報を持っています。
例えば写真に付いているタグであるとか、撮影して頂いたユーザのアクティビティとか。
それを元に、求められたシーンごとに「沿っている」写真を優先的に表示していく。
そのためのアルゴリズムを、物の価値とは別に、便宜的に作るわけです。
注意頂きたいのは、お部屋写真の良し悪しというものは本質的には存在しません。
あくまであるページ、あるコンテンツにとって沿っていそうなものを優先的に表示するため、程度の話です。

さて、ナイーブな話題を横に追いやって、本題であるアルゴリズムそのものについて。
ある基準において便宜的によいとされるものを算出するロジックを作る時、
僕のような「ちょっと統計知ってます」みたいな人が一番タチが悪いです。
多変量解析にはじまり、どっかで聞きかじった複雑系っぽい話、機械学習パターン認識
小難しくてそれっぽい言葉を並び立てます。
最近で言うと僕が「ディープラーニング」という言葉を使った瞬間がもっとも危険です。
「聞き流せ」の合図だと思ってもらって結構です。
さておき、この手の技術を「ちゃんと扱う」にはそれ相応な知識が必要です。
もちろんそういうこと「も」しっかりやりたいのですが、そうでなくて「も」ある程度よさそうな結果を出すことは可能です。
場合によってはサービスを熟知しているユーザ様が適当に「こんな感じの条件だといい写真っぽいよ」という予測のほうがバッチリだったりするときもあります。

ということで、色々と話し合いました。
最初は一撃で算出しようとしました。
ロジックはシンプルです。
「写真に付随する変数全てを配列として何らかの定量的な値に置き換え、それをソートして上位からとっていく」
いかにも僕が考えだしそうな夢物語ですね。
ですが、結論から言うとこの方法は実行できませんでした。
この「何らかの定量的な数値」の算出法が死ぬほど難しくて、悩みすぎた結果、僕が幼児退行してふえぇぇぇってなっちゃったからですね。

なのでちょっと視点を変えて見ます。
「厳しい条件で選定する第一次審査、その後ゆるい条件で第二次審査」
要は、「ベストっぽい写真の条件」をヒューリスティックに用意して、まずそこから写真をフィルタします。
例えばですが、「撮影者はフォロワーが1人しかいなくて、いいねも殆してないのに、撮った写真には200いいね!がついてたりする」みたいな感じ。
あくまで例ですよ。
その後ゆるい条件で審査します。 例えば「いいね順上位10件」とか。
何度も言いますがあくまで例ですよ。マジで。

この手法は中々いいです。
ですが、このままでは多くのニーズには応えられません。
ということで、この手法を拡張します。

アルゴリズムをストラテジーパターンで使いまわせるように複数用意し、
それを随時優先順位を付けて適応していく。
アルゴリズムに該当する写真はとても少なくても、全体としては多くのニーズ(アルゴリズム)に応えた写真の集合ができあがります。
何度も何度も敗者復活戦が行われて、粒ぞろいが集まると言った感じですね。
さて、エンジニア的な課題としては「アルゴリズムの追加・修正・削除を楽にする」ことと「優先順位を楽に変更できる」ということです。
それに「どのアルゴリズムで選定されたのか?その時の優先順位はなんだったのか?」も可視化されていれば、
結果を見た時に「どのアルゴリズムが沿ってない」のかが分かるはずです。

ということで、今日そんなシステムを作っていました。
アイディアはslackで募集し、デザイナーもコミュニティマネージャも社長も、めいめいが「こういう条件」というものを思いつきます。
その度にslack上のチャットに流すわけです。
それを見てファイルを作成し、アルゴリズムを作り、適応させ、結果を眺めてもらう。
そんな作業を延々としていたら、それはそれで疲れた結果、やっぱり幼児退行してふぇぇぇぇってなったからもう帰るわ!マジで!

歌はいいですね。
僕は玉置浩二のメロディって曲が好きですよ。