デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理と英語を基礎からやり直す。https://qiita.com/yaju

機械学習に使われる微分の数式を理解してみる(多項式回帰)

はじめに

前回の記事の続きとなります。
yaju3d.hatenablog.jp

最終的な更新式を求めたところまでやりました。
パラメータ  \theta_0 \theta_1 の更新式は、最終的に下記のようになります。

\displaystyle \theta_0 := \theta_0 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

\displaystyle \theta_1 := \theta_1 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

参考

やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷

多項式回帰

プロットしたデータにフィットさせる際に1次関数の場合は形が直線にしかなりません。
しかし、場合によっては曲線の方がプロットしたデータにフィットする。
f:id:Yaju3D:20190413234724p:plain

これは関数 f_\theta(x) を2次関数として定義することで実現できる。

f_\theta(x) = \theta_0 + \theta_1x + \theta_2 x^{2}

もっと大きな次数にすることも出来る。その場合はより複雑な曲線に対応できるようになる。

f_\theta(x) = \theta_0 + \theta_1x + \theta_2 x^{2} + \theta_3 x^{3} + \cdot + \theta_n x^{n}

しかし、次数を増やせば増やすほどいい感じになるわけではない。確かにフィットするようにはなるけど、過学習と呼ばれる別の問題が発生するようになる。

更新式を求める

前回と同じように v\theta_2偏微分して更新式を求めます。
\theta_0\theta_1 x は計算対象外なので除外します。残った \theta_2 x^{2}微分して x^{2} になります。

\displaystyle \frac{\partial v}{\partial \theta_2} = \frac{\partial}{\partial \theta_2} \left(\theta_0 + \theta_1 x + \theta_2 x^{2} \right) = x^{2}

最終的な更新式

最終的なパラメーターの更新式は下記のようになります。

\displaystyle \theta_0 := \theta_0 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

\displaystyle \theta_1 := \theta_1 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

\displaystyle \theta_2 := \theta_2 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)^{2}}

これはパラメーターが、 \theta_3\theta_4\cdot と増えていっても同じような更新式になります。
ということは、j 番目のパラメーターの更新式は下記のようにできる。
x^{0} = 1 となることを利用する。

\displaystyle \theta_j := \theta_j - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)^{j}}

このように多項式の次数を増やした関数を使うものは、多項式回帰と呼びます。

※誤解されないように説明しておくと、x^{(i)}y^{(i)}i 乗という意味ではなくて、i 番目の学習用データを参照する意味である。

最後に

今回はここまで、次回は重回帰となります。

機械学習に使われる微分の数式を理解してみる(勾配降下法:最急降下法)

はじめに

前回の記事で、シグモイド関数微分を行いました。
yaju3d.hatenablog.jp

今回は、偏微分を含んだ微分を理解していきます。
本とかだと分かっている人向けなので展開式を省略されてしまうのですが、私はあえて分かりやすく展開式を書きたいと思っています。

参考

やる夫で学ぶ機械学習 - 単回帰問題 - · けんごのお屋敷

勾配降下法

yaju3d.hatenablog.jp

数値解析の分野では勾配降下法を最急降下法と呼びますが、勾配降下法の中にもいくつかの方法が存在します。

最急降下法とは

最急降下法は学習データのすべての誤差の合計を取ってからパラメーターを更新します。学習データが多いと計算コストがとても大きくなってしまいます。また、学習データが増えるたびに全ての学習データで再学習が必要となってしまいます。

目的関数の微分方法

目的関数 最小2乗法
\displaystyle E(\theta)=\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - f_{\theta}(x^{(i)})\right)^{2}

※誤解されないように最初に説明しておくと、x^{(i)}y^{(i)}i 乗という意味ではなくて、i 番目の学習用データを参照する意味である。

この目的関数は、f_{\theta}(x) を含んでいて、今回 f_{\theta}(x) は、\theta_0\theta_1 の2つのパラメーターを持っているとします。
これは\theta_0\theta_1の2変数を持つ2変数関数になるので、普通の微分ではなく偏微分になります。
偏微分とは、n 変数関数のある一つの変数以外の n-1 個の変数の値を固定し、残りの 1 つの変数について関数を微分することです。
mathtrain.jp

更新式を求める

更新式は下記の2つになります。
\displaystyle\ \theta_0 := \theta_0 - \eta\frac{\partial E}{\partial \theta_0}…①

\displaystyle\ \theta_1 := \theta_1 - \eta\frac{\partial E}{\partial \theta_1}…②

実際に①を偏微分してみましょう。これには合成関数の微分を使うといいです。

合成関数の微分
fg という関数があったとき、これらの合成関数 f(g(x))x微分する場合は下記式になり、これを使えば簡単になる。
\displaystyle \frac{df}{dx}=\frac{df}{dg} \cdot \frac{dg}{dx}

これを目的関数に適用します。
E(\theta) の中に  f_{\theta}(x) が出てきて、  f_{\theta}(x) の中に \theta_0 が出てきます。
それを下記のように考えてみます。

u=E( \theta_0)

v=f_{\theta}(x)

