pix2pixで白黒動画に色をつけてみる

白黒動画のcolorizationをpix2pixを使って行ってみたというのが本記事の主旨 f:id:yusuke_ujitoko:20170625170657p:plain

pix2pixの概要

  • 画像間変換向けの写像関数や誤差関数は,
    従来手法では変換するドメインに応じて個別設計していた。
  • しかし本研究ではGANの手法を利用し,統一的なネットワーク構造や誤差関数の枠組み内で、
    色んなドメイン画像間の変換を学ぶ手法(pix2pix)を提案。

f:id:yusuke_ujitoko:20170625150512p:plain:w500

  • pix2pixでできることとして論文では以下が紹介されている
    • label to street scene
    • aerial to map
    • label to facade
    • day to night
    • BW to Color
    • Edge to Color

f:id:yusuke_ujitoko:20170625150656p:plain

pix2pix2で色付け

↑のうち,BW to Colorを試してみる.
今回は既存の実装を使わせていただいた.

ただしデータセットや学習済みモデルに関しては残念ながら提供されていなかったので,
データセットとしてOpen Images Datasetから5000点ダウンロードしモデルを訓練した.
モデル訓練には3日ほど掛けた.

テストデータとしてはこの動画からフレームを抜き出して使わせていただいた.

テスト結果の一部

f:id:yusuke_ujitoko:20170625164140p:plain かなり赤みがついている

f:id:yusuke_ujitoko:20170625164151p:plain 空は認識されると,ちゃんと青くなる

f:id:yusuke_ujitoko:20170625164235p:plain やはり赤み

一応動画でも限定公開しておく.(音無し)

www.youtube.com

全体的に赤っぽい色味がついた.
データセットが小さいことによる失敗かもしれないと思い,
現在4倍のデータセットを使って再学習中.

ただ,似た先行事例↓においても,鮮明には色がついておらず,また赤みがかった色となっているので,ナイーブにpix2pixを使うとこうなるのかもしれない. www.youtube.com

BatchNormalizationの初出論文メモ

Internal Covariance Shiftの問題

ニューラルネットワークでは,入力となるデータの分布が白色化されていると学習が早く進む. 特徴を無相関化し,平均0,分散1とすることは画像処理では特によく行う.

しかし,階層的なニューラルネットでは,入力層での入力データが白色化されていたとしても, 重みパラメータは更新されていくため,後層では常に分布が変化する入力をもとに学習することになる.
せっかくパラメータを学習しても、新たな入力分布に合わせて再適応させなければならず、無駄となってしまう。 この現象を著者らは, internal covariance shift と呼んでいる.

分布をコントロールしないこのような場合には、勾配消失問題も起きやすくなる。
このときには,

  • 学習率を小さく設定する
  • 重みの初期化を注意深く行う

などの処置を行う必要がある。
そこでこの論文では上記の問題を回避する、Batch Normalizationを提案している。
Batch Normalizationでは以下のように, ミニバッチ内で平均を0に,分散を1にする操作を行う.

f:id:yusuke_ujitoko:20170616154548p:plain:w400

上図の最後の行を見ると, gamma と beta を掛けて細かい調整ができるようになっている. たとえば,Batch Normalizationの効果をキャンセルすることもできる (gamma を標準偏差に設定し,betaを平均に設定する)

ただし,このgammaとbetaは学習できるパラメータとなっているため, 人が自由に決められる訳ではない. 単純に表現力を増やした,という意味と解釈した.

BatchNormalizationには、

  • ミニバッチ単位で平均・分散を正規化するため計算量が小さい
  • ミニバッチ単位で微分可能

という特徴がある。 アルゴリズムはどのようになるかというと

訓練時はミニバッチごとに正規化し、
一方、テスト(inference)時は、全訓練データから学習した情報で正規化したいため、 分散は訓練データの平均、不偏分散を使う。

どこにBatch Norm層を挿入するかというと, 普通は全結合層や畳み込み層の直後で,活性化関数の直前.

