アイビス2014見てきた

 もう先週の話だけど、怖いと評判?の第17回情報論的学習理論ワークショップ(IBIS2014)に聞き専で全日程参加してきた。
単なるエンジニア風情がもったいない限り。

技術、研究寄りな真面目なレポートは会社で共有した。頑張った。
ここではWeb上のチラシの裏らしく、当時の気分をポエムしておく。

1日目: チュートリアル

統計・機械学習の基礎

  • CRPとIBPが計3スライドで説明されていて世の中の進歩を感じる。
  • セミパラのよい文献を講師の方に要求したところ、このへんが良いと教えてもらった

機械学習に基づく推薦システム

  • 以前参加した統数研のトピックモデル講座でも講師をされていた方。
  • ベイズ的行列分解の話はICML2008で結構古いが知らなかった。悔しい。
  • GP拡張カッコイイ。
  • ハザードモデル使う推薦はソシャゲの人が聞いたら喜びそう。

音声音響信号処理のための確率モデルと学習アルゴリズム

  • 音声そんなに詳しくないからこの話は全体の概観と道具立てをひと通り知れてすごい良かった
  • トラジェクトリHMM実装したくなった。
  • 補助関数法勉強したくなった。

Pythonによる機械学習プログラミング

  • 場慣れ感。
  • 各論へのリンク集が嬉しい。
  • 結構細かいノウハウも話されていて勉強になってしまった。

2日目 企画セッション1 離散アルゴリズム機械学習応用

モンテカルロ木探索の理論と実践

  • 囲碁の盤面の評価関数作れた人は居ないんじゃないかな、という話が印象的。
  • 盤面の評価関数が不要というのは偉いという話。
  • ここでも多椀バンディット。
  • 細い一本道(勝ち筋が1つだけある)みたいなのに弱くて、将棋とかだと弱いというのは面白い。
  • A*とMCTSのゲームプレイにおける性格の違いが面白い

離散構造と離散分布

  • 途中からついていけなくなった。悔しい。
  • logicianに投げてみたら、資料をくれと言われた。うーむ。僕もほしいのだが。

大規模グラフ解析のための乱択スケッチ技法

  • LSHでなくてスケッチ技法っていうの?分野の違い?
  • 平易に説明しようという配慮がよく分かる感じで良かった。

招待講演:Deep convolutional network Neocognitron for visual pattern recognition

  • まさかのNeocognitron提唱者。
  • 歴史的経緯を聞けて楽しい。

招待講演:Deep learning: scaling and applications

  • Oxford / DeepMind っていうその所属は何なんだ。
  • 最初に福島先生への賛辞を述べておられてクールだって思った。
  • なんかもうDNNでなんでもいけるぜみたいな雰囲気。

3日目: 企画セッション2 学習理論

空間結合符号

  • 途中からついていけなくなった。また悔しい。
  • これは参考になりそうな資料が沢山あるようだ。

Wasserstein幾何とφ-正規分布

  • 手書きカッコイイ。
  • もちろん途中からついていけなくなった。
  • 確率論屋さんにこの話を振ってみたところ、セドリック・ヴィラニ(だったと思う)の話を交えて面白おかしく話してもらえた。

多腕バンディット問題

  • 昔は農地への作付物の選択、新薬、新療法の検証という話は始めて聞いた

招待講演: Current and Future Trends in Computer Vision

  • 過去にこの辺の分野をかすったことがあるので楽しく聞けたように思う。
  • 会場の反響音で、ただでさえ低いヒアリング能力値が削られまくって良くわからない箇所が多かった。スライドがほしいと思った。

4日目:ビッグデータ利用の社会的側面

産業領域におけるデータ活用への期待と現状

情報保護の統計モデル

  • k-匿名化はきつすぎる(という表現をしていたかどうかは覚えてないが)というフレーズだけやたら印象に残ってる。
  • 聞いたこと無い分布がたくさん出てきた。

