🐈

Act 18. 勾配降下法の復習

2024/11/18に公開

はじめに

Act 01. AIで外国為替を自動売買するまでの道のりをベースに学習を進めて行く。

今まで線形回帰とロジスティック回帰について学習してきた。
どちらの回帰分析でも勾配降下法を使って回帰モデルの学習をしたと思う。

何個か前の記事で勾配降下法について書く機会があったが、その時はYouTubeを参照にしたため、あまり自分の頭に入っていなかった。

ということでこの記事で改めて勾配降下法について学習していこうと思う!

勾配降下法

勾配降下法を使って回帰係数や切片を求めるまでの流れについて自分なりに説明していく。
まずはおさらい。

y = w_1x_1 + w_2x_2 + \dots + w_nx_n + b
  • w_1, w_2, \dots, w_n : 回帰係数(重み)
  • x_1, x_2, \dots, x_n : 特徴量(説明変数)
  • b : 切片

式全体は、特徴量 x_1, x_2, \dots, x_n を使って y を予測するための線形回帰モデルを表している。

今回は、説明変数が2つ(例えば、部屋の広さと築年数)あると仮定して記事を書いていく。
つまり y = w_1x_1 + w_2x_2 + b の場合。

  • x_1: 1つ目の特徴量(例:部屋の広さ)
  • x_2: 2つ目の特徴量(例:築年数)
  • w_1, w_2: それぞれの特徴量に対応する回帰係数(重み)

1. 損失関数

回帰モデルでは、予測値 y_{\text{pred}} と実際の値 y_{\text{true}} の誤差を最小化するために、損失関数を定義する。
通常、回帰分析では、平均二乗誤差(Mean Squared Error: MSE) や最小二乗誤差を損失関数として使用する。

今回は平均二乗誤差で説明する。

\text{損失関数} = \frac{1}{N} \sum_{i=1}^{N} (y_{\text{pred}_i} - y_{\text{true}_i})^2

予測値 y_{\text{pred}} と実際の値 y_{\text{true}} の誤差は正と負どちらの数値にもなり得るため、2乗することで正の値のみを扱うようにする。

データが200個ある場合、iは1~200までとなり、順に予測値と実際の値の誤差を求めていく。
そして最後にすべてを足し、N(200)で割ることで平均二乗誤差を求める。

この損失関数は、モデルパラメータ w_1, w_2, b に対して非線形な曲面のような形状になる。
勾配降下法はこの曲面に沿って進み、損失関数が最も小さいパラメータを探すために使われる。

損失関数が最も小さいか否かを求めるために使用するのが勾配降下法。

2. 勾配の計算

勾配降下法を使って最適な w_1, w_2, b を求める場合、それぞれのパラメータに対して損失関数を微分する。
なぜ微分するのか。それは勾配の傾きを求めるため。(微分についてはコチラを参照)

傾きが0の場所は、勾配が最も小さくなり、適切な回帰係数や切片を求めるにふさわしい箇所。
以下の図のように赤点がどんどん勾配を降下していくため、勾配降下法という。

実際に損失関数(MSE)を微分した場合、式はどのようになるのか。
例えば、説明変数が2つの場合、損失関数 MSE を w_1w_2b で偏微分すると次のようになる。

\frac{\partial \text{MSE}}{\partial w_1} = -\frac{2}{N} \sum_{i=1}^N (y_{\text{pred}_i} - y_{\text{true}_i}) \cdot x_{i1}
\frac{\partial \text{MSE}}{\partial w_2} = -\frac{2}{N} \sum_{i=1}^N (y_{\text{pred}_i} - y_{\text{true}_i}) \cdot x_{i2}
\frac{\partial \text{MSE}}{\partial b} = -\frac{2}{N} \sum_{i=1}^N (y_{\text{pred}_i} - y_{\text{true}_i})

MSEの微分が以下の通りになるのは何となくわかると思う。

-\frac{2}{N} \sum_{i=1}^N (y_{\text{pred}_i} - y_{\text{true}_i})

では w_1w_2 の偏微分で x_1x_2 をかけているのはなぜか。
元々の式を見たら分かるが、w_1x_{i1} は掛け算されている。
つまり、w_1 を変えるとき、x_{i1} の大きさによって、予測値 y_{\text{pred}_i} の変わり方が違ってくることになる。

たとえば

  • x_{i1} が大きければ、少し w_1 を変えるだけで y_{\text{pred}_i} が大きく変わる。
  • x_{i1} が小さければ、同じだけ w_1 を変えても y_{\text{pred}_i} はあまり変わらない。

w_1 がMSEに与える影響は x_{i1} の影響を大きく受けることになるため、偏微分すると x_{i1} が登場することになる。

3. パラメータの更新

勾配が計算できたら、w_1w_2b の値を少しずつ動かしていく。
これにより、損失関数を小さくする方向に進める。

それぞれの回帰係数 w_1, w_2, \dots, w_n と切片 b に対して、以下のように勾配を使って更新していく。

w_1 = w_1 - \alpha \cdot \frac{\partial \text{MSE}}{\partial w_1}
w_2 = w_2 - \alpha \cdot \frac{\partial \text{MSE}}{\partial w_2}
b = b - \alpha \cdot \frac{\partial \text{MSE}}{\partial b}
  • \alpha:これが「学習率」で、どのくらいのステップで動かすかを決めるパラメータとなる。山道を降りる際に「大きく一歩踏み出す」か「小さく一歩踏み出す」か、というようなイメージ。
  • -:マイナス符号は、勾配の「反対方向」に進むために使う。損失を減らしたいので、勾配の逆方向に行く必要がある。

パラメータを更新した後は、また「1. 損失関数」からやり直し。
これを何度も繰り返すことで、損失関数が小さくなる方向へ少しずつ進んでいき、最終的には最適な w_1w_2b にたどり着く。

さいごに

前回も学習したないようなので少し説明を省いたが、個人的にはこれで結構理解できた気がする。

今後も出てくる可能性があるため、しっかりと頭に入れておこうと思う。

損失関数⇒勾配の計算⇒パラメータの更新⇒損失関数・・・ヨシ!

ではまた

Discussion