機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

Few-Shot Unsupervised Image-to-Imge Translationを読んだのでメモ

はじめに

Few-Shot Unsupervised Image-to-Image Translationを読んだのでメモ.

気持ち

従来のimage-to-image translationはターゲットとなるクラスの画像が大量に必要となっていた.しかし,人間が同様のタスクを行おうと思った際には少量のデータで十分にtranslationすることが可能である.

ここでは,人間は過去の大量の経験によって可能であるという仮定から,多種多様な物体クラスの画像を使ってCNNをあらかじめ学習することでFew-shotでのimage-to-image translationを可能にした.

Few-shot UNsupervised Image Translation (FUNIT)

ここでの目標は教師なしかつ少量データを使った画像変換(FUNIT)を学習すること.ここでいう教師なしは,変換前と後でペアとなる画像がないということ.

フレームワークとしては,conditional image generator Gとmulti-task adversarial discriminator Dの二つから構成される.通常のconditional image generatorと違い,FUNITではcontent image \mathbf{x}とclass imageの集合\{\mathbf{y}_1,\dots,\mathbf{y}_K\}を入力とする次のようなモデルを考える.

\displaystyle
\bar{\mathbf{x}}=G(\mathbf{x},\{\mathbf{y}_1,\dots,\mathbf{y}_K\})

仮定として,content imageは物体に関するクラスc_xに属し,class imageはクラスc_yに属するものとし,c_x,c_yはそれぞれ違う物体クラスとする.さらに,content imageからclass imageに写像された画像\bar{\mathbf{x}}はクラスc_yに所属するものとする.

ここで,\mathbb{S},\mathbb{T}をそれぞれsource classとtarget classの集合とし,学習中Gはランダムに選ばれた二つのクラスc_x,c_y\in\mathbb{S},c_x\neq c_yを使って変換を学習する.テスト時にはGは未知のクラスc\in\mathbb{T}から得られた少量の画像をclass imageとして任意のsource classからtarget classへと変換する.

Few-shot image translator Gはcontent encoder E_xとclass encoder E_yとdecoder F_xから構成される.E_xはにゅうりょくされたcontent image \mathbf{x}をcontent latent code \mathbf{z}_xへと変換する役割を持ち,E_yは各class image \{\mathbf{y}_1,\dots,\mathbf{y}_K\}を中間的な潜在ベクトルに落とし込み,それらの平均を算出してclass latent code \mathbf{z}_yを生成する.DecoderはAdaINによって構成されるモデルで,そのアフィンパラメータは\mathbf{z}_yから計算される.アフィンパラメータをclass latent codeから計算することで変換された画像\bar{\mathbf{x}}のクラスがターゲットクラスになることを担保する.各encoderとdecoderを使って式を記述すると次のようになる.

\displaystyle
\bar{\mathbf{x}}=F_x(E_x(\mathbf{x}),E_y(\{\mathbf{y}_1,\dots,\mathbf{y}_K\}))

このモデルで重要なのは,content encoderが物体の姿勢のようなクラスとは独立な表現を,class encoderが物体の見た目のようなクラスに関する表現を潜在変数として取得するよう学習することとなる.

上記のような学習を可能とするため,ここではdiscriminator Dにmulti-task classificationの問題を解かせる.具体的には,通常の真贋判定に加えて|\mathbb{S}|-classの分類問題を解かせる.ただし,ここでの肝は単純な|\mathbb{S}|-classの分類問題ではなくbinary classificationとして定義していることで,これにより実験的にdiscriminatorがよく機能したとのこと.ただし,分類問題におけるペナルティの与え方は論文を参照.

最終的な目的関数としては次のような形となる.

\displaystyle
\min_D\max_G\mathcal{L}_{GAN}(D,G)+\lambda_R\mathcal{L}_R(G)+\lambda_F\mathcal{L}_{FM}(G)

\mathcal{L}_{GAN},\mathcal{L}_R,\mathcal{L}_Fはそれぞれ,GANのloss,content image reconstruction loss,feature matching lossを表す.GANのロスは次のように定義される.

\displaystyle
\mathcal{L}_{GAN}(G,D)=E_\mathbf{x}[-\log D^{c_x}(\mathbf{x})]+E_{\mathbf{x},\{\mathbf{y}_1,\dots,\mathbf{y}_K\}}[\log(1-D^{c_y}(\bar{\mathbf{x}})]

D^{c_x}はcontent imageのクラスに対するscoreを表していて,D^{c_y}はclass imageのクラスに対するscoreを表している.イメージとしては真贋判定とクラス分類をまとめてしまった形で,生成された画像か否かではなくどっちのクラスの画像かでlossを算出する.ということだが,式を見る限り言い方の問題で通常のGANのコストと変わらない気がするがよくわからない.

Content reconstruction lossはGがtranslation modelとして学習するのを助ける働きを持ち,content imageとclass imageに同一の入力を入れた際に正しく再構成されることを保証するロスで次のように定義される.

\displaystyle
\mathcal{L}_R(G)=E_\mathbf{x}[\|\mathbf{x}-G(\mathbf{x},\{\mathbf{x}\})\|^1_1]

最後に,feature matching lossは正則化項として働き,Dの最終層手前の層から得られた特徴を用いて,次のように定義される.

\displaystyle
\mathcal{L}_F(G)=E_{\mathbf{x},\mathbf{y}_1,\dots,\mathbf{y}_K\}}[\|D_f(\bar{\mathbf{x}})-\sum_k\frac{D_f(\mathbf{y}_k)}{K}\|_1^1]

Dはクラス分類器も兼ねているため,class imageと変換された画像の出力手前の特徴は一致している必要があるというもの.

まとめ

Figure 2の実験で,sourceとtargetに全然違うもの(チャーハンとホットドッグなど)を入れているがなんかそれっぽい出力を出してて面白い.

目的関数の部分がイマイチ腹落ちしなかったけど,CycleGANとかと違ってモデルが単一なのはシンプルでいい.