ゲノムプライバシの保護と個別化医療への展開

  • SNPsの話
  • ゲノムプライバシは個人だけの問題ではないという話
  • なりすまし、冤罪に使われるかもという観点は初めて聞いた
  • 質疑で学習器が個人情報の塊では、みたいな話をされていて、以前似たようなことを考えたことがあったので掘り下げたくなった。

企画セッション4 期外学習のウェブデータ及びマルチメディア活用

大規模言語データに基づく自然言語処理とその応用

クラウドソーシング・デマ・MOOC

  • 構造学習やってる人だと思ってた。
  • クラウドソーシングの品質保証という全く知らなかった分野。
  • 同じような枠組みで様々な話につながっていて興味深かった。
  • ビッグデータ大学

ウェブ上のユーザ行動の分析による消費インテリジェンス

  • ゼクシィが結婚する人の90%が読んでるという話にざわめく
  • 勝敗ネットワークという道具があることを知る。
  • 知識発見らしい事例もあり、夏にビーサンが売れる話っぽい部分もあり。

ポスターセッション

  • IBISの醍醐味(らしい)
  • 議論が白熱している感ある。
  • あっちこっち回ってコメントしまくってきた。
  • 回ったところもメモっておいたけどさすがにここには書けない。
  • 医療を対象にした応用がちらほらあって、大変興味をそそられた(もちろん寄った)
  • YahooはCold Startと戦い続けている。
  • ぐうの音も出ないわ、という感じのポスターが(見た中で)2つあった。すごい。
  • どのポスターも濃かった。

「情報推薦システム入門」読んだ

持ってたし読んでたけど、通読してみた。
結構新しい話もカバーしてるし、レコメンドエンジンこれからやろうって人には全体を見通せるいい本だと思う。というか、これ以上の話って泥臭い現場の話とか運用の話くらいしか残ってないような...
これに加えて、「情報検索の基礎」でも読んどけば満点かも。

ただ、これ読んでスケールするシステム書けるとか、そういうものではない。ここに書かれている内容を実装しても、そこから運用までは結構遠い。内容が低級とか、高度な内容扱ってないとかそういうわけではなくて、それについては軸が違うので別ですよというだけ。
 とにかく、いい本。この手の話に携わっている人は皆持っていて良い。翻訳がたまに変になるのが少し残念。

すごいのみつけた

 以前から、Haskellの遅延評価の枠組みは確率分布のサンプリングとかやるのによさそうだなぁとか思っていたのですよ。

再帰を使うってだけなら、C++とかでも上記の式と同様になるかと思いますが、
いざサンプリングするぞって時に面倒なのが、SBPのtailの方。

僕の場合だと、必要な分だけ確率列を用意して、サンプリング中に必要になる、
そのつど確率変数に値を振っていくという形式のコードです。面倒。

んが、Haskellだと(多分)そのへん自動でやってくれる!すごい!
んじゃないのかな。実際動かしたわけじゃないのでわからないのですが。


そんなこんなで、Haskellでノンパラベイズ周辺のライブラリを書こうと意気込んだその矢先、

すごいのみつけた


しかもコードは、かのHal Daume III御大。


とりあえずオープンソースにして。コミットするから。

ナイーブベイズ再考

 ナイーブベイズは単純ベイズともいうそうな.ナイーブのウムラウトが気になるのかね.


 さて,以前非常に冗長な表現でナイーブベイズを説明しましたが,
今度はシンプルに,実装したときに思ったことなどを.


 昨日は休日だったので,遊びでComplement Naive Bayesも組みました.
こいつは補集合を使うナイーブベイズです.



 さて,ナイーブベイズはこんなposteriorを推定する問題でした.

p(class | \mathbf{words})\propt p(\mathbf{words} | class)p(class)





1.priorをどうしよう


 上の式で言えば,p(class)のところ.他の人たちはどういう設定をしているのか気になった.
