1. PG GAN의 등장배경

GAN은 분명 놀라운 모델이 맞지만 몇가지 문제점이있었다

 

1. High-Resolution이미지 생성 문제

고해상도에서는 생성된 이미지가 train이미지와 다르다는 것을 판별하기가 훨씬 쉽기 때문에 고해상도 이미지를 생성하는것이 어렵다 또한 메모리 문제 때문에 더 작은배치를 줘야하고 이 때문에 학습 안정성이 떨어질 위험이 있다

 

2. Variation problem

GAN에서 generative model이 꼭 training data distribution의 전체를 표현할 이유가 없다 따라서 train data의 일부 distribution만 학습 되는 경우가 있다 이 경우 variation을 보장할 수 없다 

 

3. Mode collapse

Generator가 discriminator를 속이는데 성공한 경우 성적을 위해 속이는데 성공한 이미지만 주구장창 만드는 경우가 있다 

 

4. 학습불안정성

generated distribution과 training distribution이 겹치는 부분(overlap)가 적다면 이 두 집단을 구분하기가 너무 쉽기 때문에 분포들간의 거리를 측정할 때 gradient는 random한 방향을 가르켜 버릴 수 있다

 

2. PG GAN의 아키텍쳐와 고해상도 이미지 생성 문제에 대한 해답

고해상도 이미지 생성에 대한 문제를 위해 PGGAN은 아주 작은 4x4이미지 부터 시작해서 하나씩 층을 쌓아 1024x1024이미지에 도달하는 아키텍쳐를 구성하였다 이 방식은 고해상도 이미지를 만들면서도 안정적인 합성이 가능하며 처음 시작할 때 아주 작은 이미지로 시작하기에 훈련속도와 메모리 사용량 또한 개선되는 장점이 있다 

이 그림은 어떻게 층을 쌓아 나가는 지에 대한 설명이다

fromRGB, toRGB레이어는 1x1 Conv 레이어로서 이미지 전환을 수행한다

a에서 c로 전환되는 걸 묘사하는 그림이며 b에서 α 는 0에서 1로 증가하여 a에서 c로 전환된다

a에서 이미지는 16x16으로 진행된다 하지만 α값이 1에 가까워져가며 전환되다가 마지막에 c에와서는 32x32이미지 층이 쌓이게 된다

3. Variation Problem을 해결하기 위한 Mini-batch discrimination

앞서 말했듯 생성된 이미지가 훈련이미지의 모든 분포를 나타내도 되지 않기에 일부만 표현하여 문제가 되었다 따라서 기존에는 각 이미지에 독립적으로 discriminator가 평가하였으나 이제는 미니 배치 안의 이미지들이 얼마나 유사한지를 검사한다

 

다음은 mini-batch standard deviation layer 코드이다

def minibatch_stddev_layer(x, group_size=4):
    with tf.variable_scope('MinibatchStddev'):
        group_size = tf.minimum(group_size, tf.shape(x)[0])  # 미니배치는 group_size로 나눠 떨어져야함
        s = x.shape                                             # [NCHW]  Input shape.
        y = tf.reshape(x, [group_size, -1, s[1], s[2], s[3]])   # [GMCHW] group_size로 쪼갠다
        y = tf.cast(y, tf.float32)                              # [GMCHW] Cast to FP32.
        y -= tf.reduce_mean(y, axis=0, keepdims=True)           # [GMCHW] 평균을 빼준다
        y = tf.reduce_mean(tf.square(y), axis=0)                # [MCHW]  분산 계산
        y = tf.sqrt(y + 1e-8)                                   # [MCHW]  표준편차 계산 1e-8은 수식안정화용도
        y = tf.reduce_mean(y, axis=[1,2,3], keepdims=True)      # [M111]  fmaps and pixels의 평균 구하기
        y = tf.cast(y, x.dtype)                                 # [M111]  원래 타입으로 다시 cast
        y = tf.tile(y, [group_size, 1, s[2], s[3]])             # [N1HW]  Replicate over group and pixels.
        return tf.concat([x, y], axis=1)                        # [NCHW]  새로운 fmap Append

 

4. Normalization in Generator and Discriminator

GAN은 두 모델간의 과도한 경쟁으로 인해 신호크기가 증가하기 쉽다 따라서 이를 방지하기 위해 주로 BatchNormalization을 써왔으나 GAN은 이미지를 다루기에 batch를 크게 주기 어렵고 이 방식은 직접적인 방법이 아니기에 PGGAN에서는 다른 방식을 활용하였다

4-1. Equalized Learning Rate

batch size가 작기 때문에 BatchNormalization을 쓰기 어렵고 따라서 initilization이 중요하다