MNISTの結果

論文の図をそのままのせる。

f:id:yusuke_ujitoko:20170616154645p:plain

収束が早く、また入力分布は安定しているのがわかる。

読み解けなかった点

regularizationの意味

Batch Normによる正則化の効果を謳う文句がところどころに散見されるが, その正則化の意味がよくわからなかった.

Furthermore, batch normalization regularizes the model and reduces the need for Dropout (Srivastava et al., 2014).

When training with Batch Normalization, a training example is seen in conjunction with other examples in the mini-batch, and the training network no longer producing deterministic values for a given training example.

バッチに含まれる訓練データに依存して各データは正規化されるが, そのバッチの選び方はdeterministicでないため,結果的に訓練データの正規化のされ方もdeterministicではなく, ばらつきがあるので,訓練データの拡張につながって,正則化の効果があるという意味?

Reduce the photometric distortions.の意味

Batch Normのネットワークにおけるテクニックの最後の例として, Reduce the photometric distortionsが紹介されているが, これは訓練データの拡張をあまりしない,という意味?

Because batchnormalized networks train faster and observe each training example fewer times, we let the trainer focus on more “real” images by distorting them less.

(追記)計算グラフによる誤差逆伝播

以下のブログで, 計算グラフで誤差逆伝播を丁寧に解説してある.

Understanding the backward pass through Batch Normalization Layer

ResNetは様々な長さのパスをもつネットワークのアンサンブルとみなせる

ResNetの初出の論文を読んだが、 なぜ深層の学習がうまく行ったのか不明瞭だった。
本論文ではその「なぜ?」の部分に対する解釈を与えている。
この解釈は興味深く感じる。

概要

  • ResNetの新たな解釈を提案
    • ResNetは様々な長さの多くのパスの集合体
    • 深層の学習を短いパスだけを使って行っている。
  • ResNet内の様々なパスを明示的に展開した上で実験
    • アンサンブル学習の振る舞いを観測
    • 長いパスの部分は学習に寄与しない
    • 短いパスが重要
      • 勾配消失問題を避けている。

パスの展開

ResNetは、畳み込みとskip connectionの2通りのパスをもつ各モジュールが積み重なっている。
このパスを明示的に以下のように展開することができる。

f:id:yusuke_ujitoko:20170615211121p:plain

展開図からも分かるように、
深さに応じて指数関数的にパスが増えることになる。
この多数のパスに関して、以下のような疑問に応える形で実験を行っている。

  • この展開されたパス同士に依存性はあるか?冗長性があるか?
  • 依存性がない場合、アンサンブル学習と同じ振る舞いを見せるか?
  • パスの長さによって結果へのインパクトは異なるか?

4.1 テスト時に一つのResNetモジュールを取り除く

テスト時に1つのResNetモジュールを取り除いて(skip connectionだけ残す)、結果への影響を見る。
VGGではモジュールを取り除くことで結果が悪くなったが、ResNetではあまり変わらなかった。
この結果によりResNetでは個々のパスには依存性がないことがわかった。

f:id:yusuke_ujitoko:20170615212317p:plain

この結果から、ResNetは 各パスからなるネットワークのアンサンブルとみなせるはず。

4.2 テスト時に多くのモジュールを取り除く

アンサンブルな振る舞いがあるとすると、
取り除くモジュールの数に応じて、スムーズに結果が変化すると期待できる。
結果として、valid pathsの数に応じて、errorがスムーズに増えた。

f:id:yusuke_ujitoko:20170615212308p:plain:w400

勾配消失

展開されたResNetでは、パスごとにskip connectionをどれだけ通るかが異なるため、畳み込み処理が行われる回数も異なる。 これをパスの長さと言っている。
このパスの長さにより勾配消失が起こりやすいかを調べている。

真ん中の(b)が、パスの長さごとの入力層の勾配の大きさを示している。 これを見ると、パスが小さくなるにつれて入力層での勾配は大きくなっていることがわかる。

