Task : Multidomain Img2Img Translation
< Unfied encoder, generator를 통한 multidomain img2img translation >
Idea & Assumption
이번 논문의 핵심 아이디어 역시 Image-to-image translation for cross-domain disentanglement, Fader networks에 이어 Representation Disentanglement에 관한 것입니다. 기존 논문들이 1개 혹은 2개의 domain 사이의 domain invariant representation을 찾아내던 연구들에 이어 이 논문에서는 N개의 domain 사이의 domain invariant representation을 찾는 방법을 제안하고 있습니다. 이는 크게 3단계로 이루어집니다.
- VAE 꼴의 Encoder $E$를 정의합니다. Image reconstruction 과 KL divergence를 통해 representation $z = E(x)$를 만듭니다. 이 때 Image reconstruction은 $z$와 domain vector $v$를 함께 이용하여 합니다. Domain vector $v$를 주고 $z$는 완전히 domain invariant representation으로 만들기 위한 목적입니다.
- Domain classifier $D_v$를 정의합니다. 이 $D_v$는 $z = E(x)$를 input으로 받아 $z$를 만들어낸 $x$의 domain$v_c$를 예측하여 $l_v$를 결과로 내놓습니다. $D_v$가 이 $v_c$를 최대한 잘 맞추도록 학습합니다.
- $E$는 $D_v$가 최대한 $v_c$를 맞추지 못할만한 $z$를 만들도록 학습됩니다. Domain invariant representation이니 Domain classifier가 domain을 잘 맞출 수 없어야 한다는 직관적인 의미로 해석이 가능합니다.
Training objective
< Training objective >
1. Self-supervised feature disentanglement
$x_c$는 domain $c$에 속하는 이미지입니다. 우선 $x_c$의 정보를 담는 representation을 추출할 수 있는 $E$의 학습이 필요한데 이는 VAE의 방식의 image reconstruction을 통해 학습합니다.
$L_{vae} = \parallel \hat{x}_c - x_c \parallel_F^2 + KL(q(z|x_c) \parallel p(z)) \tag{1}$
식 (1)의 좌항은 Image reconstruction을 통해 $E$를 학습하는 부분입니다. 여기서 $\hat{x}_c$는 $z$와 $x_c$의 domain를 나타내는 domain vector인 $v_c$를 함께 이용하여 $G$에 넣어 만듭니다. 직관적으로 domain invariant representation인 $z$와 domain vector인 $v_c$가 함께 있어야 domain $c$에 속하는 이미지를 만들 수 있을 것입니다.
$q(z|x_c)$는 $E$가 $x_c$를 이용해 만들어 낸 $z$의 분포를 의미합니다. 이 분포와 $p(z) = N(0, 1)$의 KL divergence를 minimize 하여 $z$의 분포가 $N(0, 1)$이 되게 하면 test 시에 임의의 image $x$를 N(0, 1)의 한 점에 mapping 시킬 수 있으므로 GAN에서 N(0, 1)에서 임의의 vector를 sampling해 $G$에 forward 시키는 것과 동일하게 됩니다.
하지만 아직 $z$에 domain invariant한 정보만이 담기도록 제한해주는 어떠한 제한도 없습니다. 이는 아래와 같은 방법을 통해서 줄 수 있습니다. 우선 $z$를 보고 $z$를 만든 $x_c$의 domain을 classify 하는 $D_v$를 정의합니다.
$L_{D_v}^{adv} = \mathbb{E}[\log P(l_v=v_c|E(x_c))] \tag{2}$
$L_E^{adv} = - L_{D_v}^{adv} = -\mathbb{E}[\log P(l_v=v_c|E(x_c))] \tag{3}$
식 (2)를 통해 $D_v$를 학습하게 됩니다. 식 (2)는 $z = E(x_c)$가 주어졌을 때($z$를 보여줬을 때) $D$가 판단한 $z$를 만든 $x_c$의 domain $l_v$가 $x_c$가 실제로 속하는 domain인 $v_c$와 동일할 확률을 의미합니다. 그리고 가진 모든 $x_c$에 대해 이 확률의 평균을 한 것이 $L_{D_v}^{adv}$가 되는 것입니다. 그리고 $D_v$는 이를 maximize 하도록 학습이 되어야 합니다.
식 (3)을 통해 $E$를 학습하게 됩니다. 식 (3)은 식 (2)에 -를 붙인 것입니다. 즉 $D_v$가 예측한 domain $l_v$가 실제 domain인 $x_c$와 동일하다면 오히려 penalty를 부여하여 $E$를 학습하고자 합니다. 이렇게 되면 $E$는 penalty를 받지 않기 위해 $D_v$가 domain을 제대로 예측할 수 없는 $z$를 만들어야 하고 이는 $z$에 domain specific한 정보를 담는 것이 아니라 모든 domain에 공통으로 있을 법한 정보를 담아야 가능해집니다.
음.. 그런데 여기서 살짝 이상한 부분이 있습니다. 후에 나오겠지만 이 $D_v$와 $E$는 식(2)와 식(3)에 대해 gradient descent 방식으로 학습이 됩니다. 이는 $D_v$는 classification 정확도를 점점 떨어뜨리도록 학습이 되고 $E$는 classification 정확도를 점점 올리도록 학습이 되는데 이는 의도한 바와 정 반대입니다. 따라서 gradient descent 방식으로 학습이 된다는 가정 하에 식은 아래와 같이 바뀌어야 하는 것 같습니다.
음.. 그런데 여기서 살짝 이상한 부분이 있습니다. 후에 나오겠지만 이 $D_v$와 $E$는 식(2)와 식(3)에 대해 gradient descent 방식으로 학습이 됩니다. 이는 $D_v$는 classification 정확도를 점점 떨어뜨리도록 학습이 되고 $E$는 classification 정확도를 점점 올리도록 학습이 되는데 이는 의도한 바와 정 반대입니다. 따라서 gradient descent 방식으로 학습이 된다는 가정 하에 식은 아래와 같이 바뀌어야 하는 것 같습니다.
$L_{D_v}^{adv} = -\mathbb{E}[\log P(l_v=v_c|E(x_c))] \tag{2}$
$L_E^{adv} = - L_{D_v}^{adv} = \mathbb{E}[\log P(l_v=v_c|E(x_c))] \tag{3}$
여기까지의 방법을 통해 $E$는 모든 domain에 공통으로 있는 정보를 추출하여 $z$를 만들어냅니다. 하지만 아직 한 가지가 더 필요합니다. 바로 domain invariant representation $z$와 domain vector $v_c$를 이용하여 만들어낸 image가 realistic 하게 domain $v_c$에 속하는 이미지여야 합니다. 이는 GAN의 adversarial training 을 통해 가능합니다.
2. Adversarial learning in pixel space
이 논문에서는 realistic한 image를 만들기 위해 adversarial training 뿐만 아니라 auxiliary classifier를 사용합니다. 자세한 내용은 아래와 같습니다. 우선 adversarial training에 사용될 discriminator $D_x$를 정의합니다. $D_x$는 마지막에 두 갈래로 나눠져 input image $x$에 대해 한 쪽은 Real / Fake score를 반환하고 한 쪽은 $x$의 domain을 classify하게 됩니다.
$L_{D_x}^{adv} = \mathbb{E}[\log (D_x(\hat{x}_{\bar{c}}))] + \mathbb{E}[\log (1-D_x(X_c))]$
$L_G^{adv} = -\mathbb{E}[\log (D_x(\hat{x}_{\bar{c}}))] \tag{4} $
Fake image에 해당하는 $\hat{x}_{\bar{c}}$는 domain invariant representation $z$와 domain vector $v_c$를 동시에 이용하여 만들어집니다. 이미지는 domain invariant 부분과 domain specific 한 부분으로 이루어져 있을테니 합리적인 방법입니다.
$D_x$와 $G$는 식(4)에 대해 gradient descent 방법으로 학습이 됩니다. 즉, $D_x$는 $D_x(\hat{x}_{\bar{c}}) \rightarrow 0$, $D_x(x_c) \rightarrow 1$이 되도록 학습하고 $G$는 $D_x(\hat{x}_{\bar{c}}) \rightarrow 1$이 되도록 학습하게 됩니다.
여기에 덧붙여 만들어진 fake image $\hat{x}_{\bar{c}}$는 이미지의 real함뿐만이 아니라 domain specific 정보도 받았으니 그 domain에 속하는 이미지로 만들어져야 합니다. 이는 $D_x$의 domain classifier 가 fake image를 봤을 때 해당하는 domain으로 classify 할 수 있도록 학습을 시켜주면 됩니다. 식으로 쓰면 아래와 같습니다.
$L_{cls} = \mathbb{E}[\log P(l_x=v_\bar{c} | \hat{x}_{\bar{c}}] + \mathbb{E}[\log P(l_x=v_c | x_c)] \tag{5}$
앞 쪽 term은 $G$를 위한 term이고 뒷 쪽 term은 $D_x$를 위한 term입니다. $G$는 fake image $\hat{x}_{\bar{c}}$가 class $v_{\bar{c}}$일 확률을 높이는 방향으로 이미지를 만들 수 있도록 학습해야하고 $D$는 이미지 $x_c$를 $v_c$로 classify 할 수 있도록 학습해야합니다.
여기의 식(5)도 이러한 관점에서 보면 무언가 이상합니다. $D_x$와 $G$ 모두 classification 확률을 높이도록 학습을 해야하는데 식(5)에 gradient descent를 해주게 되면 classification 확률을 낮추도록 학습이 되게 됩니다. 따라서 식(5)는 아래와 같이 수정되어야 할 것 같습니다.
$L_{cls} = -\mathbb{E}[\log P(l_x=v_\bar{c} | \hat{x}_{\bar{c}}] - \mathbb{E}[\log P(l_x=v_c | x_c)] \tag{5}$
마지막으로 지금까지 소개한 loss function을 사용해서 학습은 아래와 같이 gradient descent 방법을 사용해서 할 수 있습니다.
$\theta_E = \theta_E - \vartriangle_{\theta_E}(L_{vae} + L_E^{adv}), \nonumber\\
\theta_G = \theta_G - \vartriangle_{\theta_G}(L_{vae} + L_G^{adv} + L_{cls}), \nonumber\\
\theta_{D_v} = \theta_{D_v} - \vartriangle_{\theta_{D_v}}(L_{D_v}^{adv}), \nonumber\\
\theta_{D_x} = \theta_{D_x} - \vartriangle_{\theta_{D_x}}(L_{D_x}^{adv} + L_{cls}) \tag{6}$
Fake image에 해당하는 $\hat{x}_{\bar{c}}$는 domain invariant representation $z$와 domain vector $v_c$를 동시에 이용하여 만들어집니다. 이미지는 domain invariant 부분과 domain specific 한 부분으로 이루어져 있을테니 합리적인 방법입니다.
$D_x$와 $G$는 식(4)에 대해 gradient descent 방법으로 학습이 됩니다. 즉, $D_x$는 $D_x(\hat{x}_{\bar{c}}) \rightarrow 0$, $D_x(x_c) \rightarrow 1$이 되도록 학습하고 $G$는 $D_x(\hat{x}_{\bar{c}}) \rightarrow 1$이 되도록 학습하게 됩니다.
여기에 덧붙여 만들어진 fake image $\hat{x}_{\bar{c}}$는 이미지의 real함뿐만이 아니라 domain specific 정보도 받았으니 그 domain에 속하는 이미지로 만들어져야 합니다. 이는 $D_x$의 domain classifier 가 fake image를 봤을 때 해당하는 domain으로 classify 할 수 있도록 학습을 시켜주면 됩니다. 식으로 쓰면 아래와 같습니다.
$L_{cls} = \mathbb{E}[\log P(l_x=v_\bar{c} | \hat{x}_{\bar{c}}] + \mathbb{E}[\log P(l_x=v_c | x_c)] \tag{5}$
앞 쪽 term은 $G$를 위한 term이고 뒷 쪽 term은 $D_x$를 위한 term입니다. $G$는 fake image $\hat{x}_{\bar{c}}$가 class $v_{\bar{c}}$일 확률을 높이는 방향으로 이미지를 만들 수 있도록 학습해야하고 $D$는 이미지 $x_c$를 $v_c$로 classify 할 수 있도록 학습해야합니다.
여기의 식(5)도 이러한 관점에서 보면 무언가 이상합니다. $D_x$와 $G$ 모두 classification 확률을 높이도록 학습을 해야하는데 식(5)에 gradient descent를 해주게 되면 classification 확률을 낮추도록 학습이 되게 됩니다. 따라서 식(5)는 아래와 같이 수정되어야 할 것 같습니다.
$L_{cls} = -\mathbb{E}[\log P(l_x=v_\bar{c} | \hat{x}_{\bar{c}}] - \mathbb{E}[\log P(l_x=v_c | x_c)] \tag{5}$
마지막으로 지금까지 소개한 loss function을 사용해서 학습은 아래와 같이 gradient descent 방법을 사용해서 할 수 있습니다.
$\theta_E = \theta_E - \vartriangle_{\theta_E}(L_{vae} + L_E^{adv}), \nonumber\\
\theta_G = \theta_G - \vartriangle_{\theta_G}(L_{vae} + L_G^{adv} + L_{cls}), \nonumber\\
\theta_{D_v} = \theta_{D_v} - \vartriangle_{\theta_{D_v}}(L_{D_v}^{adv}), \nonumber\\
\theta_{D_x} = \theta_{D_x} - \vartriangle_{\theta_{D_x}}(L_{D_x}^{adv} + L_{cls}) \tag{6}$
0 coment�rios:
댓글 쓰기