이 논문에서는 정규분포(평균0, 표준편차1)로 initalize하고 학습중에는 각 레이어마다 He's initilizer로 얻어지는 normalization constant(c)를 통해 동적으로 scaling한다 

4-2. Pixelwise Feature Vector Normalization in Generator

generator에서 매 conv layer 후에 feature맵을 정규화 합니다 

b는 다음 feature map, a는 이전 feature map, N은 feature map의 개수이다

따라서 Pixel 단위로 normlization을 수행한다 

 

5. 결론

위와 같은 해결책을 통해서 그간 GAN이 갖고 있는 문제들을 상당수 해결하였다 하지만 여전히 특성들이 entangle하다는 점 즉 하나의 특성을 바꾸면 다른 특성도 같이 바뀌는 문제등이 있다 이는 다음 포스팅인 styleGAN에서 해결될 예정이다

'AI > GAN' 카테고리의 다른 글

GAN  (0) 2024.05.09

논문 출처 : https://arxiv.org/pdf/1406.2661

1. 이름이 GAN인 이유

GAN은 Generative Adversarial Nets의 약자로서 적대적생성 네트워크이다

이러한 이유가 붙은 이유는 GAN은 두 모델의 경쟁으로 인해 학습하는 녀석이기 때문이다

 

GAN에는 두 모델이 존재한다 하나는 가짜 이미지를 생성하는 Generative model이고 다른 하나는 가짜인지 진짜인지 판별해내는 Discriminative model이다

간단하게 Generative model을 G, Discriminative model을 D라 부르겠다

G는 학습을 통해 D를 속일 수 있는 이미지를 만드는 것을 목표로 한다

D는 학습을 통해 G의 이미지를 걸러 내는 것을 목표로한다

이렇게 적대적인 관계로서 경쟁하며 학습하기에 이 모델의 이름이 GAN이다 

 

2. 어떻게 경쟁하는가 

서로 경쟁하는 관계를 수식으로 나타내면 위와 같다

E는 조건을 만족하면 1이고 만족하지 못하면 0이다 따라서 첫항의 의미는 x가 Pdata(x)즉 실제 이미지에 해당하면 1이며

둘째항의 의미는 z가 Pz(z) 즉 노이즈에 해당하면 1이란 의미이다

G(z)는 G가 만들어낸 그림을 의미하고 D(x)는 x가 진짜일 확률 이다

앞부분 log D(x) 는 실제 이미지에 대한 판별기의 판단 확률을 의미하고

뒷부분 log(1-D(G(z)))는 G가 생성한 이미지에 대한 판별기의 판단확률을 의미한다

 

보다시피 G는 V(D,G)를 최소로 만드려하고 D는 최대로 만드려한다

만일 D의 성능이 최대라면 logD(x) = log 1 = 0이 되며 log(1-D(G(z))) = log (1-0) = 0 이되어 0이 최대이며 0에 가까울수록 좋다는 것을 알 수 있다

반대로 G의 성능이 최대라면 lod D(x)항은 G의 성능과 무관하므로 넘어가고 log(1 - D(G(z))) = log( 1-1) = -inf 가 되어 V(D,G)의 값이 작을 수록 좋다는 것을 알 수 있다

 

3. GAN의 장단점

우선 장점은 학습에 있어 역전파만이 필요하며 마르코프 체인(과거와 현재의 상태를 보고 미래를 예측할수있는 상태)이 필요하지 않으며 학습에 추론이 필요하지 않다 또한 매우 선명한 분포를 지닐 수 있다는 점이다

반면에 단점은 생성된 데이터의 분포를 확실하게 표현하는 것이 없다는 것과 학습할때 G와 D가 균등해야하는 점이다 만일 G가 D에 비해 과도하게 학습된다면 충분한 다양성을 지닐 수 없는 'Helvetica scenario'에 빠질 수 있다 

 

또한 논문에서 제공되는 예시를 보면 mnist같이 상당히 해상도가 낮은 사진들을 예시로 삼았음을 볼수 있는데 이는 GAN이 높은 해상도의 이미지에 대해서는 약한 모습을 보이기 때문이다 이를 극복하는 것은 다음 포스팅인 PGGAN에서 극복할 것이다

 

참조

GAN 논문리뷰 https://velog.io/@minkyu4506/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0GANGenerative-Adversarial-Nets-%EB%A6%AC%EB%B7%B0

 

[논문리뷰]GAN(Generative Adversarial Nets) 리뷰

안녕하세요. 밍기뉴와제제입니다. 이번에는 GAN을 리뷰해보겠습니다.

velog.io

https://velog.io/@nochesita/%ED%99%95%EB%A5%A0%ED%86%B5%EA%B3%84-%EB%A7%88%EB%A5%B4%EC%BD%94%ED%94%84-%EC%B2%B4%EC%9D%B8-Markov-Chain

 

