Partial Convolution based Padding読んでGANに適用して遊んだ

あけましておめでとうございます。卒論と別の論文に追われて1ヶ月に最低1記事ができなかった追われてた割にはグラブルはめちゃくちゃしてたけど。ベストだベストを尽くせ...

[1811.11718] Partial Convolution based PaddingをDropBlockの論文と一緒に読んでいました。雑にいうなら畳み込みの操作でたびたび用いるZero Paddingより訓練とか精度とかの面でよりよい結果をもたらすPartical Conv Based Paddingを提案するぜ、な感じなはず

畳み込みを行う入力のサイズが畳み込みのカーネルサイズより小さい場合はPaddingの操作をすることがある。この論文のイントロで初めて知ったけど論文ではすたんだ〜どなPaddingの方法としてZeroPadding、Reflection Padding、Replication Paddingの3つを挙げてくれた。Zero Paddingは後ろ2つと比べて操作がシンプルで計算的な面でも効率がいいから最もよく用いられてる。

しかし論文ではこれら3つのPaddingはパディングで埋め込んだ情報が畳み込みを行う際に敵対的な情報を埋め込んでしまい、学習モデルの品質にあまりよろしくない影響を与えることがあることしれないと述べている。ニャニィ...?一大事ですよ

Zero Paddingはシンプルに入力に無関係な情報を埋め込んで(ゼロを埋める)、ReflectionとReplication Paddingは入力情報に基づいて尤もらしい情報で埋め込みを試みる。どちらの埋め込みの方法も、埋め込んだ結果を入力として受け取る次の畳み込みの層にとっては埋め込んだ部分も含めて入力画像と見なしてしまうため、期待する入力画像らしかぬ部分があるんですけど・・・と混乱させてしまうらしい。う〜〜〜ん、、入力画像としてウサギの画像を受け取って、畳み込みとパディングを重ねていくうちに、パディングによってアヒルの特徴に見えてきて混乱しちゃう感じかな。違う?そうですね...

f:id:Owatank:20190330154307p:plain
これは図書館で適当に借りた本に載ってたやつ。有名らしいかわいい

そういう問題がCNNの訓練で起きていると仮定してじゃあどうするか、自分なら

  1. パディングの部分を明示的にどこそこはパディング部分だから重みは弱くていいよ(あまり発火しないで♡)と教えてあげる何かを考える
  2. パディングをクビにする。全結合層こそ最強。空間情報などいらぬゥ
  3. 混乱させないような悪影響を与えない新しいパディング方法を考える

こんなものを考えつく。考えついたからといってアプローチ方法はミジンコたりとも思いつけないけど俺は漢検準二級だぞ舐めるな

自分の意見なんてどうでもいいんですよ。論文の著者たちはどちらかというと3番目の選択肢に近くて提案手法をイントロで次のように述べている。

To eliminate the potential undesired effects from the extrapolated inputs, we propose a new padding scheme called partial convolution based padding, which conditions the convolution output only on the valid inputs.

valid inputs はおそらくパディングの埋め込み情報ではなく入力情報or特徴マップなはず。数学と英語がカスなため condition が悩むけれどパディング込みの入力で畳み込みした出力結果をパディング部分を除いたvalid inputs で何がしか調節するのかな、その後に re-weights the output to adjust~ と続いてるし
その再重み付けの操作として partial convolution layer を採用してるからPartical Conv Based Paddingとついてるんだな。長くない?またこの再重み付けの操作によってZero Paddingなどによるパディングの領域を重要な入力情報ではなく穴として扱うようにするとある。

え〜?Paddingがそんなに学習モデルに悪影響与える〜?パラメータ持ってるわけでもなくちょっとシュッってするだけの操作が?と思うけどめちゃんこ有意差でてるからすげ〜...というかpaddingの領域をここは穴だよと教えてあげるのにここまで注意を払わなくちゃいけないのか。こんぴゅ〜たに万華鏡のような夢を見させるなんて夢のまた夢だな(?)

f:id:Owatank:20190330165645p:plain

Partial Convolution based Paddingのパディング方法は多分次のような感じ
まず論文に載ってる図、お借りします!