すると、こうやって段階的に微分が出来ます。
合成関数の微分
\displaystyle \frac{\partial u}{\partial \theta_0} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_0}

まずは uv微分するところから計算してみます。

\displaystyle \frac{\partial u}{\partial v} =  \frac{\partial}{\partial v} \Biggl(\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)^{2}} - 2y^{(i)}v+v^{2}\right) \Biggr)

v微分するので、y^{(i)^{2}} は計算対象外なので除外します。

=\displaystyle \frac{1}{2}\sum_{i=1}^n \left(-2y^{(i)}+2v\right)

共通因数の -2 を前に出します。
=\displaystyle \frac{1}{2}\sum_{i=1}^n -2\left(y^{(i)}-v\right)

こうすると \displaystyle \frac{1}{2} と相殺されて、微分した後の式が簡単になります。
それが最初に \displaystyle \frac{1}{2} を掛けていた理由です。 =\displaystyle \sum_{i=1}^n -\left(y^{(i)}-v\right)

このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 - y^{(i)}v を入れ替えます。

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)

次に  v \theta_0微分します。
\theta_1 x は計算対象外なので除外します。残った \theta_0微分して 1 になります。

\displaystyle \frac{\partial v}{\partial \theta_0} = \frac{\partial}{\partial \theta_0} \left(\theta_0 + \theta_1 x\right) = 1

合成関数の微分に従って、それぞれの結果を掛けてあげれば、  \theta_0微分した結果が出る。

\displaystyle \frac{\partial u}{\partial \theta_0} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_0}

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)  \cdot 1

v=f_{\theta}(x)の定義を元に戻す。

=\displaystyle \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

次は、②の  \theta_1 について微分します。

\displaystyle \frac{\partial u}{\partial \theta_1} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_1}

 u v微分するところは同じ展開なので省略しても良かったのですが、あえて書いておきます。

\displaystyle \frac{\partial u}{\partial v} =  \frac{\partial}{\partial v} \Biggl(\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)^{2}} - 2y^{(i)}v+v^{2}\right) \Biggr)

v微分するので、y^{(i)^{2}} は計算対象外なので除外します。

=\displaystyle \frac{1}{2}\sum_{i=1}^n \left(-2y^{(i)}+2v\right)

共通因数の -2 を前に出します。
=\displaystyle \frac{1}{2}\sum_{i=1}^n -2\left(y^{(i)}-v\right)

こうすると \displaystyle \frac{1}{2} と相殺できます。
=\displaystyle \sum_{i=1}^n -\left(y^{(i)}-v\right)

このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 - y^{(i)}v を入れ替えます。

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)

次に  v \theta_1微分する部分だけを計算する。
\theta_0 は計算対象外なので除外します。残った \theta_1 x微分して x になります。

\displaystyle \frac{\partial v}{\partial \theta_1} = \frac{\partial}{\partial \theta_1}(\theta_0 + \theta_1 x) = x

合成関数の微分に従って、それぞれの結果を掛けてあげれば、  \theta_1微分した結果が出る。
\displaystyle \frac{\partial u}{\partial \theta_1} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_1}

=\displaystyle \sum_{i=1}^n\left(v - y^{(i)}\right) \cdot x^{(i)}

v=f_{\theta}(x)の定義を元に戻す。

=\displaystyle \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

最終的な更新式

パラメータ  \theta_0 \theta_1 の更新式は、最終的に下記のようになります。

\displaystyle \theta_0 := \theta_0 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

\displaystyle \theta_1 := \theta_1 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

最後に

長くなったので今回はここまで、次回は多項式回帰となります。

機械学習に使われる微分の数式を理解してみる(シグモイド関数)

はじめに

機械学習関連の本や記事を見るたびに出てくる微分の数式、これを理解しないと自分は先に進めない。
しばらくはシリーズで取り組みたいと思います。

以前の記事で、シグモイド関数微分を導出してみました。再度、一から見直していきます。
yaju3d.hatenablog.jp

参考

シグモイド関数微分

前提

sigmoid(x) = \displaystyle \frac{1}{1 + e^{-x}}

結論

f(x)=sigmoid(x) とした時、
f(x)′=f(x)(1−f(x))

導出

前回の記事では、逆数の微分公式をそのまま使用しました。
\displaystyle \left(\frac {1}{f}\right)^{\prime}=\frac{−f^{\prime}}{f^{2}} です。

逆数の微分公式

まずは、 逆数の微分公式がなぜこうなるのか、どこから2乗がでてくるのかを理解していきます。

その前に分子に分数を含む式の計算を理解しておく必要があります。
manapedia.jp

分子に分数を含む式
\displaystyle \frac{\left(\frac{1}{2}\right)}{4}
これは、下記のように変更できます。
\displaystyle \frac{\left(\frac{1}{2}\right)}{4}  = \frac{1}{2}  \div 4 = \frac{1}{2}  \times \frac{1}{4} =  \frac{1}{8}

次は、微分の定義式で下記の数式になっています。
 \displaystyle\lim_{h\to 0}\dfrac{f(x+h)-f(x)}{h}=f'(x)