軽く調べたところ,実装のためになりそうな記述はあまりありませんでした.

集合知プログラミング

集合知プログラミング

この本には,「簡単だぜジョニー.クラスに属するドキュメント数÷総ドキュメント数さ」
みたくさらっと書かれていたけれど(悪意はないです)


 気に入らん.ドキュメント中の単語数はクラスに大きく依存する可能性もあるのだから,ここは,


クラスに属する単語数÷総単語数


という計算で行いました.比較実験はとくにしていませんので実験的な裏づけは特に無いです.






2.スムージングをどうしよう


 テストデータを,あるクラスに属するかどうか判定するときのお話.
そのクラスでは一度も出現したことの無い単語が現れた場合,確率が0になりますね.
そうすると,テストデータの確率が丸ごと0になりますね.


 これがゼロ頻度問題です.


 そして,そのような頻度ゼロのデータについても
ある程度の確率値を割り当てておくという操作がスムージングです.


 話はわかるのだが,そもそも僕はノンパラベイズの人なので,
ヒューリスティックなスムージングは,通り一遍の手法しか知りません
良い機会なので実装してみました.
参考書は,もう僕のバイブルになっている北さんの確率的言語モデル

言語と計算 (4) 確率的言語モデル

言語と計算 (4) 確率的言語モデル


 とりあえず,加算スムージング法を実装しました.以下説明.


 ある単語がk回出現する場合,普通は確率値を
\frac{k}{n}
と計算するところですが,加算スムージングしたいときは
\frac{k+\alpha}{n + V\alpha}
とします.
Vは総語彙数で,αは実数.


 ナイーブベイズでは,Vをどうするか微妙に悩むところですが,
トレーニングデータとテストデータこれまで出てきた総語彙数でいいと思います.
存在しうるすべての単語にprior(みたいなもの)が乗っていて欲しいところですし.


 αが1のときはラプラススムージングといいます.
それを実数に一般化したのがリッドストーンスムージング,または加算スムージング.
日本では一緒くたにされてラプラススムージングといわれているみたいですね.
http://en.wikipedia.org/wiki/Additive_smoothing


 α値は適当に,0.5あたりで.





3.いろいろモデルがあるぞ


 普通,ナイーブベイズで検索すると出てくるナイーブベイズは,
テストデータに複数同じ単語が出てきた場合,その確率を出てきた回数だけ
掛け算してデータの確率を計算します.


 でも,出た,出ないという情報だけ用いて,
回数については問わないモデルもあるみたいです.


 前者を多項モデル(Multinomial model),
後者を多変数ベルヌーイモデル(Multivariate Bernoulli model)というみたいです.

 直感的には前者の方が性能よさそうですが,僕の実験では大差ありませんでした.
比較した論文によると,語彙数が増えるに従い,多項モデルの方が,
多変数ベルヌーイモデルに比べ性能が高くなるらしいです.


 語彙数の少ないことが明らかな環境では,
計算量的にベルヌーイの方が高速なのでいいかもしれませんね.


 あと,ComplementNaiveBayesモデルは,あるクラス以外のクラスの情報すべてを使い,
そのクラスにデータが属さない確率を計算するだけ.




4.で,何に使おう


 これが一番困った.ひとしきり遊んで,F値計算するルーチンまで書いたけど,どうしよう.


とりあえずテストしたい.何かコーパスはないのか.
探してみると,こんなすばらしいものが.
http://spamassassin.apache.org/publiccorpus/


 easy_spamとhamでトレーニングして,別なeasy_spamとhamで評価してみた.
F=0.9くらい.バグかな.ヘッダ情報とかも乗ってるにしても,良すぎる.


 で,相変わらず,どうしようこれ.ソース公開しても仕方が無いので,とりあえず放置.





 というわけで,なかなか面白かったのですが,やはりスムージングの部分が気に入らなすぎます.