f:id:Owatank:20190330171207p:plain

{ \displaystyle (a) \ \mathbf{X}}{ \displaystyle (b) \ \mathbf{1}}は同じサイズ
{ \displaystyle (c) \ \mathbf{X}^{p0}}{ \displaystyle (d) \  \boldsymbol{1}^{p0}}{ \displaystyle \mathbf{X}}{ \displaystyle \boldsymbol{1}}をそれぞれゼロパディングした結果とおく

従来のゼロパディングからの畳み込みした出力結果は次のように表現できる

{ \displaystyle x^{\prime} =  \mathbf{W}^{T} \mathbf{X}^{p0}_{(i,j)} + b }

{ \displaystyle  \mathbf{W}}は畳み込みのフィルター、{ \displaystyle b}はバイアス。Partial Convolution based Paddingのやることは再重み付けで、再重み付けされたそのときの{ \displaystyle x^{\prime}_{(i,j)} }は次のように計算される

{ \displaystyle x^{\prime}_{(i,j)} = \mathbf{W}^{T}\mathbf{X}^{p0}_{(i,j)}r_{(i,j)} + b} また { \displaystyle r{(i,j)}= \frac{||\boldsymbol{1}^{p1}_{(i,j)}  ||}{ || \boldsymbol{1}^{p0}_{(i,j)} || }  }

{ \displaystyle r{(i,j)}={||\boldsymbol{1}^{p1}_{(i,j)}  ||}/{ || \boldsymbol{1}^{p0}_{(i,j)} || }  }で valid outputs の領域とそうでないゼロパディングの領域の割合もどきから畳み込みの出力結果を再重み付けしている。どこそこはパディング部分だからあまり発火しないで♡ということをやっているんだな実験パートでこんな図も載っていた
f:id:Owatank:20190331203942p:plain
ゼロパディングによるふちの部分の発火が抑えられているのが見える見える

Partical Conv Based Paddingいいジャーン、使ってみたいなと思いGANで試してみるgeneratorとdiscriminatorの畳み込みにはPartical Conv Based Paddingを採用
折角なのでこの前読んだDropBlockも追加してみた

コード

github.com

正月の某芸能人格付け番組で、GANのgeneratorに対して一つのdiscriminatorじゃなくて一流、三流、素人の3つのdiscriminatorで鍛えてあげれば学習が安定してスムーズになるんじゃないか?ということを思いついた。一流であるかとかはパラメータの数とか構造で決める素人は全結合層しか持ってないdiscriminatorにするとか。あとUnrolledGANの考えから n step目はgeneratorをdiscriminatorA(一流)、n+1 step目にはdiscriminatorB(三流)で、 n+2 step目にはdiscriminatorC(素人)で鍛えてあげれば各discriminatorもgeneratorの収束に併せることがそこそこできて良さそうじゃないかと思った。

みなさんオムライス好きですか?自分は好き。オムライスの画像データを適当に集めてgeneratorをdiscriminatorA,B,C(一流、三流、素人)とdiscriminatorAのみで鍛えた時の結果を比べてみる。

f:id:Owatank:20190331210643p:plain

前3つはdiscriminatorA,B,Cでの、後ろ3つはdiscriminatorAのみで鍛えた時のgeneratorの出力結果(25~30epochまで)
心なしdiscriminatorAのみのが多様性に欠けているような、、多様性やクオリティの指標について調べてから比べるべきだった。
計算時間はdiscriminatorA,B,Cのが時間がかかるし、discriminatorが増える分学習モデルの大きさも増えてしまうから悪いこともあるんだけど初期の学習は3つでやって後半はdiscriminatorAのみで訓練もよさそうかな
styleGANのようにlossの設計の方が大事だと思うけどな

書いていて思ったのですが、うさぎとあひるの絵を自分たちは集中すればうさぎとして固定したままずっと眺めることができるじゃないですか。そしてあひるに切り替えてずっと眺めることもできる。
この切り替えは人間に意識があるからこそできることだと思うのですが、ニューラルネットワークにおいてこの切り替えできる意識を与えることは一体何が対応しているんでしょうね