これを逆数にするので下記のようになります。
\displaystyle \left(\dfrac{1}{f(x)}\right)' = \displaystyle\lim_{h\to 0}\dfrac{\frac{1}{f(x+h)}-\frac{1}{f(x)}}{h}

これを展開していきます。先ずは分子の分母を通分します。
= \displaystyle\lim_{h\to 0}\dfrac{\dfrac{f(x)-f(x+h)}{f(x+h)f(x)}}{h}

分子に分数を含む式なので変形します。
= \displaystyle\lim_{h\to 0}\dfrac{f(x)-f(x+h)}{f(x+h)f(x)} \div h

= \displaystyle\lim_{h\to 0}\dfrac{f(x)-f(x+h)}{f(x+h)f(x)} \times \dfrac{1}{h}

= \displaystyle\lim_{h\to 0}\dfrac{f(x)-f(x+h)}{h(f(x+h)f(x))}

これを下記のように分解すると微分の定義式f'(x)が見えてきます。
=\displaystyle\lim_{h\to 0}-\dfrac{1}{f(x)f(x+h)}\cdot\dfrac{f(x+h)-f(x)}{h}

=\displaystyle\lim_{h\to 0}-\dfrac{1}{f(x)f(x+h)}\cdot f'(x)

 h は極限で  0 として扱うので無視します。

=\displaystyle\lim_{h\to 0}-\dfrac{1}{f(x)f(x+0)}\cdot f'(x)

