投稿

4月, 2019の投稿を表示しています

ガウスカーネルでl1正則化付き回帰をやってみる

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 前回はガウスカーネルモデルで$l2$正則化をつけた最小二乗回帰を行いました。 ガウスカーネルでl2正則化付き最小二乗回帰をやってみた $l2$正則化であれば正則化項が微分可能なので特に難しいことはなく、ラグランジュの未定乗数法で解くことができました。 今回は基本的なモデルはガウスカーネル回帰で固定して、正則化項の部分だけ$l1$正則化に変えてみましょう。 $l2$正則化に比べて$l1$正則化は得られる解がスパースになりやすいという特徴があります。 解がスパースというのは、成分が0になっている要素が多い、という意味です。 解がスパースであれば、重みが非零の部分の特徴だけ見ればいいので効率的ですし、そもそも特徴のなかであまり予測に必要のないものをあぶり出すなどの分析にも役立ったりします。 しかし、$l1$正則化を用いた場合は、原点で正則化項が微分不可能なのでラグランジュの未定乗数法がそのまま適用することができません。 今回は拡張ラグランジュ関数を使って、交互方向乗数法によって$l1$正則化をつけたガウスカーネルの最適化を行ってみます。 ### 問題設定 $$ \min_{\theta} \frac{1}{2}|K\theta - y|^2 + \lambda |\theta| $$ をときます。 ただし$\bm K$はグラム行列とし、$\lambda$は正則化係数とします。 ### 拡張ラグランジュ関数と交互方向乗数法 $$ \min_{\bm{\theta,z}} f(\bm \theta) + g(\bm z) $$ $$ \mathrm{s.t.}\ \bm{A\theta} + \bm{Bz} -\bm c = \bm 0 $$ を解くためのアルゴリズムです。 この時、 拡張ラグランジュ関数を $$L(\bm{\theta,z,u})= f(\bm \theta)+g(\bm z)+ \bm u^T(\bm{A\theta} + \bm{Bz} - \bm c) + \frac{1}{2} |\bm{A\theta} + \bm{Bz…

leave-one-out cross-validation(LOOCV,一個抜き交差検証)を線形回帰モデルに

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 今回は交差検証、cross validationについて書いてみます。 ### validation cross validationは、機械学習モデルの汎化性能を検証するためのもので、一般的にはK分割交差検証(K-fold cross validation)を指します。 これは、訓練データセットをK分割し、一つのグループ以外の(K-1)個のかたまりでモデルを学習し、残りの一つのグループで性能を評価します。 これをK回、すなわち性能評価用のデータを毎回変えながら実験し、最後にK回の性能評価を平均して最終的な出力とします。 他にも、ホールドアウト検証というものもあります。 これは評価用のデータは固定されていて、性能評価を平均したりはしません。 交差していないので交差検証には含まれないです。 検証のためのデータを学習に使えないので、K-foldよりデータを有効に使えていないイメージです。 今回焦点を当てるのは一個抜き交差検証(leave-one-out cross-validation)です。 これは、K-foldのKをデータ数と同じ個数にしたものと等しいです。 つまり、訓練データ一つを選び、それ以外のデータで学習して最後に一つの評価データで評価します。これを全データで繰り返し行い最後に評価を平均します。 データセットを無駄にせずに余すことなく使っているかんじですが、想像するとわかる通り学習に時間がかかるのが難点です。(データの個数回の学習が走るので) そのためあまり一個抜き交差検証は実用的ではありませんが、線形回帰モデル(l2正則化つきでも)だと汎化性能を解析的に求めることができます。 ### 線形回帰モデルで一個抜き交差検証 線形回帰モデル(l2正則化つき)はこのようなモデルです。 $$f(x) = \sum_i^d \theta_i \phi(x_i) $$ $$\min \sum_i^n|y_i-f(x_i)|^2 + \lambda|\theta|^2$$ 一個抜き交差検証は、それぞれ一つずつデータを抜いて上のモデルを学習して、そ…

ガウスカーネルでl2正則化付き最小二乗回帰をやってみた

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 ガウスカーネルモデルで最小二乗回帰を実装してみました。 grid searchをしてハイパーパラメータをチューニングするところまでやってみます。 ### モデル 今回考えるガウスカーネルモデルはこんな感じです。 $$f(x) = \sum_i^n \theta_i k(x,x_i)$$ $$k(x_i,x_j) = \exp(-\frac{||x_i-x_j||^2}{2h^2})$$ 学習するべきパラメータは各$\theta_i$で、$h$はガウス幅と呼ばれるハイパーパラメータです。 普通の線形回帰は $$f(x) = \sum_i^d \theta_i \phi_i(x)$$ というように、入力の次元$d$個のパラメータ数でモデルが表現されますが、カーネルモデルではデータの個数である$n$個のパラメータで表現されます。予測時にも訓練データを使用するため、モデル自体が学習用データを保持し続ける必要があるのが特徴です。(ノンパラメトリック、とか言われたりします。) パラメトリックなモデルでは、訓練に用いたデータは一度重みが学習されれば廃棄されます。 線形回帰と同様にパラメータに対しては線形なので線形モデルともいえそうですが、その辺は曖昧なのかよくわかりません。 データの個数が多いとそれだけ表現力が増していくようなモデルになっていることがわかると思います。 $k(x_i,x_j)$の部分はカーネル関数といって、入力$x_i,x_j$の近さを計算するようなものになっています。 今回はガウスカーネルを使っているので上のような定義になっていますが、ここは他にもいくつかのカーネル関数が使用できます。 今回はこれにl2正則化を付け加えた以下のモデルで、最小二乗回帰をしようと思います。 $$f(x) = \sum_i^n \theta_i k(x,x_i) $$ $$\min \sum_i^n|y_i-f(x_i)|^2 + \lambda|\theta|^2$$ $\lambda$は正則化係数で、ハイパーパラメータです。 ### きもち ちょっと横道…