p(class | \mathbf{words})\propt p(\mathbf{words} | class)p(class)


 これって結局Unigram(Bag of words)確率の積をとっているだけだから,
UnigramをDirichlet Process,もしくはPitman-Yor Processで表現したモデルにすることができるし,
そうすればスムージングのあれこれも解決するなぁ.


 あと,Unigramだけでなく一般のn-gramにも拡張できるなぁ.
さらに,どの単語が"効いているのか"の推定とかやっても面白そう.
でもきっと,誰かがやっているんでしょうが…





 その内暇ができたらやります.



 あ,あと役に立った参考文献.
このくらいの話なら論文が一番分かりやすい気がします.
情報の信頼性も高いし.


多項モデル,多変数ベルヌーイモデルについて
http://www.cs.cmu.edu/~knigam/papers/multinomial-aaaiws98.pdf


Complement Naive Bayesについて
http://people.csail.mit.edu/jrennie/papers/icml03-nb.pdf
朱鷺の杜もわかりやすいなぁ
http://ibisforest.org/index.php?complement%20naive%20Bayes


スムージングについては,上で挙げた北さんの本.

中学生にもわかるかもしれないナイーブベイズ

 というわけでナイーブベイズのおさらいを,直感的な説明でしてみます.
厳密な説明は数多あるので,僕の出番はございません.
間違い等沢山あると思いますので,気づいた方はご一報をお願いします.


 ナイーブベイズは,データを分類します.が,今回はテキストを分類する文脈です.
たとえば,今受け取ったメールがスパムメールか,スパムじゃないかを判定(分類)するようなタスクを考えて下さい.
なんだか勘違いが多い気がしますが,ナイーブベイズは2種類に分けるだけじゃなくて,もっと沢山の種類にも分けられます.
スパムメール,彼女からのメール,お仕事のメール,とても人には言えない趣味のメールの4つに分類することも可能です.
ですが単純のため,以下では2種類に分けたい場合のみに焦点を絞りますね.


 分類しますといっても,何も情報が無いのに分類はできません.
そこで,ナイーブベイズでは,あらかじめ分類されたテキストをたくさん用意し,その中の単語を手がかりとして使います.
このような手がかりに使うものを学習用データだとか,学習用コーパスだとか言うのですが,
そんなわけの分からない言葉は使わず,手がかりデータと言っておきましょう.


 基本的なアイデアは簡単.
今,新しいメールが届きました.中身はこんな感じ.

"何時だと思っているの.早く帰ってきなさい.ママより."


コンピュータさんはアホなので,これが大事なメールなのか(スパムじゃない),どうでもいいメールなのか(スパム)分かりません.
そこで手がかりを使います.


スパムであるという手がかり  : "あの有名出会い系サイトが帰ってきた!"
スパムじゃないという手がかり : "今日は早く帰ってくるのよ.ママより"


なんだかスパムじゃない方の手がかりに文章が似ていますね.
コンピュータさんはこう考えます.
「"早く","ママより"という2つの言葉が,新しいメールと,スパムじゃない方の手がかりの両方にあるぞ.
けれど新しいメールと,スパムであるという手がかりに共通な言葉は,"帰って"という1つしかない.
ということは新しいメールが,スパムじゃないって方がそれっぽいな!」


という具合です.なんとなくイメージはつかめますか?本当はもう少し複雑ですが,それはおいおい説明します.




 それでは具体的な説明に移りましょう.
今回は手がかりデータとして,スパムメールがたっぷり入ったフォルダと,そうじゃないメールがたっぷり入ったフォルダを用意します.


 さて,手がかりデータの中身をちょっと考えてみましょう.
テキスト,つまり文章なので,単語の数と語彙(ごい)の数を数えることができますね.
語彙っていうのは単語の種類です.違う種類の単語がどれくらいあるかなということです.
たとえば,

"Lack of money is the root of all evil"

