Yotの日常

趣味の紅茶やエンジニアリングから投資、節約術まであれこれ書いていきます

線形回帰のバッチ勾配降下法の勾配ベクトルの導出

このオライリー機械学習の本で現在勉強中。

 

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習

 

 

線形回帰のバッチ勾配降下法の勾配ベクトルの計算式の導出方法が載ってなかったので、ここに残しとく。

 

 バッチ勾配降下法について

コスト関数を最小化する為に、パラメータの局所的な勾配を計算し、その勾配分だけパラメータを更新していく方法。例えると、とある山(コスト関数、というかコスト関数の計算結果)を下りたいとする。効率よく下るためには、最も傾斜が急な方向に進めば良い。これをやっているのが、バッチ勾配降下法。そして、この局所的な勾配(足元の斜面の傾き)の求め方が今回の話題、だいたいそんな感じ。

 

では、本題

今回のコスト関数は最小二乗法(MSE)

簡単に説明すると「予測結果と実際の値の差の二乗の平均値」を計算して、これが最小になるパラメータを探す手法。なぜ差の絶対値じゃなくて、二乗なのかとかは、また別の機会に。。(ググれば出てくるよ)

数式にするとこんな感じ。

MSE = 1/ m *\sum_{i=1}^m (θ  * x_{i} - y_{i})^2

m:データの数、θ:パラメータ、x_{i}: 一つのデータセットy_{i}:実測値

 

これを行列式で書き換えるとさらにこうなる。

MSE = 1/ m *|| X θ - y ||^2

今回はこの行列式微分していこうと思います。

 

||  X  θ - y ||^2を変換していく

 まずこの|| X  θ - y ||^2の部分。これはベクトルの内積を表しています。

そのため、このように書き換えることができる。 

||  X * θ - y ||^2 = ( X  θ - y )^T( X  θ - y )

またさらにそれを展開していくとこうなる。

( X  θ - y )^T( X  θ - y ) = ( θ^T X^T  - y^T )( X θ - y )

 =  θ^T X^T X θ - θ^T X^T y - y^T  X θ + y^T y

   =  θ^T X^T X θ -2 y^T  X θ + y^T y  

 

よって、MSEの微分はこのように書くことができる

δMSE/ δθ= 1/m * δ/ δθ( θ^T X^T X θ -2 y^T  X θ + y^T y) 

= 1/m *( δ/ δθ( θ^T X^T X θ) -2δ/ δθ (y^T  X θ) 

 

ここで、

  X θ = Aとおくと、

 δ/ δθ( θ^T X^T X θ)=δ/ δθ(A^T A)

=δA/ δθ ・δ/ δA (A^T A)

=X^T 2A = 2X^TXθ

 

また、

δ/ δθ (y^T  X θ) = (y^T X)^T =  X^T y 

 

よって、

ΔMSE = 2/ m * X^T・(X θ - y)

のようになる。

 

まとめ

行列の微分って慣れないから難しい。

間違えがあったら、指摘お願いします。

 

※分数の書き方汚くて、ごめんなさい。それでもなんとか伝わること信じてます。

届け、この想い。