Naomi's notebook

Naomi's notebook

某機械学習の授業まとめ

<某機械学習>(検索よけのためここは後ほど記入する)という東大前期教養課程の授業を履修するのでどのような授業なのかメモしていく
もちろん板書をそのまま載せるのは著作権的にまずそうなので、板書を見ないで思い出したり調べたりして書く。

一日目、二日目

基本的な要素(最小二乗回帰、正則化、ホールドアウト法、交差検証など)についての説明

最小二乗回帰とは

変数xとyの関係を求める

f(x)=ax+bとして、y=f(x)でyの値が求められるようにしたい。
\sum_{i=1}^{n}\left(y_{i}-\left(a x_{i}+b\right)\right)^{2}が最小になるようなa,bを求める。この関数を目的関数という。

一般化:(x_1,x_2,\dots,x_d)^Tとyの関係を求める

f(x)=< \mathbf{w}, \mathbf{x} > (w_dは常に1としてbの働きをさせる。バイアス項という。)
J(\mathbf{w})=\sum_{i}\left(y_{i}-\sum_{j} w_{ij} x_{j}\right)^{2}
=J(\mathbf{w})=\sum_{i}\left(y_{i}-\sum_{j} <\mathbf{w} , \mathbf{x_{i}}>\right)^{2}
X=x_{ij}を要素に持つ行列 とすると、\sum_{i}\sum_{j} <\mathbf{w} , \mathbf{x_{i}}>は Xw よって
=\sum_{i} y_i^2 - 2 < y , Xw> + ||Xw||^2

=|| \mathbf{y}-\mathbf{Xw} ||^2



この目的関数を最小化するような\mathbf{w}を求めたい。このとき、w_kについて偏微分すると

\frac{\partial J}{\partial w_k}=-\sum_{i}((y_{i}-<\mathbf{w} , \mathbf{x_{i}} >) \times 2x_{ik} )==2\sum_{i} \left(y_{i}x_{ik}-\sum_{j} <\mathbf{w} , \mathbf{x_{i}}>x_{ik}\right)

ベクトルwすべてについて偏微分する。

ここで、X^T=xjiについて考えると、行方向がkになり、ベクトルに左からかけてもkを残すことができるので

\frac{\partial J}{\partial w}=2X^Ty-X^TXw

これが\vec{0}になる時について考えれば(少なくとも局所的な)解が見つかる

\Leftrightarrow X^Ty=X^TXw

\Leftrightarrow w=\left(X^{\top} X\right)^{-1} X^T \mathbf{y}



https://risalc.info/src/inverse-matrix.html

正則化

J'(w)=J(w)+(正則化項)

L1正則化項…\lambda \sum_{j}\left|w_{j}\right|

この正則化項はw=0のところで連続ではないので微分できない。

→近接勾配法:勾配にProximal Operatorをかけることで微分できない部分の微分を考えなくていいようにする・

重みの更新には編微分すると\frac{\partial J}{\partial w}=2X^Ty-X^TXw+\lambda(w!=0) 0のときは先ほどの考えで別に考える。

proximal operatorによりパラメータの一部を完全に0にする働きがあるらしい(よくわからん)



L2正則化項…\lambda\langle\mathbf{w}, \mathbf{w}\rangle=\lambda ||w||^2

微分すると\frac{\partial J}{\partial w}=2X^Ty-X^TXw+ 2 \lambda w

・L2ノルムは[微分](http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC)可能であり解析的に解ける

リッジ回帰…L2正則化項のみ

LASSO回帰…L1正則化項のみ

Elastic Net…両方の項を持ち、それぞれ別のハイパーパラメータ\lambdaを決定する





交差検証

・ホールドアウト法

trainとtest(valid)を分割してから、trainで訓練してtestで評価を行う

• K回交差検証

データをK個に分け、testを変えて残りでtrainしたものの評価を繰り返し、平均で最終的な評価をする

• 反復無作為抽出検証

全てのデータを使うとは限らないが、trainとtestを反復のたびにデータから無作為に抽出して作る。

• LOO交差検証

K回交差検証のKをデータ数と同じにしたもの。つまり一回の評価で使うtestデータは一つだけ。









実装

もちろん全てのコードを乗せると私の提出が失格になったりしそうなので(単位は取りきっていてなくても構わないのだが一応)一部分だけ載せるj。
まず殆どライブラリを使っているだけなのであまり意味もない。