latent space를 조절해서 이미지를 편집하는 종전의 기술은 지도 학습 기반으로 시행됐다. 이 논문에선 비지도학습 기반으로 이걸 가능하게 한다. pretrained weights를 분해하는 걸로 closed-from factorization 알고리즘을 제안했다.
지도학습 방식은? latent code에서 임의로 샘플링하여 이미지를 생성하고 이것들을 annotation 한 후 classifier를 학습하는 형식이었다.
이 논문의 방식은 SeFa(Semantic Factorization)으로, 학습이나 샘플링과는 무관하게 GAN에서 latent의 semantic direction(의미가 담긴 방향)을 찾을 수 있다.
GAN은 latent code를 단계별로 네트워크를 거쳐 이미지로 합성한다. 이때 가장 중요하게 생각한 건 첫번째 projection 단계라고 한다. 이 논문에서도 이 단계에 초점을 두고 연구했다. 사전 학습된 generator 가중치만 있으면 비지도학습 기반으로 찾을 수 있다.
z를 latent code, G를 generator라고 하자. 그러면 I는 z가 합성된 이미지다. G의 많은 단계중 첫 번째 G_1은 affine 변환이다. z는 이 affine 변환을 우선 거친다. A와 b는 transformation matrix를 의미한다. A는 weights, b는 bias term이다. 이렇게 변환된 걸 y라고 한다. (latent code가 첫번째 단계 projection을 거친 단계)
G(z) 이미지를 편집하는 것 (여러 의미 차원에서 이미지를 수정하는 것)을 edit()이라고 했다. 이 edit은 어떻게 이루어지는 것일까? 특정한 방향 n으로 alpha값(조절 강도)를 곱한 값을 z에 더한다. 이걸 z' 라고 하면, 이 녀석을 다시 Generator에 넣은 G(z')가 이 edit()연산이다.
이렇게 조절한 latent code z'가 affine transformation단계인 G_1을 거친다. z+alpha*n이 G_1에 들어가면 어떻게 될까? 위 수식에서 처럼 Az + b + åAn이 된다. 앞서 정의했듯 Az+b는 y와 같으므로 이를 다시쓰면 y+åAn이 된다.
이게 어떤 의미를 가지는 걸까? 이미지 편집 작업을 위한 latent code z'가 입력됐다. 첫 번째 단계에서 y' = y + åAn가 되었다. 이건 latent code가 첫번째 단계를 거친 y(projection code)에 åAn만 더해주면 된다는 의미다. 그렇다면 A가 이미지 편집에 핵심적인 기능을 담고 있어야 한다!
An을 최대가 되게하는 n을 찾으면 특정 이미지 편집 기능을 최대화시키는 작용을하는 방향을 찾을 수 있다. 이 말은 다른 말로 A를 n에 projection 시켰을 때 가장 큰 변화를 일으키는 방향 n을 찾으면 된다는 얘기다.
나머지는 라그랑주 승수법으로 이 문제를 해결하는 방법이다. N은 가장 큰 k개의 의미 방향으로 구성된 matrix다. (나이, 성별, 머리색 등 각 의미별로 가장 큰 차이를 나타내는 벡터가 있을 것이다.) 우선 문제를 풀면 방정식 (7) 해는 matrix A^TA의 고유 벡터가 된다. 이제 N을 구하자. N은 k개 n에대해 A^TA의 가장 큰 k개의 고유값과 관련된 고유 벡터로 구성된다.
'Data-science > deep learning' 카테고리의 다른 글
[pytorch] type casting 하기, 타입 변환하기 (0) | 2021.03.03 |
---|---|
nvidia-smi랑 nvcc --version이 다를 때 (0) | 2021.01.24 |
[pytorch] inference시 memory leak, 메모리 과부하 문제 (6) | 2021.01.11 |
[petcon] stylegan2 distillation 찾다가 다른 좋은 거 찾음 encoding + distillation 한 번에 (0) | 2021.01.09 |
[pytorch] DistributedDataParallel vs DataParallel 차이 (0) | 2021.01.04 |