EurekaMoments

ロボットや自動車の自律移動に関する知識や技術、プログラミング、ソフトウェア開発について勉強したことをメモするブログ

機械学習に必要な数学の基本についての勉強メモ: 指数関数・対数関数編

はじめに

前回の投稿から間が空いてしまいましたが、また下記の書籍を読みながら、機械学習に必要な数学の基礎について勉強を再開しました。

Pythonで動かして学ぶ! あたらしい機械学習の教科書

Pythonで動かして学ぶ! あたらしい機械学習の教科書

今回の記事では、指数関数・対数関数について勉強した際にメモしたことを書いていきます。

前回までの記事

前回までに書いた、「ベクトルと微分編」「行列編」は下記になりますので、合わせてどうぞ。

www.eureka-moments-blog.com

www.eureka-moments-blog.com

指数関数とは

指数関数は、y=a^ xの形で定義される関数である。これは、「aを底とする指数関数」と言われる。また、この式をグラフで描くと下記のようになる。

f:id:sy4310:20190213210543p:plain

a > 1の時は単調増加のグラフになり、0 < a < 1のときは単調減少のグラフになる。出力は常に0よりも上になるので、指数関数は、負の数でも正の数でも、全てを正の数に移す関数と言える。

対数関数とは

対数関数は、指数関数の入力と出力を逆にしたもの、つまり、指数関数の逆関数である。x=a^ yという数式を考え、これをy=の形に変形するとy=\log_{a} x となり、グラフで描くと下記のようになる。

f:id:sy4310:20190213223142p:plain

これを見ると、y=a^ xy=\log_{a} x のグラフがy=xの線で対称になっていることが分かる。また、xが大きくなればなるほどグラフは増加するが、その傾きはどんどんなだらかになる。

対数の便利さ

aが底の対数は、大きすぎる数や小さすぎる数を扱いやすい大きさの数にしてくれる。例えば、100000000 = 10^ 8をa=10の対数で表せば、 \log_{10} 10^ 8 = 8 となる。
底を明記せずに\log x と書けば、底にeを使ったことになる。eは、e=2.718\cdotsの無理数で、自然対数の底、または、ネイピア数と呼ばれる。

機械学習における対数

機械学習では、非常に大きな数や小さな数を扱うが、プログラムでこのような数を扱うとオーバーフローを起こしてします場合がある。そのような数は、対数をとることで、オーバーフローを防ぐことができる。また、対数は、掛け算を足し算に変換することができる。関数f(x)を考えた場合、下記の公式が成り立つ。


\log\prod_{n=1}^ N f(n) = \sum_{n=1} ^N \log f(n)

特に確率の場合、尤度という掛け算で表された確率は、対数をとった「対数尤度」で考えるのが常套手段となっている。

関数f(x)の最大値、最小値を探す場合

ある関数f(x)があったとして、そのf(x)を最小にするx^*を求めるとする。この場合、対数をとった\log f(x)も、同じxで最小になるが、対数は単調増加関数であるので、最小値は変わっても、最小値をとる値は変わらない。このことをグラフで表すと下記のようになる。

f:id:sy4310:20190215234907p:plain

このグラフにおけるf(x)は、f(x) = (x-1)^ 2 + 1であり、x=1のときに最小値をとる。また、\log f(x) = log ((x-1)^ 2 + 1)x=1のときに最小値をとる。この特徴を数式で表すと下記のようになる。


argmin_x f(x) = argmin_x\log f(x)

この式におけるargmin_x f(x)とは、f(x)が最小値をとるxという意味であり、このグラフの場合はargmin_x f(x) = 1となる。この性質により、f(x)の代わりに、\log f(x)を最小にするようなx^*を求めるというテクニックがよく使われる。

指数関数の微分

指数関数y = a^ xのxに関する微分は下記の式のようになる。


y' = (a^ x)' = a^ x \log a

この式を見ると分かるように、微分すると、元の式であるy = a^ x\log aが掛け算された形となる。これにより、微分する前と後での違いを可視化すると、下記のグラフのようになる。
まず、a=2とすると、\log aの値は0.69となるので、微分後のグラフの方が微分前よりも下にくるようになる。
f:id:sy4310:20190216155958p:plain 次に、a=3とすると、\log aの値は1.09となり、a=2のときよりも値が大きくなる。そのため、下記のように微分後のグラフが微分前よりも上にくるようになる。 f:id:sy4310:20190216155508p:plain
ここで特別なのは、a=e(ネイピア数)のときである。\log e = 1となるので、微分した式はy'(x) = (e^ x)' = e^ xとなる。つまり、a=eのときは、下記グラフのように微分前と後で関数の形は変わらないということになる。
f:id:sy4310:20190216155900p:plain
これは、微分の計算をするときにはとても便利な性質である。

対数関数の微分

対数関数の微分は、下記のような反比例の式になる。


y'(x) = (\log x)' = \frac{1}{x}

また、これをグラフにすると下記のようになる。
f:id:sy4310:20190216172817p:plain

サンプルコード

ここまで記載した各グラフを作成するPythonのサンプルコードは下記のGitHubリポジトリで公開しています。

github.com