=-\dfrac{f'(x)}{f(x)^{2}}

これで逆数の微分公式が求まりました。

e の微分公式

公式 (e^{x})^\prime = e^{x}

符号違いのもう一つ公式を求めます。
公式 (e^{-x})^\prime = -e^{-x}

導出するにはチェーンルール(合成関数の微分公式)を用いて求めます。
y=e^{u}u=-x とおいて、\displaystyle  y\prime=\frac{dy}{du}\frac{du}{dx}=e^{u}\cdot(-1)=-e^{-x}

シグモイド関数微分

ここからシグモイド関数を逆数の微分公式を使用して微分します。

シグモイド関数1+exp(−x) の逆数なので
f^{\prime}(x)=\left(\displaystyle \frac {1}{1+exp(−x)}\right)^{\prime}

逆数の微分公式 -\dfrac{f'(x)}{f(x)^{2}} を当てはめます。

=\displaystyle \frac{-(1+exp(-x))^{\prime}}{(1+exp(-x))^{2}}

分子は微分するので1は消えます。
=\displaystyle \frac {-(-exp(−x))}{\left(1+exp(−x)\right)^{2}}
公式 (e^{-x})^\prime = -e^{-x} を当てはめると分子の符号がプラスになります。
=\displaystyle \frac {exp(−x)}{\left(1+exp(−x)\right)^{2}}

式を分解して分けます。分ける理由は、定義の式f(x)が出てくるようにするためです。
=\displaystyle \frac {1}{1+exp(−x)} \frac {exp(−x)}{1+exp(−x)}

=\displaystyle \frac {1}{1+exp(−x)} \left(\frac {1+exp(−x)}{1+exp(−x)}−\frac {1}{1+exp(−x)}\right)

=\displaystyle \frac {1}{1+exp(−x)} \left(1−\frac {1}{1+exp(−x)}\right)

ここで、
f(x)=\displaystyle \left(\frac {1}{1+exp(-x)}\right)
であるから、式を当てはめると

=f(x)\left(1−f(x)\right)

最後に

定義の式が出てくるように式を変形するという部分は難しいですね。
今回は、偏微分や合成関数などの出てきてません。まーやり方はいろいろあるので次回は使っていきます。

2019年こそ英語を継続して勉強する

はじめに

今年になってサブタイトルにこっそり「英語」を追記しました。
毎年新年を迎えると今年こそ英語をと誓うものの、数ヶ月もすれば何もしないで終わってそのまま1年経ってしまう。
こんなことを25年ぐらいやっているわけで、溜まるのは本や教材ばかりです。
20年前のドリッピーもあるし、釈由美子さんやっていたNHK英語でしゃべらナイト」の本は全部揃ってます。

ネットで紹介されてた本も買うものの、買うだけで満足してしまったり、読み終えるだけで終わるって状態です。

習慣化

昨年、Twitterのツイートでコワーキングをしている「エニシア静岡」ってところを知りました。勉強会の会場とかになってたんですね。
www.enicia.net

静岡街中の丸井の最上階にあるんですが、今いる会社から近いので今年からAfter Time会員になって仕事帰りに静岡駅に行く前に寄るようにしています。
ここで今は平日は1時間勉強しています。慣れてくれば時間を徐々に増やして2時間ぐらいまでしていきたいところですが、家もそもそも遠いので限界があります。今なら観たいドラマもTverで時間ずらして見れますしね。

英語力

中学1年生レベルからはじめました。
本を購入したんですが、結局iPhoneアプリ版を使っています。

これと英語組み立てTOWNをやっています。自分は昔に購入したので有料版を使っていますが、今は広告有りの無料版が出ているようです。
これは英文法の整序問題で正しい順序にして英文法を作成するのですが、結構楽しいです。

最後に

TOEICを受けたことがないですが、現在のレベルからしたら300点以下だと思います。これをTOEIC600点以上にはしていきたいです。

「サザエさんのじゃんけん データ分析」の2018年の結果

はじめに

明けましておめでとうございます。

さてさて、2018年のサザエさんのじゃんけん結果はどうなったでしょう。
ちなみに、2017年のサザエさんのじゃんけん結果は、32勝9敗7分(勝率0.780)でした。

人工知能による予測化を断念

ごめんなさい、DeepLearningを使用して予想をする予定でしたが、まだ勉強中のままです。

r_stdさんが、機械学習を用いて検証してくれました。
この方は2016年に統計検定準1級に合格している方で幾つかの手法を使っています。
2017年の結果として、naive bayesで33勝9敗6分と好成績を残しています。
r-std.hatenablog.com

約一年越しに②の記事が追加されました。
2018年の結果としてランダムフォレストで32勝10敗7分と好成績を残しています。
r-std.hatenablog.com

次の手の予測アルゴリズム

2017年冬版 サザエさんじゃんけん白書によるとクール(四半期)の初回(1月、4月、7月、10月の初回)はチョキが出やすいとのことで、今回取り入れてみました。

  • チョキが多いので、グー > チョキ > パーの優先順位とする
  • 前回と違う手を出すので、上記の優先順位で勝手を選ぶ
  • 二手前と一手前が違う手なら、残りの手を出すので勝手を選ぶ
  • 三手の中に同手がある場合、 残りの手を出すので勝手を選ぶ
  • 二手前と一手前が同じ手なら、勝手を出すので負手を選ぶ
  • 1月、4月、7月、10月の第1週目はチョキが出やすいので、グーを選ぶ(追加)

qiita.com

2018年の勝敗結果

年月 サザエさんの手 予想の手 勝敗結果
01月07日 チョキ グー 勝ち
01月14日 グー グー 引き分け
01月21日 チョキ チョキ 引き分け
01月28日 グー チョキ 負け
02月04日 パー チョキ 勝ち
02月11日 グー グー 引き分け
02月18日 チョキ グー 勝ち
02月25日 チョキ チョキ 引き分け
03月04日 パー チョキ 勝ち
03月11日 グー パー 勝ち
03月18日 グー グー 引き分け
03月25日 チョキ グー 勝ち
04月01日 チョキ グー 勝ち
04月08日 グー チョキ 負け
04月15日 パー チョキ 勝ち
04月22日 パー グー 負け
04月29日 チョキ グー 勝ち
05月06日 グー パー 勝ち
05月13日 チョキ チョキ 引き分け
05月20日 パー チョキ 勝ち
05月27日 グー パー 勝ち
06月03日 チョキ グー 勝ち
06月10日 グー チョキ 負け
06月17日 パー チョキ 勝ち
06月24日 パー グー 負け
07月01日 チョキ グー 勝ち
07月08日 グー パー 勝ち
07月15日 パー チョキ 勝ち
07月22日 グー グー 引き分け
07月29日 チョキ グー 勝ち
08月05日 チョキ チョキ 引き分け
08月12日 パー チョキ 勝ち
08月19日 グー パー 勝ち
08月26日 グー グー 引き分け
09月02日 パー グー 負け
09月09日 チョキ グー 勝ち
09月16日 グー パー 勝ち
09月23日 チョキ チョキ 引き分け
09月30日 パー チョキ 勝ち
10月07日 チョキ グー 勝ち
10月14日 グー パー 勝ち
10月21日 パー チョキ 勝ち
11月04日 パー グー 負け
11月11日 チョキ グー 勝ち
11月18日 チョキ パー 負け
11月25日 グー パー 勝ち
12月02日 グー チョキ 負け
12月09日 パー チョキ 勝ち
12月16日 チョキ グー 勝ち

結果は、30勝9敗10分(勝率0.769)となりました。

ちなみに、サザエさんじゃんけん研究所 公式ウェブサイトサザエさんの手の予想と勝負結果(2018年)が29勝7敗13分(勝率0.805)でした。

今回は勝数では上回ったのですが、勝率では負けました。 勝率の計算は、「勝ち / (勝ち + 負け)」で行っているのですが、負けが響いたわけです。

データ分析(新)として「1月、4月、7月、10月の第1週目はチョキが出やすいのでグーを選ぶ」という機能を追加して過去の勝敗結果も出してみました。そうすると意外といい数字になるわけですね。

データ分析(新) データ分析 研究所公式 r_stdさん
2013 26勝11敗12分(勝率0.703) 24勝13敗12分(勝率0.649) 25勝9敗17分(勝率0.735) -
2014 32勝8敗11分(勝率0.800) 30勝10敗11分(勝率0.750) 30勝9敗12分(勝率0.769) -
2015 34勝8敗8分(勝率0.810) 32勝9敗9分(勝率0.780) 33勝9敗8分(勝率0.785) -
2016 26勝12敗12分(勝率0.684) 27勝11敗12分(勝率0.711) 22勝13敗15分(勝率0.628) -
2017 34勝8敗6分(勝率0.810) 32勝9敗7分(勝率0.780) 29勝8敗11分(勝率0.783) 33勝9敗6分(勝率0.785)
2018 30勝9敗10分(勝率0.769) - 29勝7敗13分(勝率0.805) 32勝10敗7分(勝率0.761)

勝率を計算する際には、引き分けを除いて考えることが多いです。プロ野球などの勝率は引き分けを除いて計算されています。 mathwords.net

スライド

2013年に静岡Developers勉強会で機械学習を学び、2014年1月にネタとしてSlideShareに公開しました。

サザエさんのじゃんけん データ分析 from yaju88

最後に

今年こそはTensorFlowを使って人工知能ディープラーニングで予測手を作りたいと思います。
r_stdさんのようにディープラーニングを使わない別の機械学習の方法でもいい結果が出ているので参考にさせて頂きます。

交差エントロピーを理解してみる

はじめに

ここ数ヶ月は別の件で忙しくて、機械学習に向き合えていませんでした。
仕事で調べたり学んだことはQiitaブログの方に書いていて結構すんなり書けるんですが、このブログは数学・物理・機械学習と特化するようにしているので、パワーがないと進まない。

ここ数ヶ月で頭の片隅にあったのは、損失関数の「交差エントロピー」です。今回はこれを理解していこうと思います。

何故、気になっていたのかというと、下記サイトの誤差関数(loss)のときのTensorflow関数「tf.nn.sigmoid_cross_entropy_with_logits」があり、シグモイド関数と交差エントロピーが一緒になっているからです。

yaju3d.hatenablog.jp

# 誤差関数(loss)
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=u, labels=y_)

損失関数

機械学習では学習時に、いかに答えに近い値になるように重みパラメータを調整(必要な補正量を定量的に示す)させます。その部分を担うのが損失関数となります。そして損失関数の最小値を探すことが学習のゴールとなる。 損失関数を設定する理由は、認識精度を指標するとパラメータの微分がほとんどの場所で 0 (動かなくなる)になるから。

簡単な説明では「値=損失」ということで、この損失をいかに少なくするのかということで「損失関数」となります。
ちなみに、損失関数と誤差関数の呼び方が違うだけで同義となります。
目的関数、コスト関数、誤差関数、損失関数いろいろあるけど、なにが違うのかを検討 - Qiita

損失関数は幾つか種類がありますが、機械学習では下記の2種類がよく使われます。
※理由として「誤差逆伝播」ができる関数であることのようです。

  • 二乗誤差(mean squared error)
  • 交差エントロピー誤差(cross entropy error)

交差エントロピー誤差(cross entropy error)

二乗誤差の方は比較的分かりやすいので、交差エントロピーを理解していきます。
分類問題(識別問題)になると交差エントロピーが出てきます。

f:id:Yaju3D:20160421012315p:plain

\displaystyle E=\sum_{k=1} -y_k\log{t_k}-(1-y_k)\log{(1-t_k)}

これがある条件(分類問題)になると簡単になります。
交差エントロピー誤差では、実質、正解データt = 1 の場合にしか計算は行われません(正解データt = 0 の時には、乗算結果は常に 0 に収束するから)

\displaystyle E=\sum_{k=1} - t_k \log y_k

エントロピー

エントロピーとは平均情報量のことです。

A国、B国に置けるその日の天気を表した表を以下に定義します。

晴れ(%) 曇り(%) 雨(%) 雪(%)
A国 25 25 25 25
B国 50 25 12.5 12.5

この時それぞれの天気のエンコード方法は以下のようにするとします。

天気 ビット
晴れ 00
曇り 01
10
11

この時、メモリの容量が1KB(8000bit)だとすると、4000(日)のデータを保存できる。
\displaystyle \frac{8000(bit)}{2(bit)}=4000(日)

しかし、このエンコード方法は無駄があることがわかるでしょうか?
なぜなら、B国では晴れの日が50%である為、以下の表のように、エンコードした際に使うbit数を1にすると、容量を節約することができ、同じ8000bitのメモリで4500日以上分のデータを保存できる。

天気 ビット
晴れ 0
曇り 10
110
111

\displaystyle H(P_b) = E_{P_b} \begin{bmatrix}log_{2}(\frac1{P_{b}(\omega)})\end{bmatrix} \displaystyle =0.5log_{2} \left(\frac1{0.5}\right)+0.25log_{2}\left (\frac1{0.25}\right) +0.125log_{2}\left (\frac1{0.125}\right)+0.125log_{2}\left (\frac1{0.125}\right) = 1.75

最適なコードの割り当て方法は数学的証明により、求められており

確率P(\omega) で起こる事象には長さ\displaystyle log_{2} \left(\frac{1}{P(\omega)}\right) のコードを割り当てるのが最適とされている。
また、期待値(1回の試行の結果を伝えるのに要する平均ビット数)をエントロピー(平均情報量)とよびます。

交差エントロピー

ここでそれぞれの国の最適エントロピーを上のような数学的方法によって求めてみましょう。
まずは、ある国の最適なエントロピーの求め方で、他の国のエントロピーを求めた場合を考える。

[例] B国の最適エントロピーの求め方で、A国のエントロピーを求める。

\displaystyle H(P_b) = E_{P_b} \begin{bmatrix}log_{2}(\frac1{P_{b}(\omega)})\end{bmatrix}
=\displaystyle  0.25log_{2} \left(\frac{1}{0.5}\right)+0.25log_{2} \left(\frac{1}{0.25}\right)+0.25log_{2} \left(\frac{1}{0.125}\right)+0.25log_{2} \left(\frac{1}{0.125}\right)=2.25

A国の最適エントロピーの求め方をしていないので、0.25[bit]分無駄が生じてしまっています。
このように、ある確率分布に最適化された方式で別の確率分布をエンコードした時の平均ビット長を「交差エントロピー」と呼びます。

交差エントロピーの「交差」とは何なのかを偶然知った。曰く、p×log(p)のようにlogの中身と外側に同じ変数が使われているのが普通のエントロピー。それに対して、t×log(y)のようにlogの中身と外側に異なる変数が使われているものを"交差"エントロピーと呼ぶらしい。 「ゼロから作るDeep Learning」を読んだ(後編) - 不確定な世界

損失関数・交差エントロピー誤差とは

交差エントロピー誤差では、 自然対数eを底とするモデル出力値のlog値と正解データ値を乗算したものの総和を、損失とします。
自然対数logは、logに渡される x の値が 0 に近い時には絶対数の大きな出力を返し、 x の値が 1 に近いほど、絶対数が 0 に近い出力を返します。 すなわち、正解データ t が 1 の時、それに対応するモデル出力 y が 1 に近い数値を出力できていれば、 t と x の乗算結果は小さくなり、 x が 0 に近い誤った数値を出力していれば、 t と x の乗算結果は大きくなる、という論理です。

wild-data-chase.com

qiita.com

なぜ分類問題では交差エントロピーが使われるのか

損失関数といえば二乗誤差が有名ですが、分類問題を扱う際には交差エントロピーが頻繁に使われます。
教師データと学習結果が大きく乖離している(損失関数の値が大きい)時、交差エントロピーを使った方が学習スピードが早い!!(1学習あたりの損失関数の減少幅が大きい)

出力結果(y)が0に近いところだと、交差エントロピーの微分値がとてつもなく大きなマイナスになっていることがわかります。微分値が大きなマイナスになっているということは、それだけ損失関数がマイナスに大きく変動しているということを意味しています。
なぜ交差(クロス)エントロピーが機械学習(ニューラルネットワーク)の損失関数に使われるのか? | まなれきドットコム

sigmoid_cross_entropy_with_logits

交差エントロピーは、ニューラルネットワークの誤差関数(損失関数)として使われることがあります。特に、シグモイド関数との相性がよい。
Tensorflowでは、「tf.nn.sigmoid_cross_entropy_with_logits - tensorflow」と一緒になっている。

交差エントロピーの式の中にシグモイド関数が入ったものである。
\displaystyle E=\sum_{k=1} -y_k\log{t_k}-(1-y_k)\log{(1-t_k)}

         ↓

\displaystyle E=\sum_{k=1} -z\log{(sigmoid(x))}-(1-z)\log{(1-sigmoid(x))}

         ↓ 符号が違うので、それぞれに -1 を掛ける \displaystyle E=\sum_{k=1} z-log{(sigmoid(x))}+(1-z)-\log{(1-sigmoid(x))}

 z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))