という文では,単語数が9個ですけど,語彙の数は8個ですね.ofが2回出てますね.


 では,先ほど用意した,スパムメールがたっぷり入ったフォルダの中にあるテキストについて,
単語の数を数えてみましょう.それから,語彙の数も数えてみましょう.
同じことを,スパムじゃないフォルダの中身についてもやりましょう.


 スパムフォルダ   : 単語の数がn1,語彙の数がv1
 そうじゃないフォルダ: 単語の数がn2, 語彙の数がv2



 次に,単語の確率というのを考えます.何でもいいので一つの単語について考えてください.
たとえばLoveという単語にしましょう.それでは,スパムフォルダの中で,Loveは何回使われているかを数えて下さい.
ここで,4回使われていたとしましょう.スパムフォルダにある全部の単語の数はn1個で,その中の4つがLoveだから,

「スパムフォルダでは,Loveの確率は4÷n1である」


と言えるでしょう.これをSPAM(Love)とでも書いておきましょう.
同様に,そうじゃないフォルダでは,Loveが2回使われていたとすると,


「そうじゃないフォルダでは,Loveの確率は2÷n2である」


といえますね.これはxSPAM(Love)とでも書きますか.
この確率というのを使って,「っぽさ」を計算するのがナイーブベイズです.



 この辺りで,もうあなたは手がかりマスターです.手がかりについてはとても詳しいので,
それを使って新しいメールを分類してしまいましょう.とにかくやってみましょう.
さて,新しいメールとして,こんなメールがやってきました.

"This is a penguin" (これはペンギンです.)


それぞれの単語の確率を先ほどと同様に計算できると思います.つまり,
スパムフォルダでは,SPAM(This), SPAM(is), SPAM(a), SPAM(penguin)が計算できるし,
そうじゃないフォルダでは,xSPAM(This), xSPAM(is), xSPAM(a), xSPAM(penguin)が計算できますね.


 次に,それっぽさの計算です.
スパムフォルダでのそれぞれの単語の確率を掛け算します.それとは別に,そうじゃないフォルダでの単語も掛け算します.
どちらの結果が大きな数字になりましたか?


 そうです.大きな数字の方が,「それっぽい」方,つまり分類されるべきフォルダなのです.


 と,言いたいところですがもうひとつやらなければいけないことが.
毎日毎日スパムに悩まされているので,スパムフォルダにはすごく沢山メールがあるんだけれど,
友達が少ないのでスパムじゃないフォルダにはほとんどメールが無いような場合を考えてみて下さい.
 スパムフォルダには沢山のメールがあるのだから,当然沢山の単語が詰まっているわけです.
一方スパムじゃないフォルダはちょっとしか単語が入っていない.
そうすると,n1がn2よりもずっと大きくなってしまいますね.これは何だか不公平です.是正しましょう.


 そのため,内容には関係なく,メールが着たらそれがスパムである確率を考えることにします.この計算は簡単で,


メールがスパムである確率 : n1 ÷ (n1 + n2)
メールがスパムじゃない確率: n2 ÷ (n1 + n2)


つまり,スパムフォルダの中にある全部の単語と,そうじゃないフォルダの中にある全部の単語がどれくらいの比率に
なっているかを考えてあげるのです.
そして,先ほど掛け算で計算したスパムフォルダっぽさの確率に,メールがスパムである確率,
そうじゃないフォルダっぽさの確率に,メールがスパムじゃない確率をそれぞれかけてやって,比べてみます.


 そうすると,不公平の無い,清く正しいナイーブベイズの出来上がりです.


 何だか色々なところをざっくりとやってしまいましたが,こんな風にナイーブベイズは計算していますよ,と.


 図とか入れて,本腰入れてで分かりやすくしようかなとも思ったのですが,
何だか当初の予定から大幅に軌道がそれてきているので,やめます.でもその内そういうことやりたいなぁ.



 というわけで,次回はスムージングとかの話でもしましょうか.