ラッソ回帰から超解像へ

この記事は苫小牧高専アドベントカレンダー2019 10日目の記事です。

# はじめに

本投稿ではスパース性という観点から超解像についての説明をしていきます．

まずは，スパースモデルの基本的なラッソ回帰についての説明を行い，その後，sparse coding，辞書学習，超解像という流れで進めていきます．

# スパース性
スパースは日本語で疎という意味です．従ってスパース性は疎性と訳すことができます．これはつま
り，まばらであるということを指し，機械学習においては「多くの変数のうちほとんどがゼロで一部だけが非ゼロの値とといるということ」[^1]を意味しています．

一般にモデルを作成する時にモデルの構造が単純でありながら，高い予測精度を持つようなモデルが良いモデルとされています．
このようなモデルを作る際にスパース性を使用して学習をさせることがあり，このようなモデルをスパースモデルと言います．

では，代表的なスパースモデルとしてラッソ回帰について見ていきましょう．

# ラッソ回帰
ラッソ回帰は以下の関数を最小化するような回帰のことです．ここでは$y$を教師ラベル，$X$を入力データ，$w=(w_0,w_1,...,w_d)$をパラメータとしています．

$$
L=\frac{1}{2} || y-Xw||^{2}+\lambda |w|
$$
$|w|$をペナルティとして加えているので，$L$を最小化を行うと，必要のない変数の係数がゼロになり，スパース性を確保することができます．
この目的関数は解析的に処理することができ，計算をしていくと

$$
-\lambda \leq \sum^n_{i=0} \bigl( y_i-w_0-\sum_{j \neq k} x_{ij}w_j \bigr) \leq \lambda
$$

が求められます[^2]．この不等式を満たす時$w_k$が0になります．ペナルティー項の$\lambda$が多いいほど，$w_k$が非ゼロの値を取りづらくなるというのは直感と一致する結果と言えます．


# Sparse coding 
上記のようなスパース性を画像処理も分野に応用することができます．

Sparse codingでは画像の辞書を作成して，その辞書のできるだけ少ない成分を利用することによって画像を行います．

Sparse codingとラッソ回帰ではどちらもできるだけ少ない基底によって目標を達成したいという点において共通していると言えます．

ラッソ回帰においてはできるだけ少ない$x=(x_1,x_2,...,x_d)$の合成によって回帰を行おうとしており，Sparse codingではできるだけ少ない画像基底を使用することによって画像を生成しようとしています．

続いて辞書について説明をしていきます．

## 辞書
Sparse codingにおいては画像の基底となる辞書を作成する必要がありました．

<div style="text-align: center;">

<img width="316" alt="global_dict.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278436/8ecf2db1-bb44-325a-4bfe-1faa655001f2.png" >






これが画像の辞書です．画像は[こちら](https://www.egr.msu.edu/~aviyente/elad06.pdf)から引用しました．
辞書を構成している各成分が画像基底となっており，これを組み合わせることによって画像を作ることができます．

辞書の作成にはk-SVD[^3]というアルゴリズムが用いられることが多いようです．k-SVDはSVD(特異値分解)を各列ごとに適応したもののようです．
SVDに関しては[こちら](https://qiita.com/sakami/items/d01fa353b4e1f48623a8)をみていただくとよく分かると思います．

## 具体例
ここからはsparse codingを用いた具体例を紹介していきたいと思います．

### ノイズ除去
Sparse codingを使用してノイズ除去を行うことができます．詳しい内容は[この論文](https://www.egr.msu.edu/~aviyente/elad06.pdf)にて説明されています（ここに関してはおいおい追記していきます…）．

この論文でしていることは超ざっくりいうと，ノイズが入った画像に対してSparse codingを行うことによってノイズの除去を行っています．

### 超解像
Sparse codingと辞書学習を組み合わせることによって超解像を行うこともできます．

超解像とは低解像度の画像から高解像度の画像を出力することです．
詳しくは[この論文](http://www.columbia.edu/~jw2966/papers/YWHM10-TIP.pdf)で初回されています．

ここで行われていることは高解像度用の辞書と低解像度のようの辞書を同時に学習させることによって超解像を実現させています[^4]（ここも詳しくはまた更新します）．

# CNNによる超解像[^5]
以上のようにSparse codingを使用することによって超解像を実現させることが可能ですが，上記の方法では高解像度の画像を得るのに最適化計算を繰り返し適応する必要があり，リアルタイム処理に向いていません．

そこで，[CNNを用いた超解像の方法](https://arxiv.org/pdf/1501.00092.pdf)が提案されました．

モデルの構成は以下のようになっています．

<img width="682" alt="cnn.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278436/a83915a5-fdd6-c096-b531-0fc692242d93.png">
このモデルは2層のCNNに寄って構成されており，これはSparse codingと辞書学習を組み合わせたものと考えることができます．

最初のそうによって画像の辞書が作成されます．これは一般的なCNNが持つ性質と言えます．CNNは入力に近い層において画像のエッジなどを検出するフィルタを構成することがしられており，これは辞書学習に対応していると考えられます．

実際に学習された1層目の各フィルタは

<img width="446" alt="cnn_filter.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278436/9467db6e-1724-66e8-8fe5-9bb3432e4cae.png">


のようになっています．

そして，第一層から第二層にかけて非線形変換が行われ，そして，再構築が行われます．


# 実験結果
今回はCNNを用いた超解像を実装してみました．結果は以下のようになっています．

<img width="932" alt="result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278436/b60a504c-714c-4488-b7b9-89e3c244e886.png">


左の画像を入力として，右の画像を出力することに成功したました．

# まとめ
スパース性という観点からラッソ，sparse coding，超解像についてまとめてみました．まだまだ理解が足りていない部分が多いので，詳細については随時更新していきます．


[^1]: スパース性に基づく機械学習
[^2]: 機械学習のエッセンス
[^3]:  M. Aharon, M. Elad, and A. M. Bruckstein, “The K-SVD: An algorithm for designing of overcomplete dictionaries for sparse representation,” IEEE Trans. Signal Process., to be published.
[^4]: Yang, J., Wright, J., Huang, T.S., Ma, Y.: Image super-resolution via sparse representation. IEEE Transactions on Image Processing 19(11), 2861–2873 (2010)
[^5]:  C. Dong, C. C. Loy, K. He, and X. Tang. Image super-resolution using deep convolutional networks. IEEE Transactions on Pattern Analysis and Machine Intelligence, 38(2):295–307, 2016.