0
0

More than 1 year has passed since last update.

SGD Estimator

 Stochastic Gradient Descentを用いたRegressorとClassifierの解説といっても、すこし最適化に触れたことのある方なら特に読む必要のないものですが、一応実装はした(現在Regressorのみ。Classifierの場合の損失関数が少し面倒だったので…)ので書きたいと思います。

アルゴリズム

 線型モデルなので、学習するパラメータは、係数(D要素のベクトル)$w$と切片$d$のみです。つまりは重回帰と同じような出力なので、入力 $X$ とNxD行列としたときに、

  1. サンプルを一つ $x_i$ 選ぶ(シャッフルしてあたまから重複を許さず順に、もしくは重複を許して毎回選ぶ)
  2. サンプル $x_i$ 、係数、切片で予測値を算出。$\tilde{y} = w * x_i + d$
  3. 損失 $L$ を計算する
  4. パラメータを更新
    • $w = w - \eta * \frac{\partial L}{\partial w}$

をNサンプル分繰り返し、さらにそれを規定回数繰り返します。

損失関数

 これでほぼ終わりのような気がしますが、いくつか損失関数とその微分された場合の式を見たいと思います。ここで、$\tilde{y} = w * x_i + d$ で計算されます。また、$Z_\theta = \partial Z / \partial \theta$とします。ただし、分類の場合は$0,1$でなく$-1,+1$に変換したものを入力しています。

二乗誤差

\begin{align}
L   &= (y-\tilde{y})^2 / 2 \\
L_w &= - \tilde{y}_w (y-\tilde{y}) = - x (y-w * x_i - d) \\
L_d &= - \tilde{y}_d (y-\tilde{y}) = -   (y-w * x_i - d)
\end{align}

Huber損失

\begin{align}
L   &= \biggl\{ \begin{matrix}
 (y-\tilde{y})^2 / 2 \\
 \delta(|(y-\tilde{y})| - \delta / 2), \hspace{10pt} if (y-\tilde{y})^2 / 2 > \delta\\
\end{matrix}\\

L_w &= \biggl\{ \begin{matrix}
 - x (y-w * x_i - d) \\
 \biggl\{ \begin{matrix}
 +\delta x , \hspace{10pt} \text{if  } y-\tilde{y}>0\\
 -\delta x, \hspace{10pt} others \\
\end{matrix}, \hspace{10pt} if (y-\tilde{y})^2 / 2 > \delta\\
\end{matrix}  \\

L_d &= \biggl\{ \begin{matrix}
 - (y-w * x_i - d) \\
 \biggl\{ \begin{matrix}
 +\delta , \hspace{10pt} \text{if  } y-\tilde{y}>0\\
 -\delta, \hspace{10pt} others \\
\end{matrix}, \hspace{10pt} if (y-\tilde{y})^2 / 2 > \delta\\
\end{matrix} 
\end{align}

epsilon_insensitive

\begin{align}
L   &= max(0, |y-\tilde{y}| - \delta) \\

L_w &= \biggl\{ \begin{matrix}
+x , \hspace{10pt} \text{if  } y-\tilde{y}>0 & L>0\\
-x, \hspace{10pt} \text{if  } y-\tilde{y}<0 & L>0\\
0, \hspace{10pt} L<=0 \\
\end{matrix} \\

L_d &= \biggl\{ \begin{matrix}
+1 , \hspace{10pt} \text{if  } y-\tilde{y}>0 & L>0\\
-1, \hspace{10pt} \text{if  } y-\tilde{y}<0 & L>0\\
0, \hspace{10pt} L<=0 \\
\end{matrix}
\end{align}

squared_epsilon_insensitive

\begin{align}
L   &= max(0, (y-\tilde{y})^2/2 - \delta) \\

L_w &= \biggl\{ \begin{matrix}
- x (y-w * x_i - d) \hspace{10pt} \text{if  } L>0\\
0, \hspace{10pt} \text{if  } L<=0 \\
\end{matrix} \\

L_d &= \biggl\{ \begin{matrix}
- (y-w * x_i - d) \hspace{10pt} \text{if  } L>0\\
0, \hspace{10pt} \text{if  } L<=0 \\
\end{matrix} \\
\end{align}

hinge

\begin{align}
L &= max(0, 1-y * \tilde{y}) \\

L_w &= \biggl\{ \begin{matrix}
- y * x_i \hspace{10pt} \text{if  } L>0\\
0, \hspace{10pt} \text{otherwise} \\
\end{matrix} \\

L_d &= \biggl\{ \begin{matrix}
- y \hspace{10pt} \text{if  } L>0\\
0, \hspace{10pt} \text{otherwise} \\
\end{matrix} \\
\end{align}

log_loss

\begin{align}
L &= \log(1+\exp(-y * \tilde{y})) \\
L_w & = (xy\exp(-y * \tilde{y}))/(1+\exp(-y * \tilde{y})) \\
L_d & = (y\exp(-y * \tilde{y}))/(1+\exp(-y * \tilde{y})) \\
\end{align}

log

 log_lossと同じ

squared_hinge

\begin{align}
L &= max(0, 1-y * \tilde{y})^2 \\

L_w &= \biggl\{ \begin{matrix}
- 2y * x_i \hspace{10pt} \text{if  } L>0\\
0, \hspace{10pt} \text{otherwise} \\
\end{matrix} \\

L_d &= \biggl\{ \begin{matrix}
- 2y \hspace{10pt} \text{if  } L>0\\
0, \hspace{10pt} \text{otherwise} \\
\end{matrix} \\
\end{align}

perceptron

\begin{align}
L &= |\tilde{y}| \\
L_{w} &= w + sign(w*x+b) \\
L_{b} &= b + sign(w*x+b) \\
\end{align}

modified_huber

($y * \tilde{y} > 1$の場合はsquared hinge lossと同じのため、スキップ)

\begin{align}
L &= \biggl\{ \begin{matrix}
max(0, 1-y * \tilde{y})^2, \hspace{10pt} \text{if} \hspace{5pt} y * \tilde{y} > 1\\
- 4 y * \tilde{y}, \hspace{10pt} \text{otherwise} \\
\end{matrix} \\
L_{w} &= -4y * x\\
L_{d} &= -4y \\
\end{align} 

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0