= z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))
= (1 - z) * x + log(1 + exp(-x))
= x - x * z + log(1 + exp(-x))

上記プログラムは、tf.nn.sigmoid_cross_entropy_with_logits のロジックのコメントにあったものである。
次の式の展開がどうしてそうなるのか分からない、数学が出来る人は過程を省略するんだよね。
そういうのは嫌い、自分が分かった限りで説明していきます。

= z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))

この式で分かりにくい部分は、-log(1 / (1 + exp(-x))) → log(1 + exp(-x)) になることですね。
これは、対数の中身が分数の場合の展開が分かるといいです。log1=0
\displaystyle log\left(\frac{1}{8}\right) = log\left(\frac{1}{2^{3}}\right)  = log1-log(2^{3}) = 0-3log2 = -3log2

対数の分数は引き算に分けることができます。
\displaystyle -log\left(\frac{1}{1+exp(-x)}\right)
=-(log1-log(1+ exp(-x)))
=-(0-log(1 + exp(-x))
= log(1 + exp(-x))

同じ部分として -log(exp(-x) / (1 + exp(-x)) → (-log(exp(-x)) + log(1 + exp(-x))) があります。
これは先程と同じ展開で対数の分数は引き算になります。
-log(exp(-x) / (1 + exp(-x))
=-(log(exp(-x)) - log(1+ exp(-x)))
=(-log(exp(-x)) + log(1 + exp(-x))

3段目で分かりにくい部分は (-log(exp(-x)) → x ですかね。
これは自然対数の底の性質 (log(exp(x)) → x を使います。
今回は expの中の符号と外側の符号がマイナスになっていますので展開すると (-log(exp(-x)) =-(-x) = x となります。

= z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))
= (1 - z) * x + log(1 + exp(-x))
= x - x * z + log(1 + exp(-x))

これは、 log(1 + exp(-x)) を 別の変数にすると分かりやすくなります。一旦 qにします。
=z * q + (1 - z) * (x + q)
=z * q + (1 - z) * x + (1 - z) * q
=zq + (1 - z) * x + q - zq
=(1 - z) * x + q - zq + zq
=(1 - z) * x + q
定義のqを元に戻す。
=(1 - z) * x + log(1 + exp(-x))
後は素直に展開すればいい。
=x - x * z + log(1 + exp(-x))

softmax_cross_entropy

qiita.com  

最後に

機械学習は一筋縄にはいかないので、皆さんがんばりましょう。

参照

シグモイド関数を理解してみる

はじめに

機械学習の学習すると必ず出てくる用語にシグモイド関数があります。
今回はこれを理解してみたいです。

シグモイド曲線

シグモイド曲線は入力した値を0から1の間に収めてくれる関数の1つです。
多くの自然界に存在する事柄は、このようなS字曲線を取ります。
欠点として1に近づくほど1そのものにならない性質があります。

使う理由

分類した場合に「1」と「-1」という2択ではなく、シグモイド関数は確率で分類すると考えます。
Aの確率が80%で、Bの確率が20%といった感じで分類していきます。
シグモイド曲線の値は 0 から 1 の間になるので確率として使用できます。

すべての関数は微分ができるわけではありません。
尖った点があったり、線が切れていると微分はできないのです。
※尖っていた場合、同じ点に対して二つの傾きが計算できてしまうので微分不可能になる。
どうしてシグモイド関数は滑らかな関数なのか - Qiita
自然科学のための数学2014年度第10講

例えば有名な例として絶対値の関数 y=|x| があります。この関数は x=0 で微分できません。
同様にステップ関数も x=0 で微分できません。
f:id:Yaju3D:20190331145627p:plain

シグモイド関数は下図グラフで示すようにステップ関数を滑らかにした形で線が切れてないので微分が可能になるのです。

数式

f(x) = \displaystyle  \frac{1}{1+e^{-ax}}

グラフ

f:id:Yaju3D:20170602002203p:plain

下図に示すステップ関数(step function)を滑らかにしたものであると見なすことができる。
f:id:Yaju3D:20170603024904p:plain

シグモイド関数の性質

いいサイトがあった。 risalc.info

単調増加性

数学での単調とは「上がったり下がったりがない」という意味です。
放物線は、単調減少と単調増加があります。
f:id:Yaju3D:20181104162349p:plain

シグモイド関数は、S字を描きますが徐々に上がり続けて下がりませんよね。

シグモイド関数の微分

前提

sigmoid(x) = \displaystyle \frac{1}{1 + e^{-x}}

結論

f(x)=sigmoid(x) とした時、
f(x)′=f(x)(1−f(x))

導出

逆数の微分

まず、逆数の微分公式を確認しておきます。
\displaystyle \left(\frac {1}{f}\right)^{\prime}=\frac{−f^{\prime}}{f^{2}} です。
逆数の微分公式の証明:「 商の微分公式の証明と例題
商の微分
\left(\dfrac{1}{f(x)}\right)^{\prime} = \displaystyle\lim_{h\to 0}\dfrac{\frac{1}{f(x+h)}-\frac{1}{f(x)}}{h}
=\displaystyle\lim_{h\to 0}\dfrac{\frac{f(x)}{f(x)f(x+h)}-\frac{f(x+h)}{f(x)f(x+h)}}{h}
=\displaystyle \lim_{h\to 0}\dfrac{f(x)-f(x+h)}{hf(x)f(x+h)}
=\displaystyle \lim_{h\to 0}-\dfrac{1}{f(x)f(x+h)}\cdot\dfrac{f(x+h)-f(x)}{h}
=-\dfrac{f'(x)}{{f(x)}^2}

シグモイド関数は 1+exp(−x) の逆数なので
f^{\prime}(x)=\left(\displaystyle \frac {1}{1+exp(−x)}\right)^{\prime}

=\displaystyle \frac{-(1+exp(-x))^{\prime}}{(1+exp(-x))^{2}}

=\displaystyle \frac {exp(−x)}{\left(1+exp(−x)\right)^{2}}

=\displaystyle \frac {1}{1+exp(−x)} \frac {exp(−x)}{1+exp(−x)}

=\displaystyle \frac {1}{1+exp(−x)} \left(\frac {1+exp(−x)}{1+exp(−x)}−\frac {1}{1+exp(−x)}\right)

=\displaystyle \frac {1}{1+exp(−x)} \left(1−\frac {1}{1+exp(−x)}\right)

ここで、
f(x)=\displaystyle \left(\frac {1}{1+exp(-x)}\right)
であるから、式を当てはめると

=f(x)\left(1−f(x)\right)

もう少し詳しい説明を書いてみました。
yaju3d.hatenablog.jp

グラフ

左図はシグモイド関数の微分したグラフ、右図は正規分布関数のグラフです。形が似ていますよね。
正規分布関数との類似性と計算のしやすさの2つが、機械学習でシグモイド関数がよく使われる理由なのです。 f:id:Yaju3D:20190523004451p:plain

使い道

シグモイド関数の微分(f(x)\left(1−f(x)\right) )はどこに使われるのか、最急降下法(勾配降下法)や 誤差逆伝播法(バックプロパゲーション)にてパラメーターの更新に使われます。
以前はシグモイド関数が主流でしたが、最近ではReLU関数などが使われています。これは勾配消失の問題です。
シグモイド関数の微分の最大値は0.25となるため、ディープラーニングで層を増やしていくと勾配が消失してしまうのです。その点、ReLU関数の場合は最大値が1.00で勾配消失がしにくくなる。

ロジスティック回帰との関係

ロジスティック回帰は、以下の数式で表現できます。

y=\displaystyle \frac {1} {1+exp(-(b_{1}X_{1}+b_{2}X_{2}+b_{3}X_{3}+ \cdots  + b_{i}X{i}+b_{0}))}

シグモイド関数と同じ形であり、数式の中の「b_{1}X_{1}+b_{2}X_{2}+b_{3}X_{3}+ \cdots  + b_{i}X{i}+b_{0}」という部分は重回帰分析と同じです。
よって、ロジスティック回帰のグラフを描くとシグモイド関数と同様になります。

ロジスティック回帰の最尤関数

統計学や機械学習をを勉強していると「尤度(ゆうど)」という概念に出会います。
尤もらしい(もっともらしい)ということで、最尤度は最高にもっともらしいってことですね。
尤度とはある事象が観測された時、それぞれの事象の確率の確率分布関数のパラメータがどれだけ尤もらしいかを測る量で、事象の同時確率として定義されます。
※同時確率とは、サイコロを2回投げた場合、1回目に1の目が出て、2回目に2が出る確率は?って聞かれたら、まず\frac {1}{6}で1が出て、次に\frac {1}{6}で2が出て、それが続けて起こる確率は掛け算を使って、\frac {1}{6}\cdot\frac {1}{6}=\frac {1}{36}

回帰の時の2乗誤差だった場合は最小化した値を求めるのが目的だったのに対し、今考えるのは同時確率で確率が高くなって欲しいので最大化するのが目的になります。

上記のロジスティック回帰をシグマに展開すると下記式になります。
PD_{i}=\displaystyle \frac{1}{1+exp(-(b_{0}+ \displaystyle \sum_{p=1}^{K}b_{p}X_{i,p}))}

同時確率を一般式すると下記式になります。
L=\displaystyle \prod_{i=1}^{N}PD_{i}^{Y_i} \left(1-PD_{i}\right)^{1-Y_{i}}

掛け算というのは計算が大変なので、掛け算を足し算にする「対数」を使って尤度関数を表すと下記式になります。
L=\displaystyle \log \left(\prod_{i=1}^{N}PD_{i}^{Y_i} \left(1-PD_{i}\right)^{1-Y_{i}}\right)

=\displaystyle \sum_{i=1}^{N}\left(Y_{i}\cdot\log\left(PD_{i}\right)+\left(1-Y_{i}\right)\cdot\log\left( 1-PD_{i}\right)\right)

活性化関数として

人間の脳は神経細胞(ニューロン)のネットワークで構成されています。この最小単位の神経細胞(ニューロン)を模倣したモデルがパーセプトロンとなります。このモデルは入力値が閾値を超えた場合に「1」を出力(この場合を「ニューロンが発火する」と表現)し、そうでない場合は「0」を出力します。このように入力値から出力値を生むまでの計算を活性化関数と呼びます。

パーセプトロンでは活性化関数に下図のステップ関数(入力に対してある閾値を境に階段(ステップ)のように出力が1か0か決まる)を使っていました。
f:id:Yaju3D:20170603024904p:plain

ニューラルネットワークは学習をする際に微分を含む計算を行うため、微分するとゼロになるステップ関数は都合が悪いことからステップ関数に似た形で微分してもゼロにならないシグモイド曲線(sigmoid)などが使用されるようになりました。
※微分するとゼロになると都合が悪いのは、値を微分値で更新しても同じ値のままになってしまうからです。

下図のExcelで、106行目の重みの値を更新する際に、前行(105行目)の重みと同行の赤枠「学習係数 x 勾配」の値を加算した値にします。
もし、勾配の値がゼロになってしまうと次の重みの値が更新されないため同じ値のままになり都合が悪くなります。
つまり、そこが正解値ならいいのですが、まだ途中段階で更新が止まってしまうのが良くないわけです。
f:id:Yaju3D:20181031012450p:plain

最後に

今回、シグモイド関数とロジスティック回帰の関係が分かりました。
自分がまだ微分の知識が足りてないってことが分かりました、数式はまだまだ苦手だな。

スポンサーリンク