RNN / GAN / DCGAN

강민정·2023년 8월 14일

Deep Learning

목록 보기
8/8
post-thumbnail

순환신경망 - RNN(Recurrent Neural Network)

  • recurrent: 되풀이되는, 반복되는
  • Sequence Data(순차데이터) 분석을 위한 모형 : 순서가 의미가 있으며, 순서가 달라질 경우 의미가 바뀌거나 손상되는 데이터
  • 순차적인 데이터를 처리하는 데 특화된 인공신경망
  • 시계열 데이터, 자연어 처리 등에서 널리 사용되며, 이전 시간 단계의 정보를 현재 시간 단계에 반영하여 순차적인 데이터의 특성을 이해하는데 용이
  • RNN 구조
    • 여러 시간 단계(time step)에 걸쳐 동일한 뉴런(유닛)을 공유하여 이전 시간 단계의 출력값을 현재 시간 단계의 입력값으로 사용
    • 각 시간 단계마다 뉴런이 입력과 이전 상태(은닉 상태)로부터 정보를 받아 새로운 상태를 계산
    • 입력은 현재 시간 단계의 데이터이고, 이전 상태는 이전 시간 단계에서 계산된 은닉 상태
    • 현재 시간 단계에서 계산된 은닉 상태는 다음 시간 단계에서 다시 입력으로 사용되어 순환적으로 동작
  • RNN 동작방식
    1. RNN은 각 시간 단계 t에서 현재 시간 단계의 입력값 x(t)와 이전 시간 단계의 은닉 상태 h(t-1)를 입력으로 받습니다.
    2. 입력값 x(t)와 이전 시간 단계의 은닉 상태 h(t-1)를 사용하여 현재 시간 단계의 새로운 은닉 상태 h(t)를 계산합니다. 이때, 은닉 상태 h(t)는 활성화 함수(주로 tanh 또는 ReLU)를 거쳐 출력됩니다.
    3. 계산된 현재 시간 단계의 은닉 상태 h(t)는 다음 시간 단계 t+1에서의 은닉 상태 h(t+1)를 계산하는데 사용됩니다. 이와 같은 방식으로 각 시간 단계에서 순환적으로 동작하게 됩니다.
  • Simple RNN
    • Recurrent Layer의 unit(layer)은 Dense layer unit 구조에 순환(반복)의 개념이 들어간 것으로 이해할 수 있다.
    • 각 입력 데이터는 순서대로 들어오며 Node/Unit은 입력데이터와 이전 입력까지의 처리결과를 같이 입력받는다.
    • 입력 데이터에 weight를 가중합한 값과 이전입력에대한 출력 값에 weight를 가중한 값을 더해 activation을 통과한 값이 출력값이 된다. 그리고 이 값을 다음 Sequence 데이터 처리에 전달한다.
  • 장기 의존성 문제
    • 긴 시퀀스에서는 장기 의존성 문제(long-term dependencies problem)가 발생할 수 있음
    • 긴 시퀀스에서 이전 시간 단계의 정보가 점차 희석되어 제대로 반영되지 않는 문제로, 이를 해결하기 위해 LSTM(Long Short-Term Memory)과 GRU(Gated Recurrent Unit)와 같은 RNN의 변형 구조가 개발됨

GAN

  • 2014년에 Ian Goodfellow와 그의 팀이 처음으로 소개한 혁신적인 딥러닝 구조
  • GAN은 생성자(Generator)와 판별자(Discriminator) 두 개의 신경망으로 구성
  • 두 신경망은 서로 적대적인 관계를 갖고 있으며, 학습 과정에서 서로 경쟁하면서 성능을 향상시킴
  • 생성자(Generator)
    • 입력: 랜덤한 숫자로 구성된 벡터(잡음)

    • 출력: 최대한 진짜 처럼 보이는 가짜 샘플

    • 목표: 훈련 데이터셋에 있는 샘플과 구별이 불가능한 가짜 샘플만들기


    • 무작위로 생성된 잠재 벡터(latent vector)를 입력으로 받아 실제와 유사한 가짜 데이터를 생성

    • 처음에는 무작위한 생성이 이루어지지만, 학습이 진행됨에 따라 점차 현실적인 데이터를 생성하도록 개선

  • 판별자(Discriminator)
    • 입력

      1. 훈련데이터셋에 있는 진짜 샘플
      2. Generator가 생성한 가짜 샘플
    • 출력: 입력 샘플이 진짜일 예측 확률

    • 목표: 생성자가 만든 가짜 샘플과 훈련 데이터셋의 진짜 샘플을 구별하기


    • 실제 데이터와 생성자가 만든 가짜 데이터를 입력으로 받아 이를 구분

    • 이진 분류기로서, 실제 데이터인지 생성자가 만든 가짜 데이터인지 판별하는 능력

