単語の出現確率の最尤推定

概要
単語の出現確率の最尤推定をどうやるかについての記述。

はじめに

自然言語を扱う際、様々な状況で単語の出現確率を求める必要が出てくる。単語の出現確率を求める単純な方法としては、注目している単語がコーパス中に出てきた回数をコーパスの総語数で割るというものがある。例えば、1万語のコーパスの中で、300回出現した単語は、300/10000 = 0.03、すなわち3%の出現確率であると求めることができる。出現回数をコーパスの総語数で割るというのは、直観には合致している。しかし、直観が常に正しいとは限らない。この出現確率の求め方が本当に良い推定になっているのかを数学的に示すことができればそれに越したことはない。実は、この出現回数をコーパスの総語数で割ることで、出現確率を求めるのは、最尤推定と呼ばれる推定の結果と一致している。このことを示そう。

単語の出現確率を求める必要性

自然言語処理の中で、単語 [1] の出現確率が分かっていると得をする場合は少なくない。例えば、仮名漢字変換をするときに、出現確率の高いものを優先的な候補にした方が便利である。例えば、「とけい」を変換したときに、「徒刑」が最初に出てくる仮名漢字変換システムは不便である。それよりも、「時計」が最初の候補として出てきた方が便利である。これは、「時計」の方が「徒刑」よりよく使う(=出現確率が高い)ためだ。もちろん、文脈によっては「時計」でなく「徒刑」が出てきた方が都合が良い例もあるが、一般論としては出現確率の高い「時計」が出てきた方がうれしい。

「時計」と「徒刑」がどちらが出現確率が高いかは、人間ならば何となく想像が付く。しかし、計算機にとってはデータがなければまったく分からないのである。

このため、何らかの言語データを計算機に与えることで、単語の出現確率を学ばせる必要が出てくる。

準備

最尤推定を行うときに分かりやすくするために、いくつか準備をしておこう。

定義

$n$ 個の単語からなるコーパス C を考え、これを学習用データとする。コーパス C は単語のベクトルと見なすことができる。すなわち、

\[ C = (x_{1}, x_{2}, x_{3}, \dots, x_{n}) \]

のように表現できる。出現確率を求めたい単語 $w$ に対して、$x_{i} = w$ ならば $X_{i} = 1$ とし、$x_{i} \ne w$ ならば $X_{i} = 0$ とおく。ただし、 $i$ は、$1 \leq i \leq n$ を満たす整数である。こうすると、

\[ C_{w} = (X_{1}, X_{2}, X_{3}, \dots, X_{n}) \]

が得られる。

例えば、“The cat chased the rat” という文だけから成り立つコーパスならば、

$C$ = (the, cat, chased, the, rat) [2]

となり、出現確率を求めたい単語を “the” とすると、

\[ C_{w} = (1, 0, 0, 1, 0) \]

となる。要するに、コーパスの中で、注目している単語 [3] が出現するところは 1 となり、出現しないところは 0 となるわけである。

確率分布の設定

ここで、推定するに当たり、注目している単語の出現がどのような確率分布に支配されているかを考えなくてはならない。ここでは、注目している単語 $w$ が出現するかどうかは、二項分布に従うと考える。すなわち、$X_{1}, X_{2}, X_{3}, \dots, X_{n}$ は独立 [4] に同一の二項分布 $\textrm{B}(1, p)$ に従うものと考える。この $p$ こそが、単語の出現確率のことなのだ。

ここで、$p$ の値が不明なので、これを最尤推定することが目的となる。

最尤推定

あとは、実際に計算を続けることで、$p$ の値の最尤推定をしていく。以下、数式の羅列が続くので、分からないという人は読み飛ばしても構わない。

さて、$C_{w}$ の生起確率はどのように計算できるだろうか。先に述べたように、$X_{1}, X_{2}, X_{3}, \dots, X_{n}$ は、独立に同一の分布に従っているので、$X_{1}$ の確率、$X_{2}$ の確率、$X_{3}$ の確率、…、$X_{n}$ の確率を掛け合わせたものになる [5]

つまり、$C_{w}$ の生起確率 $P(C_{w} | p )$ 、すなわち $P(X_{1}, X_{2}, X_{3}, \dots, X_{n} | p)$ は、$X_{1}$ の確率 $P(X_{1} | p)$ などを用いて、

\[ P(X_{1}, X_{2}, X_{3}, \dots, X_{n} | p) = P(X_{1} | p) P(X_{2} | p) P(X_{3} | p) \dots P(X_{n} | p) \]

のように表すことができる。また、$X_{1}, X_{2}, X_{3}, \dots, X_{n}$ が、二項分布 $\textrm{B}(1, p)$ に従っているため、$P(X_{i} | p) = p^{X_{i}} (1-p)^{1-X_{i}}$ となる。よって、

\begin{eqnarray} P(C_{w}) &=& P(X_{1}, X_{2}, X_{3}, \dots, X_{n} | p) \\ &=& \prod_{i=1}^{n} p^{X_{i}} (1-p)^{1-X_{i}} \end{eqnarray}

となる。この $P(X_{1}, X_{2}, X_{3}, \dots, X_{n} | p)$ は大きければ大きいほどうれしい。最尤推定の考え方では、確率が最大になるところが、もっとも良い推定であると考えるからである。だから、これを最大化する値を見つければ良い。

