[NLP][機械学習] 言語モデル覚え書き
この文章について
最近言語モデル方面にも少し興味があるので自分の知識を整理する意味で書いてみた。NLPは専門ではないので、おかしなことを書いてある可能性がありますがその場合はご指摘ください。
本文章ではn-gramモデル、単語の出現確率がn-1個前の単語のみに依存するモデルを考える。
問題
who is * という文が与えられたときに*にくる文字の確率を求めることを考える。この場合だと*には例えばheが当てはまるかもしれないが, isが入ることはまずなさそうに思える。このことは文法的にも説明ができると思うが、文法のルールを作るのは大変だし、文法的に正しい単語の中でどれが出やすいかということはできない。
一方で機械学習を使った言語モデルの文脈では文法的知識を余り持たず、与えられたコーパスから自動的に出やすい単語/表現を学習する方針をとる。
最尤推定
一番簡単なモデルとしては最尤推定を使うもので、たとえばコーパスの中にwho isの後にsheが6回、heが4回出ていたとすると
p(he|who is)=6/10, p(she|who is)=4/10
と推定する方法である。しかしながらこれだとコーパスに出てこなかった単語の確率は全て0になるという問題がある。
出現しなかった単語の確率が0になるのを防ぐだけであれば出現しなかった単語の出現回数に対して一律な数を加えることによって防げるが、これだとコーパス上でこの文脈で出現しなかった単語の確率は全ておなじということになり予測性能は悪い。
Dirichlet smoothing
そこでwho isの後に出現しなかった単語についてはより低次のn-gram、すなわちisの後に出現する単語の確率を考えるとよさそうに思える。
例えばxyzという列があったときに
p(z|xy)=(c(xyz)+αp(z|y))/(c(xy∗)+α)
と計算する、ここでc(・)は頻度を表す。
ノンパラを分かる人に説明するとこれはCRPとしてみなせて各テーブルに座っている人の数が単語頻度に相当して、集中度パラメータに応じた確率で新規テーブルを生成するのですがそこで選ばれる単語の確率分布がn-1gramの確率分布を使っているということです。
上の例を使うと各単語の出現確率は次のように書けます。
p(he|who is)=(6+\alpha p(he | is))/(10 + \alpha), p(she|who is)=(4 + \alpha p(she| is) /(10 + \alpha) p(w |who is)=(\alpha p(w | is))/ (10 + \alpha)
Kneser-Ney smoothing
上のDirichlet smoothingでは\alphaが小さいときに\alpha/(10+\alpha)というのがものすごく小さい値となるので頻度をある程度おさえるというのがKneser-Ney smootingです。例によってxyzという列が与えられた場合
p(z|xy)=(c(xyz)−d)/c(xy∗)+(d|xy∗|/c(xy∗))p(z|y)
となります。ここで|xy*|はxyに続く文字列の種類数です。追記(4/15):上の式のカッコが抜けてたので修正しました。
たとえば上の例ではwho isに続く文字種はhe/sheなので2となり、例えばd=0.5とすると
p(he|who is) =(6 - 0.5)/ 10 + p(he | is) / 10 p(she|who is)=(4 - 0.5)/ 10 + p(she | is) / 10 p(w |who is)= p(w | is) / 10
d |xy*| / c(xy*)の確率でn-1グラム文脈から単語が生起されることがわかり、これはDirichlet smoothingが\alpha / (c(xy*)+\alpha)の確率でn-1グラム文脈から単語を生起してたのと比較するとn-1グラム文脈の重みが強くなっていることが分かる。
Hierarchical Pitman-Yor Processes Language Model
これはちょっとうまく説明できないので雰囲気だけ述べると、上のKneser-Ney smoothingでは頻度1000の単語も頻度1の単語も同じディスカウント係数dを用いているがHPYLMでは文脈と単語に応じてディスカウント係数が違ってくる。これについては文脈(レストラン)において単語(料理)の頻度(客)が高い状況においてはその単語に関するテーブルの数が多くなり、その分ディスカウント係数が多くなるということが導かれる。
Further Topics
今who is *に来る単語に関しては2gram前、1gram前の単語しか考慮していないが、例えばwhere is *で出現する単語についても考えるとwhoとwhereは同じような機能を持つ単語のため精度が向上する可能性がある。これを表現するのに単語一つ一つに潜在語を考えるlwlmのようなモデルが役に立つ。
また、一段落前の文からwho is *の後に来る単語が一意に決まる可能性もあり、長距離の単語履歴を使えるモデルについてもそのうち調べようと思っている。