Jubatusハッカソン with 読売新聞 #2に参加してきました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、小澤です。 11/12, 13の日程で行われたJubatusハッカソンというイベントに参加してきました。 今回はそこでどんなものを作ってきたかの報告をさせていただきます。

Jubatusとは

まず、そもそもJubatusというものをご存じない方も多いかと思いますので、簡単に説明させていただきます。

Jubatusとは、オンライン学習かつ分散処理可能なの機械学習のフレームワークです。 と言ってもこれではまだ暗号だらけな単語を並べただけな感じになってしまったので、オンライン学習とJubatusのアーキテクチャについて説明します。

オンライン学習とは

その前に機械学習とは

今回は話を簡単にするために、ここでいう機械学習はすべて教師あり学習を指すことにします。 教師あり学習という単語に覚えがない方は特に気にしなくても問題ありません。

機械学習は大きく分けて、「学習」というプロセスと「予測」というプロセスの2つに分けられます。 学習のプロセスで使うデータには、個々のデータの特徴を表す特徴と予測してほしい正解となる教師データが与えられます。

例えば、スパムメール判定のような処理であれば

  • 「無料」という単語が含まれているか
  • 特定のURLへのリンクが含まれているか
  • 送信元のメールアドレスが不特定多数に同じようなものを送っているものに一致するか

などが特徴として考えられます。 「考えられます」というのは、通常特徴の選択は機械学習を行う人が決めるものだからです。 また、この例ように経験則から導き出される特徴もあれば、自然言語処理でのBoWや画像処理におけるSIFT, SURFといったような手法も存在しています(Feature Engineeringと呼ばれるものですが、ここでは詳細は割愛します)。

教師データについては、そのメールがスパムであったか否かという情報になります。 これも、ユーザが実際に手動でスパムフォルダに入れたなど、何らかの規則性に基づいて機械的に判断できるものもあればデータをみて人が1件1件手作業でつけていかなければならない場合もあります。

学習のプロセスは、この与えられた特徴が入力されたときに、教師データとして与えられたものを出力できるように内部状態を調整する関数があるプログラムだと想像していただければいいかと思います。 若干数式を出してしまいますが例を出すと、ある1件のデータの各特徴がx_1, x_2, ..., x_nとn個の引数を受け取って、教師データがyとしてそれを戻り値にしている関数があった時に関数の定義としては

y = x_1 * w_1 + x_2 * w2 +, ..., + x_n * w_n + w_0

のような計算をするものになっているとします。 この時w_1, w_2,..., w_nといった値が内部の状態です(この値をウエイトやパラメータと呼んだりします)。 個々のデータではなく与えらたデータ全体に対してより正解となる教師データを返してくれる確率が高くなるようにこのウエイトの値を調整していくのが学習です。

学習が終わるとウエイトがいい感じに調整されているはずなので、答えがわかっていない(たった今受信した)メールの特徴をこの関数に入れてやると、スパムか否かを返してくれるというのが、予測のプロセスになります。

あらためてオンライン学習とは

先ほどの例で説明した関数のウエイトの値をどのように更新するか考えた時に、バッチ学習とオンライン学習という2種類があります。
バッチ学習は上記でも説明した通り、学習に使うデータがまとまって入力として与えられ全体として正解してくれる確率を上げていくものです。

一方でオンライン学習とはこの学習に使うデータが随時与えられて、そのたびに新たにそれを正解できるようにウエイトの値も随時更新していくような手法になります。
オンライン学習のメリットとしては、状況に変化があった際にすぐにそれに対応できることや一回の学習あたりの処理が軽いことが上げあられます。
デメリットとしては学習結果がまずい方向に向かっていてもそれに気づくのが遅れる可能性があるなどがあげられます。

Jubatusとは

さて、機械学習に関する話が長くなってしまいましたが、Jubatusの話に戻しましょう。 Jubatusはオンライン学習かつ、分散処理を行います。

どのように分散しているかというと、学習や予測のプロセスは個々のノードがそれぞれ行っています。 そのため、ある特定のタイミングで見た時のノード間でのウエイトの値は異なっている可能性があります。
しかし、常にこの状態で個々のノードが個別に学習を進めていくとノード間でのモデルの乖離が大きくなってしまします。 そこでJubatusでは定期的にノード間でやり取りを行って、お互いのモデルの状態をマージします。この処理をMixと呼んでいます。

機械学習は100%正しい結果のみを出すものではないため、Mixを通して全体で学習はしているがある瞬間においては返す結果がノードによって異なることは受容するという設計になっているのです。

jubatus

Jubatusハッカソンで実装したもの

さて、前置きが長くなってしまいましたが実装したものについてです。 とは言っても実はすでにスライドはアップロード済みです。

内容に関してここに記載さていただきますと、今回使った機械学習は2種類になります。

1つ目は、特徴を与えるとそこから数値を予測するRegressionというものです。これを利用して、

  • 発言小町の書き込みから単語を抽出する
  • 抽出した各単語を特徴して与えて、レスの数を予測する機械学習のモデルを作成
  • 各単語に対するモデル内部のウエイトを取得
  • ということをしています。
    通常ですと、機械学習でのウエイトはモデル内部の情報で予測時に利用するものですが、今回はこの情報が欲しかったので予測では使わずにウエイトそのものを取得しています。

    2つ目はWord2Vecと呼ばれるものです。 これは大量の文章を与えると各単語がどれだけ類似してるかを計算してくれる手法になります。これを利用して、

  • 発言小町の書き込みを利用してWord2Vecのモデルを作成
  • 1つ目で取得したウエイトから値がマイナスのものを抽出
  • 抽出した単語の類義語をWord2Vecのモデルから取得
  • 類義語から1つ目のモデルでのウエイトがプラスのもののみ抽出
  • ということをしています。
    これはどういうことかというと、1つ目のモデルは数値を予測するものなので、ウエイトがマイナスのものはレス数を下げ、プラスのものは上げる方向に寄与指定します。 なので、マイナスからプラスになるように類義語で置き換えてやることで、レス数を伸ばそうというものです。

    実際の動作

    実際に動作するものをお見せできればと思うのですが、実はこのハッカソンは終了後に提供いただいたデータを消去することになっておりました。
    そのため、データがない状態ですと動作させられないのと、キャプチャなども残しておくとそこから元の情報につながる可能性のあるものであったため、今回はお見せすることができません。

    ただ、一つだけ正直に言っておきますと、今回の成果はあまり性能のいいものではありませんでした。
    書き込んだ内容からだけではどの程度のレスが付くかの予測は難しいようです。

    他の参加者の内容

    すでに発表した全チームのスライドが上がっていますので、リンクを貼らせていただきます。

  • 発言小町からのプロファイリング
  • 新聞から今年の漢字を予測する
  • 小町のレス数が予測できるか試してみた
  • 銀座のママ
  • 単語コレクター(文章自動校正器)
  • 小町の溜息
  • 地域の魅力を伝えるツアーガイドAI
  • 運営スタッフ(Jubatus開発社)による作品

  • JUBARHYME
  • 感想など

    Jubatus関連のイベントには以前から何度か参加させていただいたことあったのですが、今回感じたことが一つありました。
    以前と比べてチームを組む方も多く中には模造紙や付箋をつかって議論しているチームもあり、それぞれが一つのプロジェクトとして動いているような雰囲気のチームが多くありました。
    以前と比べて、ガチの人だけが集まったという感じではなくこのような雰囲気になってきているのはJubatusの成熟や機械学習のビジネスでの活用が進んできているのを肌感として感じるのにもいいイベントだったと感じています。