SGD Estimator
Stochastic Gradient Descentを用いたRegressorとClassifierの解説といっても、すこし最適化に触れたことのある方なら特に読む必要のないものですが、一応実装はした(現在Regressorのみ。Classifierの場合の損失関数が少し面倒だったので…)ので書きたいと思います。
アルゴリズム
線型モデルなので、学習するパラメータは、係数(D要素のベクトル)$w$と切片$d$のみです。つまりは重回帰と同じような出力なので、入力 $X$ とNxD行列としたときに、
- サンプルを一つ $x_i$ 選ぶ(シャッフルしてあたまから重複を許さず順に、もしくは重複を許して毎回選ぶ)
- サンプル $x_i$ 、係数、切片で予測値を算出。$\tilde{y} = w * x_i + d$
- 損失 $L$ を計算する
- パラメータを更新
- $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}
以上