[확률/통계] 마르코프 체인 Markov Chain

오늘의 나는 과거의 내가 만든 것

velog.io

 

'AI > GAN' 카테고리의 다른 글

Progressive Growing of GAN  (0) 2024.05.10

 

자연어 처리의 결과를 평가하기 위해서 크게 2가지의 평가 지표가 있다 하나는 ROUGE지표이고 다른 하나는 BLEU지표이다

 

1. 맞춘 단어 개수로 측정

ROUGE는 정답문장에 예측한 단어가 몇 개가 있는지 평가하는 것이고

BLEU는 예측문장에 정답 단어가 몇 개가 있는지 평가하는 것이다

 

예를 들어

정답문장 : "He did his homework before having dinner"

예측문장 : "I did his homework yesterday"

ROUGE = 3/7 ,

BLEU = 3/5 이다

 

하지만 번역에서는 정답이 하나만 있는 것이 아니다 따라서 정답 문장이 여러개 존재할 수 있으며 BLUE를 기준으로 설명하자면 모든 정답 문장중 어느 한곳에라도 포함된 단어라면 정답으로 인정한다

 

2. 중복 제거하기

하지만 이 방식은 문제가 있다 아래의 문장을 보자

정답문장 : "He did his homework before having dinner"

예측문장 : "did did did did"

 

어처구니 없는 번역이지만 모든 단어가 정답문장에 포함되므로 위의 BLEU지표는 4/4 이다 

따라서 우리는 중복을 제거해야할 필요가 있다

 

따라서 중복된 단어가 있을 경우 정답으로 인정해주는 최대 개수는 정답문장에서 해당 단어가 등장하는 횟수로 보정한다

이에 따라 보정된 값은 1/4 이다 

 

3. 순서 고려하기

하지만 여전히 문제가 남아있다 아래의 문장을 보자

정답문장 : "He did his homework before having dinner"

예측문장 : "having did his homework  dinner before he"

 

상당히 틀렸음에도 BLEU지표는 5/5이다 순서가 고려되지 않았기 때문이다

따라서 2개씩, 3개씩 묶어서 평가해보자 2개씩 묶어보면 다음과 같다

정답문장 분해: "He did" "did his" "his homework" "homework before" "befre having" "having dinner"

예측문장 분해: "having did" "did his" "his homework" "homework dinner" "dinner before" "before he"

 

이제 BLEU 지표는 2/6이고 좀 더 나아졌다

 

4. 길이 고려하기

이번 문제는 짧은 문장에 대한 문제이다

정답문장 : "He did his homework before having dinner"

예측문장 : "He did"

 

1개씩 보더라도 2개씩 보더라도 평가지표는 1/1, 2/2 이다 하지만 우리는 이것이 잘못된 번역임을 안다 따라서 짧은 문장에 해단 패널티를 주어야한다 긴 문장에 대한 패널티를 주지 않는 이유는 더 길단 이야기는 정답이 아닌 단어가 더 들어가 있단 것이고(중복이 고려되기에 정답문장보다 많은 정답단어는 존재할수없다) 따라서 굳이 패널티를 따로 주지 않더라도 더 긴 문장은 점수가 낮아진다

 

부여할 패널티는 다음과 같다 

  • 예측문장 길이가 정답문장보다 같거나 길다면 1 * BLEU
  • 예측문장 길이(c)가 정답문장길이(r)보다 짧다면 exp(1-r / c) * BLEU

5. 최종 BLEU

c 는 예측문장의 길이, r은 정답문장의 길이이다

N은 순서를 고려하기 위해 묶을 최대 단어의 개수이다 N=3이라면 1단어묶음, 2단어묶음, 3단어묶음을 전부 계산하여 더한다

wₙ 은 가중치를 의미한다 1단어일 때, 2단어일 때 반영 비율을 조정할 수 있다

pₙ 은 중복을 고려하여 단어를 센 개수이다

 

참고 링크

https://wikidocs.net/31695

 

14-03 BLEU Score(Bilingual Evaluation Understudy Score)

앞서 언어 모델(Language Model)의 성능 측정을 위한 평가 방법으로 펄플렉서티(perplexity, PPL)를 소개한 바 있습니다. 기계 번역기에도 PPL을 평가에 사…

wikidocs.net

https://jrc-park.tistory.com/273

 

BLEU Score의 소개와 계산하는 방법 (Python)

Last Updated on July 23, 2021 Bilingual Evaluation Understudy (BLEU) 딥러닝의 발달로 텍스트를 생성하는 Generative Model은 챗봇, 문서 요약등 다양한 분야에서 사용되고 있습니다. Generated Sentence를 평가하는 방식

jrc-park.tistory.com

 

+ Recent posts