共起行列の作成 scipy.sparse.coo_matrix

単語の共起行列をコーパスから作成する手順を紹介する.共起行列はスパースなので,scipy.sparse.coo_matrixを使って実装する.これにより大幅にメモリを削減できる.なお,英語以外のコーパスの使用を考えて文字列は全てUnicodeで処理する.

こんな感じになりました.一応,共起行列の行と列が何を指しているのか知りたいと思うのでvocaburaryも返しています.tokenizerは実装して渡してあげてください.generatorでかまわないです.window_sizeは普通乱数を足したり引いたりすると思うのでそれはお任せします.

Gistで載せたコード,綺麗だ〜〜〜〜.

word2vecの欠点

最近流行っているword2vec.使ってみました.感想は「おお,なんかすごい」というものです.

分布説というものがあるらしい.これは「単語の意味はその周辺単語で決まる」というもの.word2vecもこの考えにいくらか従っているんだと思う.word2vecの詳細を読んでないので知らないけど.

word2vecの欠点だと思うのはtransductiveだということ.つまり,コーパスに出現しなかった単語のベクトル表現は得られない.あと,これはunsupervisedの宿命なのだが,欲しいベクトル表現が簡単には得られないということもある.普通はある程度supervisionを入れてsemi-supervisedで学習する,なんてことを試みるのが現実的だが,word2vecのsemi-supervised版はまだない(僕の知るかぎりでは).じゃあ欲しいベクトル表現を得るにはどうしたらいいか.欲しいっていうのはアプリケーションに依存するのでそれをまず決めて,コーパスを探す→学習をやりながらパラメータを決めていくんだと思う.でも,学習に死ぬほど時間がかかる.企業みたいに化け物マシンがあれば話は別だけど,普通そんなものはない.

次に単語間の類似度だけが欲しい場合.ベクトル表現を得るのは類似度を得るより一般的な問題だと言える.なぜならベクトル表現がわかればコサイン類似度などが計算できるが,類似度がわかってもベクトル表現はわからないからだ.一般的な問題は限定的な問題より解くのが難しい場合が多い.類似度だけ欲しい場合は,距離学習,特に半教師付き距離学習をおすすめする(個人的には).

でもword2vecがすごいことには違いない.最近は半教師付き学習がかなり実用的なことを身をもって知ったので,僕的には半教師版が早く出て欲しいなあと思っている.

– http://www.slideshare.net/bollegala/ss-39065162

オンライン機械学習を買いました

機械学習プロフェッショナルシリーズのオンライン機械学習を買いました.

– オンライン機械学習 (機械学習プロフェッショナルシリーズ)

さらさらっと4章まで読みました.だいぶ読めるようになっている自分に驚きを感じました.

印象はいい感じ.特に4.1章.オンライン学習の基礎となるアルゴリズムが紹介されている.ここのアイデアを日本語で知れるというだけでも買う価値があるかも.

個人的にはAROWやSCWの元になったであろうアイデア,Confidence Weighted Learning (CW) が重要な気がしている.これ,理解するのしんどいかも.なんとなくはわかるが深くはわからない,いつもの感じ.

オンライン学習で特に気をつけないといけないのが,ノイズ.今までうまくいっていたのに,たったひとつのノイズのせいで学習結果がめちゃくちゃになる,というのを避けたい.だから正則化を加える.基本的には今の解からそんなに離れないように正則化を加える.この考えをさらに発展させると,自信のないパラメータの次元に対しては積極的に学習するように,自信があるなら消極的に学習するようにさせたい.自信のある,ないは,推定したパラメータの分散(共分散行列)を求めればよい.これはアルゴリズム(ロス)によっては求めることが可能.ここで,平均が今のパラメータで分散共分散行列がそのパラメータの分散共分散である正規分布の確率密度関数を考える.これと近い正規分布を次のステップで求めるのだが,ここが謎.わかったらまた書きます(とかいうと書かない不思議).

とりあえずこれはいい買い物をしたと思う.深層学習も買いたいなあ.

ベイズ推定 (Bayesian Inference)

今更ながら,”きちんと”ベイズ推定について勉強してみた.ここで書く内容?記法?はよく見られるものとは少し違ったものになっているので注意してください.

あるデータが得られて,そのデータがある確率密度関数p(x)を持つ確率分布に従うとする.

この確率密度関数はいくつかのパラメータ\thetaを持つはずである.これをp(x;\theta)と表現する.例えば,正規分布なら平均\muと分散共分散行列\Sigmaとすると\theta=\{\mu,\Sigma\}である.通常\thetaは確率変数ではなく普通の変数として扱われる.しかし,ベイズ推定ではこれを確率変数として扱う.そうするとデータが従う確率分布の確率密度関数はp(x|\theta)と書かれる(;は関数としてのパラメータで,|はそれが確率変数であることを示す.個人的な好み),そして,パラメータ\thetaもある確率分布に従い(事前分布と呼ばれる),その確率密度関数をp(\theta;\alpha)と書く.ここで,\alphaは確率変数ではないことに注意.個人的には”;”と”|”を区別すればうまい具合に理解できる気がしている.これからは面倒なのでp(\theta;\alpha)p(\theta)と書く(\alphaは確率変数ではないとして).

さて,このパラメータ\thetaをデータ\{x_i\}^n_{i=1}から推定することを考える.まずは通常の最尤推定を復習する.データを並べて行列にしたものを計画行列と呼びX=[x_1|\cdots|x_n]と書く.今,\thetaが確率変数ではないとする.最尤推定では与えられたデータが生成される確率(尤度と呼ばれる)を最大化するパラメータ\thetaを求める.これは以下の最適化問題を解くことと等価である,

\max_{\theta} p(X;\theta)

となる.ここで,各サンプルは独立に同一の分布から生成されたという仮定(i.i.d.と呼ばれる)を置くと,p(X;\theta) = \prod^n_{i=1} p(x_i;\theta)となる.さらに対数をとっても最適解は変わらないことから最尤推定では最終的に以下の最適化問題を解く.

\max_{\theta} \sum^n_{i=1} \log p(x_i;\theta)

ベイズ推定ではパラメータ\thetaは確率変数である.そこで,MAP推定と呼ばれる枠組みを使う.MAP推定は事後確率p(\theta|X)を最大化するパラメータ\thetaを求める.これの解釈は非常に難しい.上の推定を見ると与えられたデータが生成されやすいパラメータ\thetaを求めている.ある確率分布からデータは生成されるんだけど,推定するときはデータからパラメータは生成される.つまり与えられたデータから生成されやすいパラメータを求めればよい.というわけでp(\theta|X)を最大化しよう,となる.しかしながら今,パラメータ\thetaは確率変数であり,p(\theta)を確率密度関数に持つ確率分布から生成されている.よって, p(\theta|X)を最大化するパラメータ\thetaを求めよう,となる.

事後確率を変形してみる.

p(\theta|X) = \frac{p(\theta,X)}{p(X)} \propto p(X|\theta)p(\theta)

途中の分母p(X)はは\thetaに関係ない項なので最終的に,p(X|\theta)p(\theta)という尤度関数×事前確率という関数を最大化する.

最尤推定と比較すると,事前確率をかけるかかけないかが大きな違いとなっている.つまり,ベイズ推定ではこのように事前知識を入れることができ,それが大きなメリット(デメリットでもある?)となっている.

自分なりに解釈できたのでよしとしよう.