さて、コーパスが与えられている以上、$X_{1}, X_{2}, X_{3}, \dots, X_{n}$ は既知である。これに対し、二項分布のパラメータ $p$ は未知である。こういった場合、既知のものと未知のものを入れ替えるということがしばしば行われる。つまり、変数とパラメータを置き換えて、$P(p | X_{1}, X_{2}, X_{3}, \dots, X_{n})$ とする。この$P(p | X_{1}, X_{2}, X_{3}, \dots, X_{n})$ を最大化する $p$ を求めるのが目的になる [6] 。これを式で表すと、

\[ \max P(p | X_{1}, X_{2}, X_{3}, \dots, X_{n}) \\ = \max \prod_{i=1}^{n} p^{X_{i}} (1-p)^{1-X_{i}} \]

のようになる。

このままでは、最大化問題を解きづらいので、自然対数をとり [7] 、以下のように、

\begin{eqnarray} L &=& \log \left[ \prod_{i=1}^{n} p^{X_{i}} (1-p)^{1-X_{i}} \right] \\ &=& \sum_{i=1}^{n} \left[ X_{i} \log p + (1 -X_{i}) \log(1-p) \right] \end{eqnarray}

なる対数尤度函数 $L$ を設定する。

ここで、$L$ の最大値を求めるには、$L$ の導関数 $L’$ の値が 0 になるところを求めれば良い [8] 。$L$ を微分すると、

\begin{eqnarray} L’ &=& \sum_{i=1}^{n} \frac{X_{i}}{p} – \sum_{i=1}^{n} \frac{1-X_{i}}{1-p} \\ &=& \frac{1}{p} \sum_{i=1}^{n} X_{i} – \frac{1}{1-p} \left( n – \sum_{i=1}^{n} X_{i} \right) \end{eqnarray}

となる。$L’ = 0$ となるところを求めれば良いので、

\[ \frac{1}{p} \sum_{i=1}^{n} X_{i} – \frac{1}{1-p} \sum_{i=1}^{n} \left( n – \sum_{i=1}^{n} X_{i} \right) = 0 \]

という方程式を解けば良い。両辺に $p(1-p)$ を乗じて整理すると、

\begin{eqnarray} (1-p) \sum_{i=1}^{n} X_{i} – p \left( n – \sum_{i=1}^{n} X_{i} \right) &=& 0 \\ \sum_{i=1}^{n} X_{i} – p \sum_{i=1}^{n} X_{i} – pn + p \sum_{i=1}^{n} X_{i} &=& 0 \\ \sum_{i=1}^{n} X_{i} &=& pn \\ p &=& \frac{\sum_{i=1}^{n} X_{i}}{n} \end{eqnarray}

のように、$p$ の解が求まる。

よって、着目している単語 $w$ がコーパス中に出てきた回数 $\sum_{i=1}^{n} X_{i}$ をコーパスの語数 $n$ で割ったものが最尤推定量となることが分かった。

ここでの最尤推定量の問題点

出現回数をコーパスの総語数で割ることで、出現確率を求めるというのは、道理にかなっているように見えるが、実際には問題がある。

例えば、あるコーパスが、“I have a pen” という文だけから成り立っているとしよう。そして、このコーパスから、“you”の出現確率を推定することを考えてみよう。このコーパスには“you”は一回も出現していない。言い換えると、“you”は0回だけ出現したということになり、その出現確率の最尤推定は、0/4= 0となる。つまり、“you”の出現確率は0で、0 ということは“you”は英語に永遠に出現しないということになる。これは明らかにまずい。

結局、最尤推定の場合、学習データであるコーパスに一度も出現しなかった単語は、確率0と推定されてしまうのである。今の例は、総語数がたったの4語と極端に小さいコーパスだったが、総語数が非常に多いコーパスでも、すべての想定しうる単語を網羅することは難しいので、同様の問題が起こる可能性がある。なお、コーパスにある単語が1度も出現しないことで色々と困ることを専門的にはゼロ頻度問題と呼ぶ。

このような問題を防ぐ対策としては、今まで見てきたような最尤推定を使うのではなく、最大事後確率推定など他の推定手法を使うというものがある。

また、上記で確率分布を設定したときに、$X_{1}, X_{2}, X_{3}, \dots, X_{n}$ は独立に同一の二項分布 $\textrm{B}(1, p)$ に従うと述べた。しかし、ここの独立というのは大嘘である。普通、同じ単語を2つ続けて言うことはない。このため、注目している単語が直前に出てきた場合、その直後ではその単語の出現確率が0に極めて近づく。つまり、直前に出てきたかどうかによって、出現確率が左右されてしまうということである。本当に独立ならば、前に出てきたものには左右されない。このため、独立だという仮定は、言語データにはろくに当てはまらないのである。

脚注
  1. 「単語」の出現確率と書いたが、別に単語でなくても良い。文字の出現確率でも同様の話ができる。 []
  2. 大文字と小文字の違いは無視する。 []
  3. ここでは “the” が注目している単語 []
  4. あとで述べるように、ここで「独立」と仮定することは、現実にまったく合致していない。 []
  5. 確率の積の法則から、独立である場合は単純に確率を掛け算していけば良い。 []
  6. $p$ を最大化するのではない。$P(p | X_{1}, X_{2}, X_{3}, \dots, X_{n})$ が最大となるときの、$p$ を求めようとしているのである。 []
  7. 最大化問題で、目的函数の対数を取るのは常套手段。 []
  8. 一般に、導関数の値が 0 になるところは元々の函数が極大値や極小値になるところである可能性が高い。 []