만들면서 배우는 생성AI 10장 : 고급 GAN
1. ProGAN
- 핵심 아이디어
NVIDIA LABS가 GAN 훈련의 속도와 안정성을 향상하려고 개발한 방법론입니다. 앞서, GAN은 두개의 서로 다른 경쟁적인 모델을 학습시켜야하기 때문에 훈련시키기가 매우 어렵다는 이야기가 있었습니다.
이 논문은 전체 해상도 이미지에서 바로 GAN을 훈련하는 대신 먼저 4X4 픽셀의 저해상도 이미지로 생성자와 판별자를 훈련한 다음 점차 해상도를 높이는 방법을 사용합니다.
- 점진적 훈련
위에서 말한 점진적 훈련은 아래와 같은 방식으로 고차원으로 확장해갑니다. 크게 전환과 안정화 두가지가 점진적 훈련의 주요 단계입니다.
전환 단계와 안정화 단계의 역할 : 이전의 4X4 생성자가 배운 이미지 생성 능력을 고해상도(8X8) 생성자도 배울 수 있도록 잔차 연결로 연결해줍니다. 새로운 이미지 생성층은 저차원의 이미지 생성층이 그리지 못하는 부분만 학습을 시킵니다. a가 그 비율을 조절해주는데 점차적으로 0에서 1로 높여서 새로운 toRGB로 출력을 늘려갑니다. 이렇게 a가 1이 되면 그것이 바로 안정화 단계입니다.
판별자도 비슷한 과정을 따르는데 업샘플링이 아니라 다운샘플링이 일어납니다. 원래 고화질의 이미지를 판단해야하니까 고화질의 이미지를 4로 줄여주는 역할을 합니다. 위 과정을 실제 해상도인 1024 X 1024가 될때까지 반복합니다.
- 균등 학습률(equalized learning rate)
우리가 일반적으로 아는 learning rate와는 다른 개념으로, 신경망의 전반적인 학습속도를 일정하게 가져가기 위해 도입한 요소이다.
GAN은 일단 학습시키기가 어렵기 때문에 가중치를 어떻게 초기화시키느냐도 매우 중요합니다. 일반적으로 가중치 초기화는 He 초기화를 사용하는데 여기서 2/n의 루트를 씌운 값을 곱해줘서 일정의 스케일링을 진행한다. (여기서 n은 현재 뉴련과 연결되어 있는 이전 뉴런 수이다.)
논문에서는 runtime 때 이 스케일링을 곱해준다고 하는데 방식에 따라서 gradient update를 scaled W를 대상으로 하는 방법도 있고 적용하는 방식은 다양한 것 같다.
- 픽셀별 정규화
배치 정규화가 아니라, 픽셀별 정규화를 사용합니다.
원본 논문 : Progressive Growing of GANs for Improved Quality, Stability, and Variation (링크)
2. StyleGAN
2018년에 나온 GAN 구조로, ProGAN 논문의 초기 아이디어를 기반으로 합니다. 판별자는 동일하게 작동하고 생성자의 동작만 바뀌었습니다.
- 배경
현재 시점에서 보면 인간의 최종 목적은 의도대로 원하는 이미지가 생성되는 것입니다. 마치 언어모델에서 단순히 유사한 글을 만드는게 아니라 ChatGPT처럼 우리가 묻는 것에 대해서 의도한대로 답변을 하는 것처럼 우리가 요청하는 것에 대해 의도한대로 이미지를 컨트롤할 수 있어야 합니다.
하지만 GAN을 포함한 그당시 이미지 생성 모델들은 이를 컨트롤하기가 쉽지 않습니다.
- 문제
흔히 딥러닝은 representative learning이라고 부르는데 우리의 세계를 기계의 관점에서 새로운 차원으로 학습시켜서 표현시킨다는 의미입니다. GAN에서 이미지를 학습시키는 과정에서 사람의 얼굴 주근깨를 그리려고 관련 층을 바꾸었을 때 의도치 않게 배경이 바뀌어버리는 등의 문제가 발생했습니다. 그 이유는 z라는 임의의 벡터에서 이미지로 발전해나가기 때문에 우리가 z의 값을 조금 바꾸는 과정에서 여러 신경망을 거치면서 여러가지 부분(스타일, 색깔, 변경 부위 등)에 영향을 끼쳐서 이를 분리할 수 없다는 것이 문제였습니다.
즉 기계가 GAN처럼 고화질의 이미지를 잘 생성하되 요청자의 의도대로 추가적인 이미지 수정까지 가능하도록 추가적인 벡터를 학습시키려는 시도를 StyleGAN에서 진행했습니다.
- 아이디어
z-> 이미지 생성으로 가는 한 경로만 만드는게 아니라 스타일을 수정하는 벡터 하나를 따로 학습시켜서 GAN 곳곳에 넣는 방식을 선택했습니다.
- 매핑 신경망
위에서 말한 스타일을 수정하는 벡터에 활용하기 위한 신경망입니다. 굳이 z를 바로 활용하지 않고 신경망을 넣는 이유는 결국 z는 정말 임의의 아무 정보도 없는 신경망이니 학습을 시켜서 넣어주면 그 과정에서 의미있는 벡터로 신경망이 알아서 정보를 뽑아낼 수 있지 않을까?의 취지로 들어가게 되었습니다.
또한 한번 들어가는게 아니라 각 층에 인위적으로 주입함으로써 각각의 스타일을 학습할 수 있도록 설계합니다.
- AdaIN
기본적으로 스타일과 이미지를 결합하는 역할을 합니다. 어떻게 결합하느냐가 문제인데 GAN은 항상 학습이 불안정하다는 문제가 있습니다. 스타일 벡터가 추가로 들어가는 과정에서 추가적인 Normalization 작업을 해주는것이 AdaIN입니다.
여기서 y_{s,i}, y_{b,i}는 모두 스타일벡터에서 파생된 값으로 마치 곱해서 더해주는 연산으로 Affine Transform을 시킨다고 볼 수 있다.
- 확률적 변동
학습 과정에서 잡음을 추가함으로써 이미지의 미세한 디테일을 생성합니다. 이를 통해 다양한 변형성을 부여할 수 있습니다.
- 한계점 : 아티팩트 현상
StyleGAN 구조의 출력 결과들이 물방울이 번진것 같은 현상이 발생했고 이런 퀄리티를 높이는 작업이 StyleGAN2에서 일어납니다. 그 원인은 AdaIN에서 이미지의 평균과 분산을 강제로 정규화하는 과정에서 일부 세부 사항이 손실되거나 왜곡될 수 있다.
각피쳐 맵 전체에 걸쳐 동일한 평균 분산을 적용하다보니 특정 부분에서 비자연스러운 패턴을 생성할 수 있다.
3. StyleGAN2
위에서 Artifact 현상이 발생하는 것이 StyleGAN의 문제라고 얘기했었고 이 논문에서 저자들은 그 원인에 AdaIN이 있다고 가정했다. 실제로 normalization을 제거했을 때 이런 현상이 사라진 것을 확인했고, 이 normalization 방식을 어떻게 바꾸어서 문제를 해결했는지가 이 논문의 핵심이다.
- Normalization의 대상 변경(가중치 변조 및 복조)
위의 그림을 보면 이해가 쉽다. 앞서 우리는 스타일 벡터를 주입하는 과정에서 Convolution망이 학습한 이미지에 대한 Feature 정보들에 대해 정규화를 가한다. 일종의 대표값으로 빼주는 과정에서 정보가 생략되는 것이다. 따라서 Convolution Network의 정보를 잃지 않기 위해, 스타일 벡터를 먼저 정규화하고 더하는 방식을 선택했더니 잘 동작하더라는 것이다.
또한 이렇게 직접 Feature Map에 정규화를 직점함으로써, 각 StyleBlock(회색박스) 간의 관계가 깨지는 문제도 발생되는데 이것도 해결할 수 있다.
실제 동작하는 식은 아래와 같이 정리해볼 수 있다.
- 스타일 벡터 변환: 먼저, 잠재 공간(latent space)에서의 스타일 벡터 는 매핑 네트워크를 통해 중간 스타일 벡터 로 변환됩니다. 이 과정은 스타일 벡터를 신경망이 사용할 수 있는 형태로 조정합니다.
- 스케일링 및 바이어스 파라미터 생성: 매핑 네트워크의 출력인 는 각 레이어에 적용될 스케일링 와 바이어스 파라미터를 생성하기 위해 사용됩니다. 이는 일반적으로 간단한 선형 변환(예: 완전 연결 레이어)을 통해 이루어집니다.
- 피쳐 맵 조정: 각 레이어에서의 피쳐 맵(활성화) 는 이 와 를 사용하여 조정됩니다. 이는 각 레이어의 출력에 스타일을 적용하는 과정입니다.
여기서: 는 레이어 의 원래 피쳐 맵이고, 는 조정된 피쳐 맵으로, 최종적으로 다음 레이어로 전달되거나 이미지 생성에 사용됩니다.
- Progressive growing Training의 제거
여러 artifact 종류 중에 Phase artifact가 있는데 이는 카메라 포즈를 변형시키더라도 이미지 상의 특정 부분(사람의 이빨 부분)은 고정되어 있는 것처럼 보이는 현상이다.
이 문제의 원인은 저해상도 -> 고해상도로 가져가는 과정에서 발생하는데, 이 때 저해상도에서 학습된 정보가 고정되어 고해상도에서 그걸 바꾸려고 하지 않는 문제라고 볼 수 있다. 그래서 이를 제거하고 그동안 고해상도 이미지를 생성한 모델들을 차용했다.
a) Generator 와 Discriminator의 skip connection(같은 해상도끼리 연결해서 정보 전달)
b) 각 해상도에서 발생한 정보들을 해상도에 맞춰서 up/down 샘플링을 해서 정보를 연결한 것
c) Residual connection을 각 해상도마다 진행
- 경로 길이 규제
그동안 GAN 모델의 Metric으로 FID나 Precision and Recall을 많이 사용했는데, 동일한 지표더라도 이미지 생성 퀄리티에서 큰 차이가 있습니다.
그래서 새로운 지표를 제안하게 되는데 이것을 Perceptual Path Length라고 합니다. 실제로 논문에서 PPL이 낮을수록 이미지가 우리가 인지하는 정성적으로 좋은 이미지라고 불리는 사진들이 많았습니다.
그래서 이 논문 저자들은 이 개념을 넣어서, regularization term을 추가해서 왼쪽처럼 이미지가 나오도록 학습을 시켰다.
어떻게 규제시켰는지에 대해서는 자코비안 개념을 활용했다.
우선 이미지는 매우 고차원 데이터이기 때문에 가중치 하나가 바뀐다고 하더라도 1024X1024개의 차원의 값이 바뀐다. 그래서 이 변화의 모든 방향이 일정하도록 고정하는게 Path - Length Regularization이다.
4. 그 외 중요한 GAN
하나하나가 엄청 큰 모델이라서 각각에 대해서는 논문으로 추후에 좀 더 자세히 알아보려고 합니다.
- SAGAN
어텐션을 도입한 GAN 모델로, 앞서 트랜스포머의 어텐션 모델은 전체 문장에서 각 단어에 영향을 끼치는 정도를 학습할 수 있다는 점이 장점이었다. 이처럼 이미지에도 지역적인 정보 외에도 전체 이미지 상에서 상호간의 영향을 주는 정보가 있기 때문에 이를 어텐션을 통해서 학습시킨 모델이다.
- BigGAN
딥마인드에서 개발한 모델로, SAGAN에서 일부 확장된 개념을 사용했다.
1. 절단 기법 : 훈련할때는 표준정규분포로 z를 사용하지만 샘플링에서는 절단 정규분포를 사용합니다. 절단 임곗값을 줄일수록 샘플의 신뢰도가 올라갑니다. (낮출수록 거의 동일한 이미지가 생성된다.)
2. 잠재벡터의 추가 사용 : 첫번째 층뿐만 아니라 생성자의 층마다 사용합니다.
- VQ-GAN
VQ-VAE 모델에 GAN을 붙여서 활용한 모델로, 여러가지 유형의 생성 모델을 결합하여 큰 효과를 내는 방법을 보여줬습니다. 돌이켜보면 이미지를 그려내는 접근법(잠재차원을 찾아내는 과정)에는 여러가지 방법이 있고, 이를 조합했을 때 더 쉽게 답을 찾아간다는 것을 의미하는 것 같다.
- ViT VQ-GAN
VQ-GAN의 인코더 디코더를 트랜스포머로 교체한 모델입니다.
참고 자료
2. https://medium.com/analytics-vidhya/from-gan-basic-to-stylegan2-680add7abe82