Azureでno space left on deviceと言われた時の対処法

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 Azureのdeep learning virtual machinesで深層学習モデルを学習させているところ、no space left on deviceとエラーがでて止まってしまいました。 エラーをよく見てみると、各エポック終了時に自動でモデルのスナップショットをファイルに吐き出すように実装していて、その出力部分でエラーが出ているとのことでした。 modelのスナップショットをファイルにしようにも容量が足りないのでできません、というエラーです。 今回はこれを受けてazureのvirtual machineにデータディスクを増やして対処したので、そのログを残しておこうと思います。 ### 容量確認 ```bash df -h ``` と打つとどこの容量がどれくらい使われているのかが確認できます。 ```bash Filesystem Size Used Avail Use% Mounted on udev 28G 0 28G 0% /dev tmpfs 5.6G 9.0M 5.5G 1% /run /dev/sda1 291G 27G 264G 10% / tmpfs 28G 0 28G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 28G 0 28G 0% /sys/fs/cgroup /dev/sdc1 99G 94G 0 100% /data /dev/sdb1 335G 67M 318G 1% /mnt tmpfs 5.6G 0 5.6G 0% /run/user/1003 ``` `/dev/sdc1 99G 94G 0 100% /data`のところをみると、100%になってて怪…

Pythonのsignatureをつかって機械学習モデルのfactoryクラスを作るTips

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 研究とか実験する際に、複数のmodelをパラメータでとっかえひっかえして実験したい、みたいな状況はよく起こると思います。 比較実験とかをする場合には使用するmodelの部分だけ変更するわけで、この辺りを綺麗に書けると取り回しが良くなって実験がはかどります。 自分なりにこの辺りをうまく書けるように工夫してみているので、そのtipsをまとめようと思います。 ### 辞書オブジェクトによる実装 デザインパターンの中に、factoryパターンというものがあります。 (デザインパターンは、アプリなどのクラス設計のお手本となる典型パターン、みたいなもので自分もしっかり勉強できているわけではないのですが...) factoryパターンでは、機械学習モデルを作成するFactoryクラスを用意します。 Facotryクラスは、modelを表す文字列を受け取って指定されたmodelを返すように実装します。 一番簡単なのは辞書オブジェクトに則ってインスタンスを作成して返す、みたいな実装だと思います。 ```python from lib import ModelA,ModelB class ModelFactory:: def __init__(self): pass def run(self,str_for_model): str2model = { "model_a": ModelA(), "model_b": ModelB() } if str_for_model not in str2model.keys(): raise Exception("Invalid string for model.") return str2model[str_for_model] ``` ですが、機械学習モデルにはハイパーパラメータを持つものがあります。持たないもの…

scale random cropをKerasのImageDataGeneratorを継承して実装

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 Kerasの ImageDataGenratorには色々画像に関連する前処理をやってくれる機能が入っていて便利なのですが, random cropがなくて困ったので自作しました。 と言ってもrandom crop自体は僕が一から書いたわけではなく、[KerasのImageDataGeneratorを継承してMix-upやRandom Croppingのできる独自のジェネレーターを作る - Qiita](https://qiita.com/koshian2/items/909360f50e3dd5922f32)を参考にして書きました。 ただ、この実装だとrandom cropするだけで、画像の拡大とかは外側でやらなくてはいけないのであまり綺麗じゃないな、と思ったので改良しました。 受け取ったnumpy配列の画像(画素値は0-255,RGB)をexpand_rateに従って拡大し、元の画像のサイズになるようにrandom cropする、という内容になります。 仕組みとしてはこんな感じ。 1. 元クラスのimage data generatorがまず変換を行う 1. 次に、自作したscale random cropを使うようにする。 画像の拡大をnumpyのままやるのは難しそうだから、他の画像処理系ライブラリを使って拡大してからそれをnumpyに戻して、random cropすればいいと思ってやってみた 最初はこんな感じで書いた ```python dy, dx = original_img.shape[0:2] expanded_img = np.asarray(Image.fromarray(np.uint8(original_img)).resize((int(dy * self.expand_rate), int(dx * self.expand_rate)))) ``` こんな感じでやってた。 元のimage data generatorが先に処理をするので、rescaleが先に入ってしまい、original_imgがすでに0-1になっていて、np…

【論文紹介】Spatial Transformer Networks (NIPS2015)

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 論文読み記事です。 今回はNIPS2015で採択されたSpatial Transformer Networks を読みました。 ### 3行まとめ 画像認識に使われるCNNはmax-poolingなどにより空間的な不変性を実現しているが、その性能は限定的です。 本研究ではSpatial Transformerモジュール(STモジュール)という、画像に対する変換を行うlayerを既存のCNNやDNNに導入することで空間的不変性を実現し、性能向上を図っています。 ### Spatial Transformers 大きく分けて3つのコンポーネントからなります。 * Localisation Network * Parameterised Sampling Grid * Differentiable Image Sampling 全体図はこちら <div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-hEyqKR8H-WQ/XKK8KwxVq-I/AAAAAAAAAiM/oz_mTm087GQAsZnUaNWLSlXCwy-PDRlaACLcBGAs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2019-04-02%2B10.32.39.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://2.…