機械学習を用いた最尤推定の考え方についてまとめてみました。

機械学習で最尤推定【初心者向け】

機械学習で平均・分散を出力したいと調べると最尤推定というものにたどり着きました。勉強していくと、難しい数式ばかりで、とっかかりにくかったのが印象的です。

そのため、この記事では例や図を使いながら、なるべくイメージしやすいように解説していきたいと思います。

回帰モデルと確率モデル

写真から物体の重さを予測する例を考えます。

回帰モデル

入力画像から値を直接推定するような機械学習を回帰モデルといいます。

regression_model

たくさんの訓練データを用意すれば、ある程度は重さ推定できるようになるでしょう。

しかし、重さを推定するにあたって、上図の段ボールのような物体の重さ推定は難しいと予想されます。なぜなら、段ボールなどは、中身によって重さが大きく左右され、画像からでは推定しづらいからです。

回帰モデルでは、このような不確かさの大きいサンプルに対しても、何らかの値を出力してしまいます。

確率モデル

一方で、機械学習には、平均・分散を出力する確率モデルというものがあります。分散を出力することで、予測の不確かさを表現します。

このような機械学習は、最尤推定という考え方に基づくことで実現できます。

最尤推定とは

統計学において、与えられたデータからそれが従う確率分布の母数を点推定する方法である。(Wikipediaより)

パッと読んだだけではイメージがつかないですよね。以下で例を使いながら嚙み砕いていきます。

例:サイコロの表裏(離散確率分布)

Q.あるコインを10回投げて「表」が2回出たとき、このコインが「表」を出す確率は?
A.最尤推定:2/10 = 20%
(真の確率は神のみぞ知る)

真の確率はこんなに低い(20%)でしょうか?

コインの歪みや材料の偏りによって左右されるとは思いますが、感覚的には「表」が出る確率はもう少し高いように予想できます。

しかし、真の確率は神のみぞ知る値です。そのため、私たちは与えられている「10回投げて「表」が2回出た」という情報のみから予測するしかありません。

この考え方が最尤推定です。

まとめると...

最尤推定 = 与えられた現象から真の特性を予測

現象 → 特性(確率)

連続確率分布での最尤推定

上記のコインの例では、離散確率分布(表or裏)を考えました。

一方で連続確率分布の問題を考える場合は、確率密度関数を最大化することで、最尤推定を行います。

例:ボールの飛距離(連続確率分布)

Q.あるボールを10回投げたときの飛距離が下図の「↓」ようなとき、このボールの飛距離の確率分布は?

flying_distance_samples

「確率分布は?」を「次の11回目の飛距離予測は?」と置き換えると分かりやすいかもしれません。

連続確率分布の最尤推定では、サンプル(10回の飛距離データ)に対する確率密度を最大化するような分布を推定結果とします。

確率密度とは

ある確率分布が与えられたときに、ある値を取る確率を確率密度と呼びます。つまり、その値の出やすさを表している言えます。

※厳密には「確率」と「確率密度」は別物です。

probability_density

これを踏まえると、10回の飛距離データに対する確率密度を最大化する分布は下図のようになるでしょう。

max_probability_density

飛距離データが正規分布に従うと仮定すると、確率密度関数は以下の通りです。kは変数の次元であり、今回の例では変数は飛距離の1次元だけなので、\(k=1\)です。

\[ P(\boldsymbol{x} | \boldsymbol{\mu}, \boldsymbol{\Sigma}) = \frac{ \exp(-\frac{ 1 }{ 2 }(\boldsymbol{x} - \boldsymbol{\mu})^\mathrm{T} \Sigma^{-1} (\boldsymbol{x} - \boldsymbol{\mu})) }{ \sqrt{(2 \pi)^k |\boldsymbol{\Sigma}|} } ,\quad k = \mathrm{rank}(\boldsymbol{\Sigma}) \]

ちなみに、\(k>1\)のときは、多変量正規分布(1次元の正規分布を高次元へと一般化した確率分布)と呼び名が変わるようです。

機械学習での最尤推定

さて、機械学習では最尤推定をどう実現すればいいんでしょうか。以下で見ていきましょう。

例:画像から重さ推定

冒頭で挙げた「写真から物体の重さを予測する例」に戻ります。

正解データ(ラベル)

下図のような正解(訓練)データが得られたとします。

サッカーボールは、どのボール(a~c社)でも、だいたい同じような重さです。一方で、ギフトボックス(g、h社)は、中身によって重さが左右されます。

weight_samples

予測

未知のx社のサッカーボール、自動車、ギフトボックスが与えられたとき、理想的には下図のように出力してほしいでしょう。

mle_model
weight_prediction

重さのバラつきの小さいサッカーボールに対しては小さい分散、バラつきの大きいギフトボックスに対しては大きい分散を出力していれば理想的でしょう。

損失関数

上図のように出力できるように学習させるために、正解(訓練)データに対する確率密度を最大化するような損失関数を設定します。

\(n\)個の訓練データに対する確率密度の合計は、

\[ P_\mathrm{total} = \prod_{i=0}^n P(\boldsymbol{x}_{\mathbf{label}_i} | \boldsymbol{\mu}_i, \boldsymbol{\Sigma}_i) \]

ここで、自然対数が単調増加関数であるので、「確率密度の最大化 ⇔ log(確率密度)の最大化」と置き換えることができます。

\[ P_\mathrm{log_{total}} = \sum_{i=0}^n \ln{P(\boldsymbol{x}_{\mathbf{label}_i} | \boldsymbol{\mu}_i, \boldsymbol{\Sigma}_i)} \]

このテクニックはよく使われるもので、自然対数を取ることで、

  • 小数の積による勾配消失をふせげる
  • 積→和になり勾配計算のコストを減らせる

などのメリットがあります。

最後に、マイナスをとることで、「log(確率密度)の最大化 ⇔ -log(確率密度)の最小化」と置き換えて損失関数になります。

\[ f_{(\boldsymbol{w})} = -P_\mathrm{log_{total}} \]

この損失関数の値が小さくなるように重みパラメータ\(w\)を更新することで学習させていきます。

十分な量の訓練データに対してこの損失関数で学習させることで、似たような入力画像に対して似たような確率分布を出力できるようになるでしょう。

さいごに

最尤推定の考え方、機械学習での最尤推定の実現方法、損失関数をまとめました。参考になれば幸いです。


以上です。

PyTorchでの実装はコチラ

【PyTorch】最尤推定の損失関数

Ad.