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

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

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

はじめに

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

参考

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

重回帰

前回の多項式回帰でも、変数 x が1つだけでした。
f_\theta(x) = \theta_0 + \theta_1x + \theta_2 x^{2} + \theta_3 x^{3} + \cdot + \theta_n x^{n}

機械学習をする上で実際に解きたい問題は変数 x が2つ以上の方が多いです。
変数が3つの場合
f_\theta(x_1,x_2,x_3) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_3

一般式

変数を n 個にした場合の一般式
f_\theta(x_1,\cdots,x_n) = \theta_0 + \theta_1 x_1 + \cdots + \theta_n x_n

列ベクトル化

先程の一般式を \theta_0x を列ベクトルとして定義してみます。
\theta = \begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_n
\end{bmatrix}
\ \ \
\boldsymbol{x} = \begin{bmatrix}
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}

\thetax の次元数が違うので揃えます。
1を追加したとしても計算上は値が変わらない。\theta_0 \times 1 = \theta_0となるため。
\theta = \begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_n
\end{bmatrix}
\ \ \
x = \begin{bmatrix}
1  \\
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}

もう一工夫する。x_0 = 1 と定義することで、すべて x とすることができる。

\theta = \begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_n
\end{bmatrix}
\ \ \
x = \begin{bmatrix}
x_0  \\
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}
\ \ \
(x_0 = 1)

こうすることで、\theta を転置したものと x を掛けると次のように書ける。
\theta^{T} x = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \cdots + \theta_n x_n

これは一般式を x_0 = 1 としたものと同じになるわけです。
そして、すべて x としたことで簡潔した式に表現できるようになるのです。
f_\theta(x) = \theta^{T} x

更新式を求める

\thetaj 番目の要素を \theta_j とすると、E\theta_j偏微分した式

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

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

uv微分

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 \sum_{i=1}^n -\left(y^{(i)}-v\right)

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

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

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

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

v\theta_j微分

v\theta_j微分する。
\displaystyle \frac{\partial v}{\partial \theta_j} = \frac{\partial}{\partial \theta_j}(\theta^{T} x) \\
= \displaystyle \frac{\partial}{\partial \theta_j}(\theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \cdots + \theta_n x_n) \\
= x_j

結果を掛ける

合成関数の微分に従って、それぞれの結果を掛ける。
\displaystyle \frac{\partial u}{\partial \theta_j} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_j}

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

最終的な更新式

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

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

最後に

今回はここまで、次回は確率的勾配法となります。