今回はレコメンドシステムの実装の問題と,その解決策として利用するHadoopについて説明します。今回のポイントは以下の通りです。増え続けるデータをどう扱うかレコメンドシステムを協調フィルタリングのうち,ユーザベース方式により実装することを考えます。このシステムでは次のような映画の評価履歴を使い,「⁠この映画を評価した人はこの映画も評価しています」という映画の推薦を行います。力丸,バトルランナー,5,2010/01/15この履歴は各行,左からユーザ名,映画のタイトル,その映画への評価,評価した時刻が含まれています。最初に,この履歴を映画(アイテム)ごとにユーザを集約しリストを作成します。このリストをアイテムシーケンスデータと呼び,次のような形式になります。ここでは話を簡単にするために,評価や時刻など他の情報は落としてあります。前回の記事で,類似度の定義にはいろいろあると書きました。ここではその定義の1つとして,コサイン関数を使います。b(=(b1,b2,b3,....,bn))を使うと,次のように定義できます。コサイン関数を使った類似度の計算コサイン関数は,2つのベクトルの要素が完全に一致すると1の値を取り,要素が全く一致しないと0になります。今回は,映画の類似度をコサイン関数で定義する場合,ユーザを要素とする映画のベクトルを考えることで計算できます。となり,「⁠ザスーラ」と「ジュマンジ」の類似性は1となります。となり,映画の類似性は0です。ここまでの処理の実装方法について考えます。通常,履歴から一気にそのままアイテム間の類似度の計算まで行うことは,履歴のデータサイズが小さくない限り,現実的にないと考えてよいでしょう。したがって,履歴,あるいはそこから抽出した情報をいったんデータベースに格納することになりますが,そのために,どんな環境を準備すればいいのでしょうか?アイテムシーケンスを作成したら,それもデータベースに入れる必要が出てきます。データのストレージだけでなく,あとから参照や演算等の処理を実行することを考えると,マシンのCPUやメモリのスペックも上げる必要があります。これはマシンのスケールアップによるアプローチです。最後に,アイテム間の類似度の計算は,作成したアイテムシーケンスを“⁠全て⁠”読み込んでから実行します。アイテムIDが10万あり,類似度を浮動小数扱いにすると8バイトなので,類似度の結果は単純計算しても100000×100000×8=8×1010で80ギガバイトもあります。履歴の収集開始時にはアイテム間で共通するユーザが無く(=a*b=0⁠)⁠,類似度を計算できない場合もあるのでここまでメモリは必要になりませんが,履歴が蓄積されてくれば,使用するメモリ領域は増えてきます。ユーザの新規加入やアイテムの追加があるため,このままでは単一マシンのメモリでは計算することが難しいのは明らかで,マシンのスケールアップでは解決が難しそうです。巨人の肩に乗るこれまでにも,大量データの処理で直面する課題の解決方法はいろいろ考えられていますが,その中で最も有名かつ広く使われているのはGoogleが採用したアプローチです。正確には,そのアプローチのアイデア自体は昔からあったのですが,Googleの凄いところはページランク同様に実装したところです。Googleの扱う大量データと言えば,全世界のWebコンテンツです。この大量データから検索結果の基となる情報ができるまでの流れを見てみましょう。Webコンテンツから検索基礎データの生成まで一連の処理では大量のWebコンテンツをどこに格納するのか?これらのコンテンツのインデクシングをどう実現するのか?コンテンツ間のリンク解析をどうやって実現するのか?といった課題に直面します。スケールアップがマシンのスペックを上げて集中処理するのに対し,スケールアウトは安価なマシンを組み合わせて分散処理するアプローチです。Reduceのコードは公開しないものの,その実装方法については論文として公開しました。Reduceは分散処理のフレームワークです。実装上の微妙な違いはあるものの,Googleが使っている大規模データの分散処理技術を,我々も自由に使えるようになりました。Reduceはフレームワークなので,MapおよびReduce関数は利用者側で設計することになります。value>のペアという形式の制約があるものの,この制約のおかげで利用者側は処理のロジックの設計に集中できます。したがって,従来の分散処理と違ってメモリ,ジョブの管理,スケジューリングやデバッグといったシステムレベルでの管理方法を考えずにアルゴリズムの実装に集中できます。このアルゴリズムはデータが増えようが,クラスタを構成するマシンの数が増えようがそのまま適用できます。Reduceを実行するHDFSに作成したインデックスを格納するという3ステップで実現できます。ReduceはMapおよびReduceという2つの処理から構成され,Mapは抽出,Reduceは集約を受け持ちます。Mapを「コンテンツから,単語をkey,コンテンツのIDをvalue⁠」⁠,Reduceを「単語ごとにリストを作成する」と設計すれば,以下のようにWebコンテンツのインデックスを生成できます。Webコンテンツであれば,MapperでHTMLタグやJavaScriptの除去や,形態素解析やトークン化,文字の正規化,ステミングなどの処理を行う。2Shuffleでは,Mapperの出力結果をキーでソートして,Reducerに入力データとして転送している。その結果,3Reducerでは入力キーの変化したタイミングで集約結果を出力することができる。ここで各コンテンツに対してMapは並列に同じ処理を実行し,Reduceはその結果を集約しています。value>の形式でデータをやり取りします。Reduceは,処理を個々のマシンでなくクラスタ全体で実行します。データを分割して計算する場合,データをクラスタ内のローカルディスクに分散し,そのデータがあるノード上で処理を実行,つまりストレージと演算処理を単一ノード上で実行するアプローチをとります。したがって,従来のアルゴリズムをこのフレームワークで実行できるように再設計する必要があります。先ほどの映画の履歴では,何をkey,何をvalueにすれば良いのでしょうか?次回の記事ではこの説明をしたいと思います。setの準備をお願いします。StreammingとPerlを利用します。Hadoopの詳細な設定については本家ApacheのHadoopサイトをはじめ,各種の文献,書籍等をご覧ください。専門は情報検索,統計的機械学習,マーケティングサイエンス。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。