分類問題
- 何らかの入力に対してラベルをつける問題
- 予測問題とも言う
- 2値分類:ラベル=○or×
- スパムフィルター
- 顔認識
- 多値分類=有限集合
- テキスト分類
- 天気予報:ラベル={晴れ・雨・曇り}
- 出身県を当てる:ラベル={北海道・青森県}
- 音声認識・画像認識・株価予測・医療診断・遺伝子診断・タンバク質機能予測・検索・言語理解
- 世の中のほとんどの「知能システム」は分類器といっても過言でない
確率による分類
- 入力x、出力y
- 確率を使って分類する
- 入力に対して条件付き確率が一番高いラベルを出力
- y = argmaxy p(y|x)
- スパムフィルTーの場合
- x: メール
- y: スパムorスパムでない
- p(スパム|x)>p(スパムでない|x)ー>xはスパム
- 簡単に実装できるが性能が高い
ナイーブベイズ分類器
- 入力xを特徴ベクトルf(x)= <f1(x), ///, fn(x)>で表す
- 様々な特徴fi(x)とyの関係(条件付き確率)からラベルyを予測する
- p(y|x) = p(y|f(x))
= p(y|f1, f2, ///, fn)
= p(y)p(f1, f2, ///, fn|y) / p(f1, f2,///, fn)(ベイズの定理)
∝p(y)p(f1, f2, ///, fn)(分母はyによらない(いまはp(y|x)が最大となるyを求めたいので分母は関係ない))
≒p(y)Πp(fi|y)(各特徴は独立と仮定)
例:スパムフィルター
- ベイジアンフィルターとも呼ばれる
- 電子メールをスパムかそうでないかに分類したい(2値分類)
- まず、各メールにどういう単語が出てきているかに注目する = 特徴ベクトルを決める
- ロレックス・出会い・授業、・・・
- 各単語がメールに出てくるかどうかを特徴ベクトルにする。
特徴ベクトル
- メール文の例が3つ出てた。
特徴ベクトル
- 自称xの「様々な特徴」を特徴ベクトル(素性ベクトル) f(X)で表す。
- 各要素が各特徴を表す
- xがその特徴をもっているなら1
- さもなくば0
- これにより、現実世界の様々なものを数学の世界にもっていく
- 統計的機械学習の常套手段
ナイーブベイズ分類器の 学習
- 学習データからp(y)とp(fi|y)を求めれば良い
- p(y|x)∝p(y)Πp(fi(x)|y)
- p(スパム) = 2/3, p(スパムでない)=1/3
- p(新品|スパム)=1/2、p(ロレックス|スパム)=1/2・・・みたいなのを統計で求める
ナイーブベイズ分類器の限界
- すべての特徴が条件つき独立であると仮定している
- 実際には特徴間にも関係がある場合がある。
不確実な因果関係の連鎖
- 風が吹けば桶屋が儲かる
- あるA商事の社長
- 業績が上がる -> ごきげんになる
- 競馬でかつ -> ごきげんになる
- ごきげんになる -> ボーナスを出す
- ごきげんになる -> ごちそうしてくれる
- 社長がボーナスを出してくれたとき、業績が上がったか分かる?
ベイジアンネットワーク
- 因果関係をあらわしたグラフ
- ノード:確率変数
- エッジ:条件付き確率
- 完全結合分布を条件付き独立性で分解して表現
- 図は手書き
ベイジアンネットワーク
- 各ノードが確率変数を表し、確率変数の依存関係を有向エッジであらわしたグラフ
- 各ノードは親ノードで条件付けされた確率分布を持つ
- p(X|Parent(X))
- グラフはループをふくまない。要はDAG
- ある確率変数の値を与えたとき(観測事象)、他の確率変数(質問変数)の事後確率分布を求める
- p(X|e) ∝ p(X, e) = Σy p(X, e, Y)
- 2ページ前の図
ベイジアンネットワークの推論手法
- 厳密推論
- 変数消去
- 確率伝播法
- 人事推論
- ループ(というかダイヤモンド?)あり確率伝播法
- マルコフ連鎖モンテカルロ法
- ネットワークが木構造のときは、動的計画法で線形時間の推論が可能
- 因果関係や相関関係をグラフで表現した確率モデル
- ベイジアンネットWー空く=有向グラフ+条件付き確率
- マルコフ確率場=無効グラフ+ログ線形モデル
- 条件付き確率ではなく、事象間の関係性の強さ(重み)で全体の確率が決まる
- ベイジアンネットワークと類似の推論しゅ方が使える
- 言語処理や画像認識など、複雑なものにも使われる
- 大規模なグラフでも高速な推論ができるツールが開発されている。実用化されている
- 医療診断
- 対話システム
- ロボット制御
- 最近ではより一般的なマルコフ確率場や学習が簡単な線形分類木がよく使われる
- 次の単語を予測する問題
- ひろしがごはんをXXX
- 単語列の源吾らしさを測る問題
- ひろしがごはんをたべる
- ひろしたべるがごはんを
- いろいろなアプリケーションで使われる
- 音声認識
- OCR
- 仮名漢字変換
かな漢字変換
- きしゃがきしゃできしゃした=>どんな変換が一番日本語らしいか=>記者が汽車で帰社した
- 単語列の言語らしさを確率で表す
- P(w[n]| w[1], w[2], ・・・, w[n-1])
- P(w[1], w[2], ・・・, w[n-1], w[n])
- 学習データ=実際のテキストから確率を推定
Nグラムモデル
- 直前のn-1単語にのみ依存して、次の単語の確率が決まる。
- それ以前の単語が異なるものはすべて同値類としてまとめる
- n語以上の単語は関係ないと仮定
Nグラムモデルのパラメータ数
- 単語数10,000とすると
- 2グラムモデル パラメータ数=1億
- 3グラムモデル パラメータ数=1兆
- 4グラムモデル パラエータ数=1京
- 安易にnを増やすわけにはいかない
うまく学習する方法
- なるべく小さいn
- Bigram, trigramが使われることが多い
- 次の単語を直前の1~2単語で予測するというのは意味がなさそうだが、実際にはそこそこうまくいく
- なるべく小さい単語数
- 単語の字面そのままではなく、互換や意味クラスを使う
- なるべく大きい学習データをつかう
- WEB
- 学習データの出現回数を全体の数で割る
- 学習データに「とてもおいしい」という文字列が10回現れ、そのうち6回「ケーキ」3回「ごはん」1回「青汁」とかだったり
- 言語モデルの推定には不適切
- とてもおいしいのあとにラーメンや林檎などいろいろな単語が器売るが、学習データにないため確率0になってしまう
- たまたま出てきた青汁の確率がおおきくなってしまう
- 何らかの方法で、見たことがない単語列の確率を推定する必要がある。
- 非常に多く出てくる単語の滅多に出てこない単語がある
- the, a, of, in, ・・・
- 大きな学習データがあっても、出てこない単語がたくさんある(ロングテール)ー>いくらデータがあっても足りない
- 自然言語のテキストに置いて、単語の頻度と、頻度順に並べたときの順位は、反比例の関係に∃。
- もっともたくさん現れる単語は、2番目にたくさん現れる単語よりも2倍の頻度で現れる
- 自然言語のテキスト以外でも、このような性質は様々なデータで現れる。
- 確率0の事象に確率値をちょっとずつ分け与える
- たまたま出てきた事象は確率値が高めに推定されているはず
- 未観測の事象は確率0ではないはず
- 確率を足したら1になるように
- どういうふうに分け与えたらいいか?
- アドホックなやり方に見えるが、理論的な背景もある。