ロジスティック回帰と、そこで出てくる尤度関数について理解する

私は高校では数ⅡＢまでしか学んでいない、どこにでもいる文系のSEなのですが、無謀にも機械学習を数学の基本理論から学んでいます。

ロジスティック回帰について学んでいるとき、尤度関数という、いかにも文系泣かせの用語が登場しました。調べても調べてもピンとくるような解説になかなか出会えませんでしたが、頭を悩ませているうちに自分なりに本質的なところは理解できた感覚がしますので、メモしておきます。

こちらに記載した本質的な内容を頭に入れていただければ、数式などが詳しく解説された記事などをしっかり読み解けると思います。

細かなところで間違っているところもあるかもしれません。その場合はご指摘いただけると大変嬉しいです。

# ロジスティック回帰とは
入力を受けて、それがある事柄に該当する確率（あるいは該当しない確率）を割り出すことによって、入力がある事柄に該当するかを判定することを、ロジスティック回帰といいます。

例えば、あるメールの文面を入力として受けて、それが迷惑メールである確率（あるいは迷惑メールでない確率）を割り出すと、７０％という結果になったとします。このように、メールの文面が迷惑メールか、そうでないかを1 or 0で判定するのは難しい、というのは直感的に理解できるかと思います。そしてえ、７０％というのは高い水準であるように思われますから、このメールは迷惑メールと判定する、という感じですね。もちろん、50%や60%、80%を閾値としても構いません。閾値をどこに設定するかは、状況により異なるでしょう。

# 尤度関数とは
ロジスティック回帰では、尤度関数というものを利用して、いわゆる「学習」を行います。

尤度とは、「ゆうど」と読み、もっともらしさ（尤もらしさ）の度合いを表します。何の、どういった点でのもっともらしさを表すのでしょうか？そして、その関数とはどういうことでしょうか？そういった点を、これから説明したいと思います。

入力 $x$ を受けて、ある事柄に該当する確率（０から１の範囲）を出力する関数 $f(x)$ があるとします。たとえばあるメール文面を受けて、そのメールが迷惑メールである確率を出力する関数として、 $f(x)$ がある、といったような感じです。

$x$ の値として具体的なものがn個ほど分かっているとします。それぞれ、$x_1$, $x_2$, ・・・,  $x_n$ と表します。先ほどの例ですと、メール１の文面、メール２の文面、・・・、メールnの文面ですね。

$x_1$に対する正しい答え（$x_1$がある事柄に該当する or しない）が分かっているとして、$x_1$を$f(x)$ に代入したときに、正しい答え（ある事柄に該当する or しない）に当てはまる確率を $p_1$ と表してみましょう。

例えば、メール１の文面が迷惑メールだと分かっているときに、メール１の文面を$f(x)$ に代入したときに、迷惑メールである確率が出てきます。この確率が、先ほどの$p_1$ にあたります。

また、メール２の文面が迷惑メール**ではない**と分かっているときに、メール２の文面を$f(x)$ に代入したときに、迷惑メール**でない**確率が出てきます。この確率は$p_2$ となりますね。

これを一般化して、$x_n$に対する正しい答え（$x_n$がある事柄に該当する or しない）が分かっているとして、$x_n$を$f(x)$ に代入したときに、正しい答え（ある事柄に該当する or しない）に当てはまる確率を $p_n$ とします。

$x_1$の時に正しく判定し、$x_2$の時にも$x_3$の時にも正しく判定し、（中略）、$x_n$の時にも正しく判定するといった感じで、全ての$x$の値について、全て正しく判定する確率は、全ての$p$を単純に掛けることで得られますから、$p_1p_2p_3…p_n$です。

個々の$x$をもとに、正しい答えに該当する確率$p$を出力するのは $f(x)$ です。この関数は $y = ax + b$ での $a$ や $b$ のように、定数を持っているはずです。 $f(x)$ が、各$x$について正しい答えに該当する確率を算出するわけですが、当然ながらこの確率は高ければ高い方が良いです。この確率の高さは、$a$ や $b$ といった定数をどんな値に設定するかにかかっています。

ちなみに、 $f(x)$ の内部では、実際には $\sigma(ax + b)$ のように、シグモイド関数をかますことで、$ax + b$の出力を0から1の範囲に変換することで、確率を出力できるようになっています。シグモイド関数とは、入力値が大きいほど出力が1に近づき、入力値が小さいほど出力が0に近づく、という関数のことです。大して難しいものではありません。ご安心ください。

話を戻しますと、全ての$x$の値について、全て正しく判定する確率は $p_1p_2p_3…p_n$ であり、その値は$a$ や $b$ といった定数をどう設定するかによって変わってきます。

このように、$a$ や $b$ といった定数にどんな値を設定するかによって、全ての$x$の値について、全て正しく判定する確率がどうなるか、を表す関数こそが「尤度関数」です。

$f(x)$ が$x$についての関数であるのと同様に、尤度関数は$a$ や $b$ といった定数についての関数ということです。

尤度関数が出力する「全ての$x$の値について、全て正しく判定する確率」というのは、 $a$ や $b$ といった定数によって構成された関数 $f(x)$ が、現実の分布をどれくらい適切に表しているか、という「尤もらしさ（もっともらしさ）」を表す指標であると捉えることができます。こういった点から、「尤度」関数と呼ばれているのです。

# 尤度関数を利用した「学習」とは

全て正しく判定する確率を表すわけですから、尤度関数の値というのはものすごく小さくなります。 たとえば、$10^{-56}$ といったような値になります。

「そんな確率は、ほぼゼロと同じじゃないか」と感じるかもしれませんが、大事なのはこの確率の値そのものではありません。

尤度関数を使ってやりたいことは、全て正しく判定する確率ができるだけ高い $f(x)$ であるような $a$ や $b$ を見つけることです。つまり、尤度関数が最大となるような $a$ や $b$ を見つけることです。

そのような $a$ や $b$ で構成される関数 $f(x)$ は、現実の分布に可能なかぎり近似していると評価できますから、その $f(x)$ を使うことで、$x$の値として未知のものが与えられたとしても、正しく正解と判断できる確率がそれなりに高いということになります。

さて、最大となるようなものを見つける、となると厄介なのですが、逆に最小となるものを見つけるなら、微分の出番です。ということで、尤度関数に「-（マイナス）」をつけて尤度関数の正負を逆転させ、正負が逆転した尤度関数の最小値を求める、という問にすり替えてしまいます。この「正負が逆転した尤度関数」こそが、ロジスティック回帰における誤差関数です。

あとは、この誤差関数が最小値となる $a$ や $b$ を見つけるために、誤差関数を $a$ や $b$ について微分して（偏微分して）、勾配降下法を適用していきます。

これが、ロジスティック回帰における「学習」です。

# 参考
http://sumikitch.com/blog/2019/02/07/logistic-regression1/
http://sumikitch.com/blog/2019/02/08/logistic-regression2/