GAN 훈련

  • 진짜 같은 가짜 이미지를 만드는 것이 목적

  • 판별자(Discriminator) 훈련

    • 진짜 샘플과 Generator가 생성한 가짜 샘플을 학습한다.
  • 생성자(Generator) 훈련

    • 생성한 가짜 샘플의 Label을 진짜로 하여 학습한다.
  1. 생성자는 무작위 잠재 벡터를 입력으로 받아 가짜 데이터를 생성합니다.
  2. 판별자는 실제 데이터와 생성자가 만든 가짜 데이터를 입력으로 받아 각각을 구분하도록 학습합니다.
  3. 생성자는 자신이 만든 가짜 데이터를 실제 데이터로 판별자에게 보내서, 생성자가 만든 데이터가 실제 데이터와 비슷하도록 개선합니다.
  4. 판별자는 생성자가 만든 가짜 데이터를 실제 데이터와 구분하도록 개선합니다.
  5. 이러한 과정이 반복되면서 생성자와 판별자는 서로를 이기려고 경쟁하며 점차적으로 더 나은 성능을 갖게 됩니다.

GAN 응용

  1. 이미지 생성: GAN은 현실적인 이미지를 생성하는 데 사용됩니다. 이를 통해 예술 작품 생성, 이미지 스타일 변환 등에 응용됩니다.
  2. 음악 작곡: GAN은 음악 작곡에도 사용됩니다. 음악 생성 모델은 음악의 구조와 조율을 이해하여 새로운 음악을 생성합니다.
  3. 음성 생성: GAN은 음성 생성 분야에도 사용됩니다. 실제와 구분하기 어려운 현실적인 음성을 생성할 수 있습니다.
  4. 데이터 보강: GAN은 데이터 보강(data augmentation)에도 활용됩니다. 제한된 데이터셋에서 새로운 데이터를 생성하여 모델의 성능을 향상시킬 수 있습니다.

DCGAN

Down sampling, Up sampling

  • Down sampling
    • Convolution을 진행하면서 입력 이미지의 크기를 줄여가는 것
    • convolution의 stride나 Pooling layer를 이용해 줄인다.
  • Up sampling
    • Convolution을 진행하면서 입력 이미지의 크기를 늘려가는 것
    • 보통 convolution의 stride나 Pooling layer를 이용해 줄여진 이미지를 다시 원래 크기로 복원 시킬때 많이 사용된다.
    • tensorflow.keras.layers.UpSampling2D 사용.
    • 단순히 늘린다.
      • 크기를 늘리는 resizing을 한 뒤 빈 공간을 채운다.
    • UpSampling2D로 입력 이미지의 사이즈를 늘린 뒤 Conv2D를 연결해서 학습이 되도록 한다.
    • 하이퍼파라미터
      • size=(2,2) : 입력을 몇배로 크게 만들지 지정

Transpose Convolution

  • tensorflow.keras.layers.Conv2DTranspose 를 이용
  • parameter가 있는 Filter를 이용해 입력 이미지의 사이즈를 늘린다.
    • convolution 계산을 역으로 하는 방식을 사용한다.
  • padding을 same으로 하고 strides로 크기를 정한다.
    • size가 strides로 지정한 배수 만큼 늘어난다.

DCGAN

  • Deep Convolutional Network + GAN
  • 처음 GAN 모델은 Dense Layer를 사용했는데 이것을 Convolution Layer로 변경함.
  • DCGAN의 안정적 학습을 위한 가이드라인
    1. Convolution 레이어에 Pooling Layer를 사용하지 않는다.
    2. 안정적 학습을 위해 BatchNormalization 사용.
    3. Fully Connected Layer (Dense) 를 사용하지 않는다. (Discriminator의 출력은 예외)
    4. Generator의 Hidden Layer에는 LeakyReLU activation을 사용하고 출력 Layer는 Tanh를 사용.
    5. Discriminator의 모든 Layer는 LeakyReLU activation을 사용한다. (Discriminator의 출력은 예외)

0개의 댓글