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

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

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

はじめに

前回の記事で、シグモイド関数微分を行いました。
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)}

最後に

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