「秋葉原ラボ」は、2011年に設立された、データ解析やデータマイニングなどを専門とするエンジニアが在籍する研究開発組織です。
サイバーエージェントでは、「アメブロ」から始まり、電子書籍サービスや音楽配信サービス、動画サービスなどインターネット産業の変化に合わせて様々なサービスを提供していますが、それらサービスをデータ活用で支えているのが「秋葉原ラボ」です。
今回は同組織でレコメンドシステムの開発に取り組む内藤と福田に、開発の裏側について聞きました。
内藤 遥(右) 秋葉原ラボ ソフトウェアエンジニア。 2012年サイバーエージェント新卒入社。秋葉原ラボ配属後は監視基盤システム「Orion(オライオン)」の開発に携わる。その後、検索基盤やトレンド検知システムの開発・運用を担当し、近年ではレコメンドシステムの開発・運用に従事。 福田 鉄也(左) 秋葉原ラボ ソフトウェアエンジニア。 音楽配信サービスのデータ集計基盤の開発・運用に携わった後、2016年6月サイバーエージェント中途入社。入社後は秋葉原ラボに所属し、レコメンドシステムの開発に携わっている。
設立から6年、継続的にデータ活用に取り組む点に魅力を感じた
ーーはじめに、福田さんは中途入社ということですがどのような経緯でサイバーエージェントに興味を持ったのでしょうか?
福田:もともと音楽配信サービスの会社でソフトウェアエンジニアとして働いていました。当時の担当は、データの集計基盤やプッシュ配信基盤、レコメンドシステムの開発と運用などです。データを扱うチームに所属していたこともあって、データの有効活用、特に機械学習などの技術を利用したものに興味が出てきて、こういったものに携われるポジションを社内外で探していたときに、転職エージェントの方からサイバーエージェントを紹介されました。秋葉原ラボ自体は以前から知っていて、秋葉原ラボのエンジニアが発表している論文を読んだこともありましたし、2011年から継続的にデータ活用に取り組んでいる点にも魅力を感じて入社を決めました。
ーー現在お二人が取り組んでいるレコメンドシステムの概要について教えてください
内藤:大きく2つありまして、一つはインターネットテレビ局「AbemaTV」や「アメブロ」などサイバーエージェントが提供するメディアサービス向けのレコメンド基盤です。この基盤自体は秋葉原ラボの設立と同じく2011年からありまして、現在は福田ともう1名の合計3人で担当しています。
レコメンド基盤では閲覧履歴や購買履歴などの大規模データを活用して、ユーザ一人一人に合ったコンテンツのレコメンデーションを提供しています。その中で自分が特に注力しているのは、レコメンデーションに特化した汎用的なバッチフレームワークの開発です。サイバーエージェントでは、動画サービスやマッチングサービス、ブログ、音楽配信サービスなど多様なサービスを提供しており、その分各サービスから様々な要望も出てきています。こうした要望により柔軟に応え、新規サービスの導入コストや運用コストの削減を目指したいと思い、目下開発しているところです。
参考)2016年7月25日開催 「夏真っ盛り!Spark + Python + Data Science祭り」登壇資料
福田:もう一つは、 「A.J.A. Recommend Engine」で使われている記事コンテンツを対象としたレコメンドシステムです。「A.J.A. Recommend Engine」はニュースサイトやWebマガジンなどの社外サービス向けに提供されているのですが、バックエンドのシステムとして文書の類似度に基づいたレコメンドシステムがあって、それを我々が開発しています。
このシステムは、運用コストなどの観点から、単一のシステムで数百のサービスに対してそれぞれ数万から数十万の記事を扱えるように設計されています。また、記事の頻繁な追加や削除に対してもほぼリアルタイムで対応できるアーキテクチャになっています。
参考)「Data Engineering and Data Analysis Workshop #1 を開催しました」
Product Quantization の利用に衝撃を受けた
ーーレコメンドシステムを開発する上で、特に工夫した点や苦労した点があれば聞かせてください
内藤:スケーラビリティのために、API Balancerという機能を自前で作った点でしょうか。「A.J.A. Recommend Engine」において、もともとは一つのAPIに全サービスの記事ベクトルデータが乗っている状態だったのですが、それだとリソースの活用が非効率でスケールしにくいという問題を抱えていたんですね。
そこでAPI Balancerを開発することで、各サービスごとでメモリやCPUの使用量を定期的に集計し、リソース使用量に応じて適切なAPIサーバの数を自動的に割り当てられるようにしました。
福田:リソースの有効活用でいうと、記事ベクトルデータの圧縮やレスポンスタイムの高速化のためにProduct Quantization(直積量子化)というアルゴリズムを利用しています。
全てのデータをうまく圧縮してメモリ上にのせるようなアイディアを私自身持っていなかったですし、こういったアルゴリズムをプロダクション環境で利用しているという点に衝撃を受けましたね。
内藤:その他には、「アメブロ」の記事レコメンドが挙げられます。こちらではいわゆる協調フィルタリングと呼ばれる手法を使っていて、ユーザーやアイテムのデータを行列として扱っているのですが、「アメブロ」の場合ユーザーもアイテムにあたる記事数も桁違いに多くて普通に推薦結果を作ろうとするとバッチ処理が終わらなかったり、キャッシュを使おうとするとメモリが足りなくなってしまうんです。そこでデータ構造の見直しを行ったり不要な処理をスキップしたりと、アルゴリズムの省メモリ化や高速化に向けて色々試行錯誤していました。
福田:秋葉原ラボは多様なサービスを横断で見ているのが特色です。サービスによって扱うコンテンツもテキストや動画、音楽と内容が変わりますし、その都度要件も異なる。多様なサービスに展開できるよう汎用的に作る部分と、サービスに特化した知見を活かすためのバランスは難しいと感じています。先ほどのバッチフレームワークの話は、これを解決するためのチャレンジの一つだと思います。
基盤を支えながらサービスの売り上げに貢献できる
ーーやりがいを感じるのはどんな時ですか?
内藤:サービスの売り上げに貢献できることですね。「読書のお時間です」のような電子書籍サービスだと、レコメンドは非常に重要な機能の一つ。基盤を扱う部署がサービスの売り上げに密に関われることってなかなかないと思うので、やりがいを感じます。売り上げの推移を見ることは良い刺激になりますし、サービスサイドの人に喜んでもらうためにもっと頑張ろうと思えますね。
福田:自分が作ったシステムが提供している推薦結果を「アメブロ」などのサービス上で直接見て、ユーザーとして実感できる。これは面白みの1つだと思います。
ここ1,2年で大規模データの活用に取り組む会社が増えてきたように感じますが、秋葉原ラボが約6年、継続的にこういった技術に取り組めているのはやはりすごいと思います。実際にサービスに適用するところまで回していけているのが秋葉原ラボの強みだと思いますし、やりがいを感じる点でもあります。
ーー現在採用を強化しているとのことですが、今後どんな方と一緒に働きたいですか?
福田:技術面でいうと、機械学習を含むアルゴリズムの部分と、いわゆるWebアプリケーション開発の両方に興味がある方は活躍できると思います。レコメンドシステムは、Webサービスのコンポーネントの1つとして動くシステムです。また、推薦アルゴリズムを設計する部分と、それをサービスに提供するためのレイヤーををきれいに分業するのは難しくなってきていると感じています。なので、ある程度両方の分野に興味を持っている方と一緒に働けたら嬉しいですね。
内藤:福田の話に加えて、自分自身が関わるシステムをより良くするために継続的な改善に向き合う姿勢が大切だと思います。一度作って終わり、という風になってしまうと、システムがどんどんレガシーになって技術的負債につながってしまいます。そういう危機意識を常にもって、改善の努力を怠らない方だと嬉しいです。
ーー最後に今度の目標を教えてください
福田:現在はシンプルな行動履歴をもとにしたアルゴリズムを使うことが多いのですが、今後はより多様な情報をリアルタイムで活用していきたいと考えています。
例えば、アニメのタイトルで検索しているような人はある程度アニメに興味があるはずです。また、サービスにもよりますが、平日と休日ではユーザの行動傾向は違うかも知れません。こういった情報をうまく扱うためのアルゴリズムやアーキテクチャについて調査、検討しているところです。
内藤:バッチフレームワークに限らず、レコメンド基盤としての汎用性を向上させたいです。サービス側の難しい要望に対しても「今ある機能でいけます」と言える状態が理想です。またサービスごとにPDCAサイクルを回してレコメンド効果を改善していく重要性も日々感じていまして、そういった意識を各サービスサイドの人たちにも持ってもらうためにどのように働きかけていけるかが、今後の課題だと思っています。
▼秋葉原ラボではエンジニアを募集しています ・共通基盤サーバサイドエンジニア ・大規模データ処理基盤エンジニア ・機械学習エンジニア ・データアナリシスエンジニア