JUNのブログ

JUNのブログ

活動記録や技術メモ

チコノフ(Tikhonov)の正則化を試してみた

プログラミングのための線形代数 を読んでいるのですが, そこでチコノフ(Tikhonov)の正則化というのが紹介されていたので試してみました

チコノフの正則化とはどういうものかというと,

とある画像  \bf{x} があったとして,

f:id:JUN_NETWORKS:20190907215106p:plain
画像  \bf{x} 画像はこちらからお借りしました

画像をぼかす以下のような行列Aがあったとする.


A = \begin{bmatrix}
0.40 & 0.24 & 0.05 & 0.00 & 0.00 \\\ 
0.24 & 0.40 & 0.24 & 0.05 & 0.00 \\\
0.05 & 0.24 & 0.40 & 0.24 & 0.05 \\\
0.00 & 0.05 & 0.24 & 0.40 & 0.24 \\\
0.00 & 0.00 & 0.05 & 0.24 & 0.40
\end{bmatrix}

それらで  \bf{y} = A\bf{x} を行った場合, 画像はこのような形でボケた.

f:id:JUN_NETWORKS:20190907215201p:plain
 \bf{y} = A\bf{x} で得た  \bf{y}

このボケた画像  \bf{y} を元に戻すには逆行列  A^ {-1} を求めて,  \bf{x}=A^ {-1} \bf{y} とすれば元画像  \bf{x} が得られる

f:id:JUN_NETWORKS:20190907215517p:plain
 x=A^ {-1} \bf{y} で得た 画像 \bf{x}

綺麗に復元出来てますね.

しかし, ぼかした画像 \bf{y} に微小なノイズ \bf{\epsilon} が加わった 画像 \bf{y'} = \bf{y} + \bf{\epsilon} \bf{x}=A^ {-1} \bf{y} で復元しようとすると...

f:id:JUN_NETWORKS:20190907220221p:plain
微小なノイズ  \bf{\epsilon} が加わった  \bf{y'}

f:id:JUN_NETWORKS:20190907220404p:plain
 A^ {-1} \bf{y'} で復元した 画像 \bf{x'}

ありゃま...復元時にノイズが大きくなってしまいました...

チコノフ(Tikhonov)の正則化

方針

  •  A\boldsymbol{x} \boldsymbol{y} との食い違いを測る.
  •  \boldsymbol{x} 自体の もっともらしさ を測る. あるいは, 同じことだが,  \boldsymbol{x}不自然さ を測る.
  • 食い違い不自然さ の合計値が最小になるような  \boldsymbol{x} を答える

 \boldsymbol{x} = A^{-1}\boldsymbol{y} では食い違いは0だが, 得られた画像  \boldsymbol{x}不自然さがひどかった. 食い違い不自然さ のバランスを取ればもっと良い画像が手に入る

 A^{-1}\boldsymbol{y}長さ | A^{-1}\boldsymbol{y} | を用いて 食い違い を測る  \boldsymbol{x}長さ | \boldsymbol{x} | を用いて不自然さを測る

正の定数 \alphaを何か設定して | A\boldsymbol{x} - \boldsymbol{y} |^{2} + \alpha| \boldsymbol{x} |^{2} が最小になる  \boldsymbol{x} を求めると,  \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} になっています. これがチコノフ(TIkhonov)の正則化.

的なことがに書いてありました.

ではやってみましょう

f:id:JUN_NETWORKS:20190907222141p:plain
 \alpha=0.3 \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} で復元

元画像よりはノイズが減りましたね.

 \alpha を変えると...

 \alpha = 0.1

f:id:JUN_NETWORKS:20190907222421p:plain
 \alpha=0.3 \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} で復元

明るくなった(元の \bf{x}に近づいた)けど, ノイズが  alpha=0.3 の時より大きくなってしまった

 \alpha=0.5

f:id:JUN_NETWORKS:20190907223013p:plain
 \alpha=0.5 \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} で復元

 \alpha=0.3 のときよりノイズは減りましたが, ボケた画像( A^{-1}\bf{x})に近くなってしまいました.


とまぁこんな感じです. 本当はもっと上手にぼかしたり復元したりできるかもだけど, そこまで試してないというのと, はてなブログtex書くのがしんどくてそこまでする気力がありませんでした.

コードは全部Pythonで書いたんですけど, 別にそこまで見せる必要も無いですし, やみかさんの記事 にチコノフの正則化のコードと解説があるのでそっち見てください. 僕が書いたのと同じ感じです.

あと, 詳しい説明とか知りたい人はこれ見てください.

owatank.hatenablog.com

あと, 調べててわかったんですけど, チコノフの正則化って別名 L2正則化 っていうらしいですね. 一気に馴染みのある感じになりましたね. これが言いたかった.

そんで, wikipedia にこんなこと書いてありました.

1943年に Andrey Nikolayevich Tikhonov が、L2 正則化をより一般化した Tikhonov 正則化を逆問題に対する手法として発表した

正則化 - Wikipedia

逆問題に対するL2正則化がTikhonovの正則化なんすねぇ〜

と適当な感じで記事を書いてみたのですが, 間違ってるところとかあれば指摘してください. 結構喜びます.

それではまた. ばいばい.