f:id:yusuke_ujitoko:20170615213513p:plain

また、(c)は各パスにおける勾配の合計値を示しており、これを見るとある程度短いパスの方が、訓練時に勾配情報が伝わっていることがわかる。

ResNet論文を読んだメモ(arXiv:1512.03385)

今更ながらResNet論文を読んだメモ

概要

  • 深いネットワーク
    • 勾配消失や勾配爆発によって収束しない問題は、初期値の正規化や中間層の正規化によって解決しつつある
    • 一方、収束はするが訓練するのがある程度、層を深くするとerrorやaccuracyが悪化する問題がある
  • そこで効果的に学習が進むフレームワークを提案
    • residual functionsを学習する

f:id:yusuke_ujitoko:20170615193941p:plain:w300

  • 層を深くしてerrorが小さくなるのを確認した。

なぜうまく行くのか

なぜResidual Learningだと、うまく行くのかが良くわからなかった。
以下は推測(Sec3.1の記述がポイントっぽい)。

現実には層を深くしていくとerrorが悪化することが観測されている。

少ない層数である程度うまく行ったネットワークの後ろの層に、 層を追加してさらに精度を良くしていくことを考えると、 追加した層は細かい調整をする程度の役割を負えばよいので、 ほぼidentity mappingになっているのが望ましい。
そこで、identity mappingのパスと、そうでないconvを掛けるパスを用意することで、 identity mappingをとりやすくしたと推測.

Fig.7 の図を見る。

f:id:yusuke_ujitoko:20170615194024p:plain:w500

層ごとのレスポンスを検証したところ、 ResNetではplain netに比べて、レスポンスが後ろの層にいくごとに徐々に小さくなっていくことが示されている。

つまりResNetでは、各層が入力に関与する割合が、plainの場合と比べて小さくなっており、 微調整が効いているといえる?

層を増やしていくと、この傾向は更に強まり、一個一個の層のレスポンスは相対的に小さくなり、安定していくとみられる。

https://arxiv.org/abs/1603.05027も読んでみたが,結局うまくいく理由はよくわからなかった.
(追記) ResNetの分析で面白い論文を見つけた.

どの図もiterが3e4あたりでガクッとerrorが小さくなっている理由

f:id:yusuke_ujitoko:20170615194246p:plain

などの図を見ると,だいたい同じようなiterationで学習が一気に進んでいる.
3.4 Implementaionを見ると,

The learning rate starts from 0.1 and is divided by 10 when the error plateaus,

とあって,平坦になったら学習率を1/10にすることが書かれている. でもアーキテクチャが違ったときに,平坦になる速度が異なるアーキテクチャ間で同じになることなんてあり得ないと思う. 実験するときには決められたタイミングで学習率を小さくしているのだろう.

でもそうなると,その時点で最適化が進んでいるかいないかで, errorは大きく変わりそう. 例えば最適化があまり進んでいないのに,学習率が下げられてしまうと,学習が進まなくなってしまう. どうしてるんだろうか.

ResNetによるCIFAR-10分類を試してみた

4.2に記述されているアーキテクチャでCIFAR-10を分類してみた. learning rateは0.01からスタートして,3.2kと4.8k回目のミニバッチでそれぞれ0.1倍した.

f:id:yusuke_ujitoko:20170625151826p:plain

図にはResnet20と56しか載せていないがこれ以外も試したところ,層に深さに比例して学習の進みや精度は良かった.

closed formのメモ

closed formとは,有限個の"よく知られた"演算の組み合わせによる解の表し方のこと.
“よく知られた"の部分は主観や文脈に左右されるが,例えば以下の演算など.

ただしlimitは使えない

解がclosed formで表せるとき,その問題はtractableという.
例えば,二次関数{ax^{2} + bx + c = 0}は解の公式のようなclosed formで表せるのでtractableであると言える.

closed-formでないものとしては例えば, {} $$ f(x) = \sum_{i=0} \frac{x}{2^{i}} $$ など