1. 도커 설치하기:
    이건 많은 곳에서 잘 설명하고 있으므로 그걸 참조할 것
  2. host에 nvidia-driver 설치하기:
    docker위가 아니라 host에 nvidia-driver가 설치되어있어야한다
  3. 도커 이미지 받기:
    cuda는 일반적으로 docker위에 설치되지 않는다. nvidia가 제공하는 cuda가 설치된 이미지를 받아야한다. 원하는 cuda버전과 os에 따라 태그를 봐서 다운받는다. 단 base버전은 cuda를 사용만 할수있을 뿐 nvcc등이 없어서 개발이 불가능하다 꼭! devel 버전으로 받아야한다
    설치위치: https://hub.docker.com/r/nvidia/cuda/tags
  4. 도커 컨테이너 생성:
    생성할 때 --gpus all 을 해줘야 그래픽카드를 사용할 수 있다. 또한 -it 옵션을 넣어줘야 원할히 커맨드창을 사용할 수 있다.
    ex) docker create --gpus all -it --name ai-docker nvidia/cuda:12.1.0-devel-ubuntu20.04
 

https://hub.docker.com/r/nvidia/cuda/tags

 

hub.docker.com

이렇게 컨테이너를 완성하고 나면 기본적으로 root 경로일텐데 이 상태에선 문제가 여럿 발생할수있으므로 유저를추가해서 사용하는 것을 권장한다. 또한 sudo 등 많은 것이 설치 되어있지 않으므로 주의 바란다.

1. Position embedding이 다름

ViT의 경우 패치의 픽셀들을 일렬로 펼친후 Linear 레이어로 embedding을 시킨다 

Linear 레이어이기에 학습 가능한 파라미터이다 이를 통해 절대적인 주소값으로 임베딩한다

SwinTransformer의 경우 상대적인 embedding을 하는데 두 픽셀의 위치차이를 계산한다 

이를 위해 tabel을 작성해놓는다 

 

2. self-attention 범위 다름 && Shift-Window 

ViT의 경우 이미지 전체에 대한 self-attention을 진행하나

SwinTransformer의 경우 각 윈도우 내에서만 sefl-attention을 진행한다

이로인해 계산 효율성이 증대되었으며 어떻게 증대되었는지는 다음 항목에서 설명한다

또한 이 경우 윈도우 간의 관계성이 훼손되지 않나 생각할 수 있기에

SwinTransformer의 경우 Shift-Window라고 윈도우를 이동시켜서 한번 더 계산한다

 

3. 계산 효율성이 증대됨

높이가 h, 너비가 w인 이미지가 있다고 했을 때 전통적인 Transformer의 계산복잡도는 O(n^2)이므로 ViT의 계산 복잡도 또한 O((hw)^2)이다 

하지만 SwinTransformer의 경우 한 윈도우의 크기를 M 이라고 할 때 

세로에 있는 윈도우 수 H/M

가로에 있는 윈도우 수 W/M

총 윈도우 수 HW/M^2 이다

윈도우 사이즈가 M 이므로 M하나의 계산복잡도는 O(M^4)이다 그리고 이게 HW/M^2 개 있으므로 계산복잡도는 O(hw * M^2)이다 M < h, w 이므로 hw * M^2 < (hw)^2 이다 따라서 swin transformer가 ViT보다 계산복잡도가 낮다 

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

BLEU(트랜스포머 평가지표)  (2) 2024.05.02

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

+ Recent posts